suno-api

简介: suno-api


从远处看,每个人都显得格外善良。——李璐璐

这个项目

https://github.com/gcui-art/suno-api/

可以用 API 调用 suno.ai 的音乐生成 AI,并且可以轻松集成到 GPTs 等 agent 中

文档:

https://suno.gcui.art/

本地运行

git clone https://github.com/gcui-art/suno-api.git
cd suno-apinpm install

或者,你也可以使用 Docker Compose

docker compose build && docker compose up

3. 配置 suno-api

  • 如果部署到了 Vercel,请在 Vercel 后台,添加环境变量 SUNO_COOKIE,值为第一步获取的 cookie。
  • 如果在本地运行,请在 .env 文件中添加:
SUNO_COOKIE=<your-cookie>

4. 运行 suno api

  • 如果部署到了 Vercel:
  • 请在 Vercel 后台,点击 Deploy,等待部署成功。
  • 访问 https://<vercel分配的域名>/api/get_limit API 进行测试
  • 如果在本地运行:
  • 请运行 npm run dev
  • 访问 http://localhost:3000/api/get_limit API 进行测试
  • 如果返回以下结果:
{  "credits_left": 0,  "period": "string",  "monthly_limit": 0,  "monthly_usage": 0
}

则已经正常运行。

5. 使用 Suno API

你可以在 suno.gcui.art查看详细的 API 文档,并在线测试。

API 说明

Suno 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`: 获取配额信息

详细文档请查看演示站点: suno.gcui.art/docs

API 集成代码示例

Python

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 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 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();
相关文章
|
2月前
|
缓存 边缘计算 监控
阿里云 CDN 服务平台功能介绍:缓存策略、回源配置、防盗链鉴权与 SDK 实操完整手册
互联网业务当中,网站页面、图片、JS、CSS、音视频、APP 安装包等静态资源,是用户访问消耗带宽最多的部分。如果全部请求直接打到源站服务器,会带来一系列棘手问题。当用户分布在全国各地,不同地域的用户访问源站,网络链路距离远,页面加载缓慢;业务遭遇流量突增、大促活动时,源站带宽瞬间打满,直接造成网站卡顿甚至无法访问;大量外网访问会消耗高额的源站外网带宽成本;同时源站服务器需要同时承接动态业务逻辑与静态文件下载,CPU、带宽、IO 资源被大量占用,动态接口服务质量受到拖累。
302 0
|
3月前
|
缓存 边缘计算 网络协议
阿里云CDN对接使用完全指南:从入门配置到API自动化运维
本文提供了一份完整的阿里云CDN对接使用指南。首先介绍CDN加速原理与开通服务流程,新用户可享受免费流量额度。接着详细讲解添加加速域名、配置源站信息、完成CNAME解析等核心步骤,这是启用CDN服务的最后一步。在高级配置方面,深入探讨缓存过期时间策略、刷新预热机制、回源协议与SNI配置、HTTPS证书部署等关键技术点。同时提供Python SDK调用示例,展示如何通过编程方式管理刷新预热任务。在安全管理上,介绍Referer防盗链、URL鉴权和WAF集成方案。最后解析按流量计费与资源包选购策略,帮助读者在保障加速效果的同时有效控制成本。全文配以代码示例和配置截图说明,适合从零开始接入阿里云CD
|
5月前
|
运维 网络协议 数据可视化
在线Ping全解析:零门槛搞定网络诊断,小白也能轻松上手
在数字化时代,在线Ping是零门槛网络诊断工具:无需安装、不需专业知识,浏览器输入网址即可秒测延迟与丢包。依托多节点云端探测,支持ICMP/TCP/Pv6,兼具可视化报告与DNS、Traceroute等拓展功能,助力个人排障与企业运维,让网络健康一目了然。(239字)
1370 2
|
6月前
|
人工智能 运维 安全
基于端侧 AI 与云边协同的电力智能巡检解决方案实践
电力巡检面临人工依赖高、效率低、安全风险大、数据难闭环等痛点。本方案基于云-边-端协同架构,融合端侧轻量化AI、多模态感知与弱网适配技术,打造工业级AR智能安全帽,实现变电站、输电线路等场景的智能识别、实时预警、全程追溯与安全管控,助力电网数字化升级。
1258 0
基于端侧 AI 与云边协同的电力智能巡检解决方案实践
|
弹性计算 关系型数据库 对象存储
阿里云国际实名账号vs 非实名账号:如何选择更适合你的方案?
阿里云国际站提供实名与非实名账号选择,实名账号可购买中国大陆云产品,适合需国内业务合规的企业;非实名账号适用于海外部署,无需备案,灵活便捷。根据业务需求选择,助力全球化部署。
|
人工智能 自然语言处理 PyTorch
InspireMusic:阿里通义实验室开源的音乐生成模型,支持文本或音频生成多种风格的音乐
阿里通义实验室开源的音乐生成技术,支持通过简单描述快速生成多种风格的高质量音乐作品。
3209 4
|
人工智能 大数据 Swift
AI进乐队了,还要不要人写歌了?——聊聊AI在音乐创作里的那些事儿
AI进乐队了,还要不要人写歌了?——聊聊AI在音乐创作里的那些事儿
1007 5
|
11月前
|
机器学习/深度学习 人工智能 前端开发
终端里的 AI 编程助手:OpenCode 使用指南
OpenCode 是开源的终端 AI 编码助手,支持 Claude、GPT-4 等模型,可在命令行完成代码编写、Bug 修复、项目重构。提供原生终端界面和上下文感知能力,适合全栈开发者和终端用户使用。
61455 11
|
10月前
|
存储 安全 API
【剪映小助手】保存剪映草稿
保存剪映草稿。该接口用于保存当前的草稿状态,确保编辑的内容得到持久化存储。通常在完成一系列编辑操作后调用此接口,以防止编辑内容丢失。
1038 0