Используйте API для генерации музыки через Suno.ai и с лёгкостью интегрируйте его в агенты, такие как GPT.
👉 Мы обновляемся быстро, пожалуйста, поставьте звёздочку.
English | 简体中文 | русский | Демо | Документация | Развёртывание на Vercel
🔥 Посмотрите мой новый проект: ReadPo — 10-кратное ускорение чтения и печатания
Suno — потрясающий сервис для ИИ-музыки. Несмотря на отстутствие официального API, мы не могли дождаться, чтобы интегрировать его возможности где-нибудь.
Мы узнали, что у других пользователей есть схожие потребности, поэтому решили выложить этот проект в открытый доступ, надеясь, что он вам понравится.
Данная реализация использует платный сервис 2Captcha (a.k.a. ruCaptcha) для автоматического решения капч hCaptcha и не использует какие-либо готовые реализации API Suno с закрытым исходным кодом.
Мы опубликовали пример, привязанный к бесплатному аккаунту, так что имеются дневные лимиты, но вы всё равно можете посмотреть, как оно работает: suno.gcui.ai
- Идеально реализует API suno.ai.
- Автоматическое поддержание сессии аккаунта.
- Автоматическое решение капч через ruCaptcha и Playwright с патчами rebrowser-patches.
- Совместим с форматом API OpenAI
/v1/chat/completions
. - Поддержка пользовательского текста песни.
- Развёртывание в один клик через Vercel и Docker.
- В дополнение к стандартному API, он также адаптируется к схеме API агентских платформ, таких как GPT и Coze, поэтому вы можете использовать его как инструмент/плагин/действие для LLM и интегрировать его в любой AI-агент.
- Разрешительная лицензия с открытым исходным кодом, позволяющая свободно интегрировать и модифицировать.
- Зайдите на suno.com/create.
- Откройте консоль браузера: нажмите
F12
или откройте инструменты разработчика. - Перейдите на вкладку
Сеть
(Network
). - Перезагрузите страницу.
- Найдите запрос, адрес которого содержит
client?__clerk_api_version
. - Нажмите на него и перейдите на вкладку
Заголовки
(Header
). - Найдите заголовок
Cookie
, нажмите ПКМ по нему и скопируйте его значение.
2Captcha — это платный сервис для решения капч, использующий реальных работников для этого и обладающий высокой точностью. Он необходим из-за того, что Suno постоянно запрашивает решение hCaptcha, что невозможно за бесплатно каким-либо автоматическим способом.
Создайте новый аккаунт, пополните баланс и получите свой API-ключ.
Note
Если вы находитесь в России или Беларуси, используйте интерфейс ruCaptcha вместо 2Captcha. Это абсолютно тот же сервис, но данный интерфейс поддерживает платежи из этих стран.
Tip
Если вы хотите получать как можно меньше капч, рекомендуется использовать macOS. Системы на macOS обычно получают меньше капч, чем Linux и Windows — это связано с их непопулярностью в сфере веб-скрейпинга. Запуск suno-api на Windows и Linux будет работать, но в некоторых случаях вы можете получить довольно большое количество капч.
Вы можете выбрать свой предпочитаемый способ запуска:
git clone https://github.com/gcui-art/suno-api.git
cd suno-api
npm install
Important
Аппаратное видеоускорение браузера будет отключено в Docker. Если у вас медленный процессор, рекомендуется развернуть локально. Также можно использовать Docker Compose, однако перед запуском выполните шаг ниже.
docker compose build && docker compose up
-
Если вы используете Vercel, настройте переменные среды в панели управления Vercel.
-
Если вы установили suno-api локально, добавьте следующее в ваш
.env
-файл:
SUNO_COOKIE
— заголовокCookie
, который вы скопировали ещё в первом шаге.TWOCAPTCHA_KEY
— ваш API-ключ 2Captcha из второго шага.BROWSER
— название браузера, который будет использоваться для решения капч. Поддерживаются толькоchromium
иfirefox
.BROWSER_GHOST_CURSOR
— использовать ли ghost-cursor-playwright для симуляции плавных движений мышкой. Обратите внимание, что это, похоже, никак не влияет на появление капч, так что вы можете спокойно установить значениеfalse
.BROWSER_LOCALE
— язык браузера. Рекомендуется использовать либоen
, либоru
, т. к. данные языки имеют больше всего работников на 2Captcha. Список поддерживаемых языковBROWSER_HEADLESS
— запускать ли браузер без отдельного окна. Скорее всего, вам надо установить значениеtrue
.
SUNO_COOKIE=<…>
TWOCAPTCHA_KEY=<…>
BROWSER=chromium
BROWSER_GHOST_CURSOR=false
BROWSER_LOCALE=en
BROWSER_HEADLESS=true
- Если вы используете Vercel:
- Нажмите на кнопку
Deploy
в панели Vercel и дождитесь успеха. - Посетите API
https://<присовенный-домен-vercel>/api/get_limit
для тестирования.
- Нажмите на кнопку
- Если вы установили проект локально:
- Выполните
npm run dev
. - Посетите API
http://localhost:3000/api/get_limit
для тестирования.
- Выполните
- Если вернулся следующий результат:
{
"credits_left": 50,
"period": "day",
"monthly_limit": 50,
"monthly_usage": 50
}
то программа работает корректно.
Вы можете посмотреть документацию suno-api здесь: suno.gcui.ai/docs
На данный момент suno-api реализует следующие API:
- `/api/generate`: Сгенерировать музыку
- `/v1/chat/completions`: Сгенерировать музыку - Вызов API в формате OpenAI.
- `/api/custom_generate`: Сгенерировать музыку (Custom Mode, поддержка ручного текста песни, стиля музыки, названия и т. д.)
- `/api/generate_lyrics`: Сгенерировать текст песни на основе промпта
- `/api/get`: Получить информацию песни по ID. Перечисляйте несколько ID через запятую.
Если ID не предоставлен, то отобразятся все песни.
- `/api/get_limit`: Получить лимиты на сегодня
- `/api/extend_audio`: Расширить длину песни
- `/api/generate_stems`: Создать стем-треки (отдельную звуковую и музыкальную дорожку)
- `/api/get_aligned_lyrics`: Получить список временных меток для каждого слова в тексте песни
- `/api/clip`: Получить информацию о клипе на основе идентификатора, переданного в качестве параметра запроса `id`.
- `/api/concat`: Сгенерировать всю песню из расширений
Вы также можете указать куки в заголовок Cookie
вашего запроса, переопределяя дефолтные куки в переменной среды SUNO_COOKIE
. Это удобно, например, когда вы хотите использовать несколько бесплатных аккаунтов одновременно.
Для более подробной документации посетите демо-сайт: suno.gcui.ai/docs
import time
import requests
# замените на URL-адрес вашего suno-api
base_url = 'http://localhost:3000'
def custom_generate_audio(payload):
url = f"{base_url}/api/custom_generate"
response = requests.post(url, json=payload, headers={'Content-Type': 'application/json'})
return response.json()
def extend_audio(payload):
url = f"{base_url}/api/extend_audio"
response = requests.post(url, json=payload, headers={'Content-Type': 'application/json'})
return response.json()
def generate_audio_by_prompt(payload):
url = f"{base_url}/api/generate"
response = requests.post(url, json=payload, headers={'Content-Type': 'application/json'})
return response.json()
def get_audio_information(audio_ids):
url = f"{base_url}/api/get?ids={audio_ids}"
response = requests.get(url)
return response.json()
def get_quota_information():
url = f"{base_url}/api/get_limit"
response = requests.get(url)
return response.json()
def get_clip(clip_id):
url = f"{base_url}/api/clip?id={clip_id}"
response = requests.get(url)
return response.json()
def generate_whole_song(clip_id):
payload = {"clip_id": clip_id}
url = f"{base_url}/api/concat"
response = requests.post(url, json=payload)
return response.json()
if __name__ == '__main__':
data = generate_audio_by_prompt({
"prompt": "Популярная хэви-метал песня о войне, исполненная глубоким мужским голосом, медленно и мелодично. В тексте изображена печаль людей после войны.",
"make_instrumental": False,
"wait_audio": False
})
ids = f"{data[0]['id']},{data[1]['id']}"
print(f"ids: {ids}")
for _ in range(60):
data = get_audio_information(ids)
if data[0]["status"] == 'streaming':
print(f"{data[0]['id']} ==> {data[0]['audio_url']}")
print(f"{data[1]['id']} ==> {data[1]['audio_url']}")
break
# sleep 5s
time.sleep(5)
const axios = require("axios");
// замените на URL-адрес вашего suno-api
const baseUrl = "http://localhost:3000";
async function customGenerateAudio(payload) {
const url = `${baseUrl}/api/custom_generate`;
const response = await axios.post(url, payload, {
headers: { "Content-Type": "application/json" },
});
return response.data;
}
async function generateAudioByPrompt(payload) {
const url = `${baseUrl}/api/generate`;
const response = await axios.post(url, payload, {
headers: { "Content-Type": "application/json" },
});
return response.data;
}
async function extendAudio(payload) {
const url = `${baseUrl}/api/extend_audio`;
const response = await axios.post(url, payload, {
headers: { "Content-Type": "application/json" },
});
return response.data;
}
async function getAudioInformation(audioIds) {
const url = `${baseUrl}/api/get?ids=${audioIds}`;
const response = await axios.get(url);
return response.data;
}
async function getQuotaInformation() {
const url = `${baseUrl}/api/get_limit`;
const response = await axios.get(url);
return response.data;
}
async function getClipInformation(clipId) {
const url = `${baseUrl}/api/clip?id=${clipId}`;
const response = await axios.get(url);
return response.data;
}
async function main() {
const data = await generateAudioByPrompt({
prompt:
"Популярная хэви-метал песня о войне, исполненная глубоким мужским голосом, медленно и мелодично. В тексте изображена печаль людей после войны.",
make_instrumental: false,
wait_audio: false,
});
const ids = `${data[0].id},${data[1].id}`;
console.log(`ids: ${ids}`);
for (let i = 0; i < 60; i++) {
const data = await getAudioInformation(ids);
if (data[0].status === "streaming") {
console.log(`${data[0].id} ==> ${data[0].audio_url}`);
console.log(`${data[1].id} ==> ${data[1].audio_url}`);
break;
}
// sleep 5s
await new Promise((resolve) => setTimeout(resolve, 5000));
}
}
main();
Вы можете интегрировать Suno AI как инструмент/плагин/действие в ваш ИИ-агент.
[скоро...]
[скоро...]
[скоро...]
Вы можете поддержать этот проект четырьмя способами:
- Fork и публикация pull request'ов: мы приветствуем любые PR, которые улучшают данный проект. Вы также можете помочь простым переводом этого README на ваш язык.
- Создавайте issue: мы ценим разумные предложения и сообщения об ошибках.
- Пожертвование: если этот проект помог вам, угостите нас кофе, воспользовавшись кнопкой «Sponsor» в верхней части проекта. Спасибо! ☕
- Распространяйте информацию: порекомендуйте этот проект другим, поставьте звезду в репо или добавьте обратную ссылку после использования проекта.
Мы используем Issues на GitHub для обратной связи. Не стестняйтесь создавать issue, мы оперативно решим вашу проблему.
Лицензия данного проекта — LGPL-3.0 или более поздняя версия. Для большей информации см. LICENSE.
- Репозиторий проекта: github.com/gcui-art/suno-api
- Официальный сайт Suno.ai: suno.ai
- Демо: suno.gcui.ai
- Readpo: ReadPo — это помощник для чтения и письма, работающий на основе искусственного интеллекта. Собирайте, курируйте и создавайте контент с молниеносной скоростью.
- Album AI: Автоматическое создание метаданных изображения и общение с альбомом. RAG + Альбом.
suno-api — это неофициальный проект с открытым исходным кодом, предназначенный только для учебных и исследовательских целей.