问答社区
使用API来调用太阳能的音乐代AI.AI,并容易地将它集成到像GTPS这样的代理。
分类:插件安装
简介:
Suno.ai v3 是一个令人惊叹的 AI 音乐服务,虽然官方还没有开放 API,但我们已经迫不及待的想在某些地方集成它的能力。 我们发现有一些用户也有类似需求,于是我们将这个项目开源了,希望你们喜欢。
模拟的:
我们部署了一个示例,绑定了一个免费的 suno 账号,所以它每天有使用限制,但你可以看到它运行起来的样子: 太阳组织。
特点
- 2008年4月nt1日nt至12月31日
- 自动保持账号活跃
- 兼容 OpenAI 的
/v1/chat/completions
会计师协会 - 支持定制模式
- 一英部到苏维塞尔
- 除了标准 API,还适配了 GPTs、coze 等 Agent 平台的 API Schema,所以你可以把它当做一个 LLM 的工具/插件/Action,集成到任意 AI Agent 中。
- 宽松的开源协议,你可以随意的集成和修改。
如何开始使用?
1. 获取你的 app.suno.ai 账号的 cookie
- 浏览器访问 大赦国际
- 打开浏览器的控制台:按下
F12
或者开发者工具
- 选择
网络
标签 - 刷新页面
- 找到包含
client?_clerk_js_version
关键词的请求 - 点击并切换到
Header
标签 - 找到
Cookie
部分,鼠标复制 Cookie 的值
2. 克隆并部署本项目
你可以选择自己喜欢的部署方式:
https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fgcui-art%2Fsuno-api&env=SUNO_COOKIE&project-name=suno-api&repository-name=suno-api
git clone https://github.com/gcui-art/suno-api.git
cd suno-api
npm install
或者,你也可以使用 多克尔组合
docker compose build && docker compose up
3. 配置 suno-api
- 如果部署到了 Vercel,请在 Vercel 后台,添加环境变量
SUNO_COOKIE
,值为第一步获取的 cookie。 - 如果在本地运行,请在 .env 文件中添加:
SUNO_COOKIE=<your-cookie>
4.运行的苏诺空气污染指数
- 如果部署到了 Vercel:
- 请在 Vercel 后台,点击
Deploy
,等待部署成功。 - 访问
https://<vercel分配的域名>/api/get_limit
API进路测试
- 请在 Vercel 后台,点击
- 如果在本地运行:
- 请运行
npm run dev
- 访问
http://localhost:3000/api/get_limit
API进路测试
- 请运行
- 如果返回以下结果:
{
"credits_left": 0,
"period": "string",
"monthly_limit": 0,
"monthly_usage": 0
}
则已经正常运行。
5.使用苏诺空气污染指数
你可以在 太阳组织。 查看详细的 API 文档,并在线测试。
API说明
以下宣传资料:
- `/api/generate`: 创建音乐
- `/v1/chat/completions`: 创建音乐 - 用OpenAI API 兼容的格式调用 generate API
- `/api/custom_generate`: 创建音乐(自定义模式,支持设置歌词、音乐风格、设置标题等)
- `/api/generate_lyrics`: 根据Prompt创建歌词
- `/api/get`: 根据id获取音乐信息。获取多个请用","分隔,不传ids则返回所有音乐
- `/api/get_limit`: 获取配额信息
- `/api/extend_audio`: 在一首音乐的基础上,扩展音乐长度
- `/api/clip`: 检索特定音乐的信息
- `/api/concat`: 合并音乐,将扩展后的音乐和原始音乐合并
详细文档请查看演示站点: 大赦国际/文件
亚太农业投资中心
巨蛇
import time
import requests
# replace your vercel domain
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()
if __name__ == '__main__':
data = generate_audio_by_prompt({
"prompt": "A popular heavy metal song about war, sung by a deep-voiced male singer, slowly and melodiously. The lyrics depict the sorrow of people after the war.",
"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)
JS:
const axios = require("axios");
// replace your vercel domain
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 main() {
const data = await generateAudioByPrompt({
prompt:
"A popular heavy metal song about war, sung by a deep-voiced male singer, slowly and melodiously. The lyrics depict the sorrow of people after the war.",
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();
集成到到常见的自定义 Agent 中
你可以把 suno ai 当做一个 工具/插件/Action 集成到你的 AI Agent 中。
集成到GTP:[coming soon...] 集成到科兹:[coming soon...];集成器到朗链:[coming soon...]
贡献指南+您有四种方式支持本项目:
- Fork 项目并提交 PR:我们欢迎任何让这个组件和Editor变的更好的PR。
- 提交Issue:我们欢迎任何合理的建议、bug反馈。
- 捐赠:在项目的顶部我们放置了 Sponsor 按钮,如果这个项目帮助到了您,你可以请我们喝一杯,干杯☕。
- 推荐:向其他人推荐本项目;点击Star;使用本项目后放置外链。
许可证:
LGPL-3.0 或更高版本
你有一个问题/建议/困难/Bug?
我们使用Github的Issue来管理这些反馈,你可以提交一个。我们会经常来处理。