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();
相关文章
|
10月前
|
人工智能 自然语言处理 PyTorch
InspireMusic:阿里通义实验室开源的音乐生成模型,支持文本或音频生成多种风格的音乐
阿里通义实验室开源的音乐生成技术,支持通过简单描述快速生成多种风格的高质量音乐作品。
1762 4
|
人工智能 前端开发 API
OpenAI 12天发布会内容全纪录!一文快速回顾获知亮点信息,原文附发布会中文字幕视频
OpenAI 于12月5日宣布将举行为期12天的系列发布活动,期间每天发布一个产品或样品,包括备受期待的AI视频生成工具Sora和新的推理模型。本文将介绍这12天的发布会每日的发布内容和相关亮点信息。
835 82
|
人工智能 数据挖掘 BI
高效解决排班难题,从手动到自动的全流程升级
在现代企业中,排班管理是人力资源的重要组成部分,涉及合理分配工作、满足业务需求、提升员工满意度及合规性与成本控制等多个方面。传统手动排班因变量多、效率低等问题,难以满足需求。智能排班工具如板栗看板、Deputy、Zoho People、Humanity 和 Shiftboard 的出现,通过自动化和智能化手段,有效解决了这些难题,提升了排班的效率和准确性。选择合适的工具,可以显著提高HR工作的效能,实现事半功倍的效果。
987 13
高效解决排班难题,从手动到自动的全流程升级
|
人工智能 新制造 芯片
2024年中国AI大模型产业发展报告解读
2024年,中国AI大模型产业迎来蓬勃发展,成为科技和经济增长的新引擎。本文解读《2024年中国AI大模型产业发展报告》,探讨产业发展背景、现状、挑战与未来趋势。技术进步显著,应用广泛,但算力瓶颈、资源消耗和训练数据不足仍是主要挑战。未来,云侧与端侧模型分化、通用与专用模型并存、大模型开源和芯片技术升级将是主要发展方向。
|
自然语言处理 语音技术 开发者
ChatTTS超真实自然的语音合成模型
ChatTTS超真实自然的语音合成模型
517 3
|
弹性计算
阿里云备案流程和操作步骤详解(图文教程)
以下是内容摘要: 本文指导了阿里云账号注册、实名认证及服务器购买流程,并详细阐述了域名注册与备案步骤。首先,需注册阿里云账号并完成个人或企业实名认证,然后选购服务器。接着,进行域名注册与实名认证。备案阶段,用户需在阿里云备案系统中填写相关信息,包括主体信息、网站信息,并上传相关证件照片。提交备案后,系统将进行审核,用户可通过阿里云ICP代备案平台查看进度。整个过程需确保联系方式畅通,以便接收审核通知。
|
开发框架 .NET Java
【Source Insight】工具入门到精通
【Source Insight】工具入门到精通
1094 0
|
存储 搜索推荐 Java
深入了解桶排序:原理、性能分析与 Java 实现
桶排序(Bucket Sort)是一种排序算法,通常用于将一组数据分割成有限数量的桶(或容器),然后对每个桶中的数据进行排序,最后将这些桶按顺序合并以得到排好序的数据集。
441 1
深入了解桶排序:原理、性能分析与 Java 实现
|
移动开发 人工智能 文字识别
uniapp 前端实现文字识别,身份证识别,营业执照识别 (兼容APP、H5、小程序 不需要任何SDK)
本文将介绍如何使用uniapp和百度AI开放平台的OCR(光学字符识别)API实现身份证、营业执照等卡证的识别和文字识别功能。以上就是uniapp使用百度AI平台OCR API实现卡证识别和文字识别的整体实现过程全部内容了,有不懂的,或者我代码有误的地方,希望大家多多交流。具体详细代码示例可以私信问我要哈!
1460 0
|
缓存 移动开发 JavaScript
阿里云OSS设置跨域访问
阿里云OSS设置跨域访问
18685 1