【模型接入】Suno
Suno AI,简称 Suno,是一款生成式人工智能音乐创作程序,旨在产生人声与乐器相结合的逼真歌曲。2023 年 12 月 20 日,Suno AI 在推出网络应用程序并与微软建立合作关系后,开始广泛使用。
项目当前通过中转调用 Suno,没有直接对接 Suno 官方 API:Suno 官方 API 目前面向筛选的合作伙伴开放,需要提交申请并等待官方回复。所以不少开源项目和应用,都是借助中转接入 Suno 的,例如说兼容 New API (opens new window) 协议的中转。
友情提示:
API 密钥、音乐模型、定时任务的配置,以及创作功能的使用,可见 《AI 音乐生成》 文档。本文只介绍 Suno 的申请方式、中转的接口与 Java 调用。
# 1. 申请方式
# 1.1 官方申请
Suno 官方的 API 目前通过合作申请的方式开放,首批是筛选合作方:
① 通过 Suno 官方发布的 Developer API 公告 (opens new window),进入 申请表单 (opens new window),登记自己的产品和用途,然后等待官方回复。表单共 6 题,第 1 题填写公司名、官网、总部国家、公司规模、联系人、邮箱,第 2 题填写产品和 API 用途。
② 如果表单打不开,可以通过 Suno 帮助中心 (opens new window) 公布的官方客服,询问最新的申请渠道。
注意:
Suno API 管理平台 (opens new window) 目前只提供登录(支持关联 Google 或邮箱验证码),没有公开的 REST 接口文档,它也不是 API 的请求地址。所以项目暂未对接 Suno 官方 API。
# 1.2 中转方式
项目当前使用 Suno 中转:在中转渠道获取 Suno 的密钥,然后在 [AI 大模型 -> 控制台 -> API 密钥] 菜单填写密钥和中转的根地址,再在 [AI 大模型 -> 控制台 -> 模型配置] 菜单新增「音乐」类型的模型即可,具体可见 《AI 音乐生成》 的「1. 前置准备」小节。模型表的字段(包括模型简介 description、模型图标 icon_url),见 《功能开启》 的「4.2 模型表」小节。
目前已实测的中转渠道如下:
| 渠道 | 自定义 API URL | 模型标识 | 已实测范围 |
|---|---|---|---|
| InfAI (opens new window) | https://infai.cc | chirp-v6 | 通过芋道完成生成、查询、转存,浏览器可正常播放 |
| SalpX (opens new window) | https://www.salpx.com | V6 | 通过芋道完成生成、查询、转存,浏览器可正常播放 |
| apimax (opens new window) | https://api.apimax.ai | suno_music | 灵感模式纯音乐的生成、查询,见「2. 中转协议」的 apimax 示例 |
续写、合并、上传等扩展能力,是否可用以各渠道的支持为准,暂未实测。也可以替换为其它符合「2. 中转协议」的 Suno 中转,例如说兼容 New API (opens new window) 的渠道。
# 2. 中转协议
请求地址为“API 密钥”里配置的中转根地址 + 下面的路径,使用 Authorization: Bearer 密钥 鉴权。
| 路径 | 说明 | 是否必须 |
|---|---|---|
POST /suno/submit/music | 提交生成(灵感、自定义)、续写,返回任务编号 | 必须 |
POST /suno/fetch | 按多个任务编号批量查询进度和歌曲 | 必须 |
POST /suno/submit/concat | 合并:把续写作品与原曲合并成完整歌曲 | 扩展,用到合并时需要 |
POST /suno/uploads/audio-url | 上传:由中转拉取音频地址,生成可续写的歌曲 | 扩展,用到上传时需要 |
扩展路径不是 New API 官方 SunoAPI 插件的标准路径,需要渠道额外提供。具体支持的路径、模型版本、价格,以渠道最新文档为准。
apimax 示例:
apimax (opens new window) 的 /suno/submit/music 无法提交生成(返回 HTTP 400),所以中转根地址为 https://api.apimax.ai 时,SunoApi 做了如下适配:
- 生成(灵感、自定义):改走其原生接口
POST /v1/music/generations,模型标识填写其默认模型suno_music。已实测灵感模式的纯音乐;自定义模式只验证了本地的请求参数转换(无歌词的纯音乐,会把音乐风格作为描述传给prompt),暂未实测 - 查询:仍走
POST /suno/fetch,已实测(上述灵感模式纯音乐的任务) - 续写、合并、上传:仍走上表的原路径,是否可用取决于渠道能力,暂未在 apimax 实测
其它中转渠道不受影响,都走上表的原路径。
# 3. Java 调用
Spring AI 没有集成 Suno,所以 yudao-module-ai 模块的 framework/ai/core/model/suno/api 包下,实现了 SunoApi 类,提供如下方法:
#submitMusic(MusicRequest request):对应/suno/submit/music(apimax 的生成对应/v1/music/generations),返回任务编号#submitConcat(String clipId):对应/suno/submit/concat,返回任务编号#uploadAudioUrl(String url):对应/suno/uploads/audio-url,返回任务编号#fetchTasks(Collection<String> taskIds):对应/suno/fetch,返回任务及其歌曲(Clip)列表
获取 SunoApi 对象时,通过 AiModelService 的 #getSunoApi(apiKey) 方法,传入 [AI 大模型 -> 控制台 -> API 密钥] 里配置的密钥即可。例如说:
SunoApi sunoApi = modelService.getSunoApi(apiKeyService.validateApiKey(keyId));
// 提交:灵感模式的纯音乐(true)。示例密钥的自定义 API URL 为 https://api.apimax.ai,模型标识为 suno_music;其它渠道按渠道文档设置
String taskId = sunoApi.submitMusic(new SunoApi.MusicRequest(
"一首关于夏天海边的轻快纯音乐", null, null, null, "suno_music", true, null, null, null));
// 查询:Suno 生成是异步的,需要轮询
List<SunoApi.Task> tasks = sunoApi.fetchTasks(Collections.singletonList(taskId));
项目中的完整用法,可见 AiMusicServiceImpl 类;SunoApiTests 里也有对应的测试用例,可以参考。