Install
openclaw skills install miaoyin-ai-music妙音AI 音乐创作助手,生成歌曲、查询任务、续写音乐、生成歌词。当用户需要 AI 作曲或音乐生成时调用。
openclaw skills install miaoyin-ai-music通过 HTTP REST API 调用音乐生成服务。
设置环境变量 MIAOYIN_API_TOKEN:
export MIAOYIN_API_TOKEN=your-token$env:MIAOYIN_API_TOKEN="your-token"set MIAOYIN_API_TOKEN=your-token-e MIAOYIN_API_TOKEN=your-tokenMIAOYIN_API_TOKEN=your-token⚠️ 任何能设置环境变量的方式都可以,不依赖特定平台。
对话示例:
Base URL: https://ai.growingth.com/api
请求方法: POST(所有接口统一使用 POST)
认证 Header: api-token: ${MIAOYIN_API_TOKEN}
格式: JSON
编码: UTF-8(请求体必须使用 UTF-8 编码,中文直接传入)
网络: 自动使用系统代理(HTTP_PROXY/HTTPS_PROXY)
超时: 默认 30 秒,查询任务状态可延长至 60 秒
⚠️ 所有接口统一使用以下格式:
{
"name": "操作名称",
"data": {
// 具体请求参数
}
}
Header 示例:
{
"api-token": "Your API Token",
"Content-Type": "application/json; charset=utf-8"
}
⚠️ 注意:
https://ai.growingth.com/apiname 字段指定(也可以写在 query 参数上)data 对象中api-token Header,不是 Authorization在调用任何 API 之前,请在心中默念:
我有 MIAOYIN_API_TOKEN 吗? → 没有:引导用户获取,不要尝试调用 API
用户的要求能用现有 API 实现吗? → 不能:直接说"抱歉,当前不支持此功能",不要编造
我知道每个参数的含义和必填性吗? → 不确定:查阅 API 文档,不要猜测
我准备好处理可能的错误了吗? → 没有:先阅读"错误处理流程"章节
任何一项为"否",都不要继续调用 API。
| 错误类型 | 提示语 |
|---|---|
| 余额不足 | "❌ 余额不足\n\n您当前的余额不足,无法继续创作。\n请访问 https://ai.growingth.com/api-service 进行额度购买。" |
| 未获取Token | "❌ 未配置 API Token\n\n您当前尚未获得凭证(token)。\n请前往 https://ai.growingth.com/api-service 创建获取,以开始您的创作。\n\n🎁 创建后您将获得 10 首歌的免费体验额度!" |
| 版权保护 | "❌ 转换失败\n\n该音频与现有作品匹配,触发了版权保护机制,无法转换为 WAV 格式。\n\n建议:尝试转换其他原创歌曲。" |
| 401/403 | "API Token 无效或已过期,请检查 MIAOYIN_API_TOKEN 配置" |
| 5xx | "请求服务器异常,请稍后重试" |
| 超时 | "请求超时,请稍后重试" |
| 网络错误 | "网络连接失败,请检查网络或代理设置" |
⚠️ 禁止使用其他表述,禁止添加"可能原因"、"建议检查"等额外内容。
根据 API 返回的错误信息,按以下优先级判断错误类型:
任何 HTTP 请求失败时,除了展示上述用户友好的提示外,还必须输出详细的技术日志供排查问题。
=== 错误详情 ===
请求:POST https://ai.growingth.com/api
操作:{{操作名称}}
状态码:{{状态码}}
错误:{{错误信息}}
--- 请求头 ---
Content-Type: application/json
api-token: ********
--- 请求体 ---
{
"name": "{{操作名称}}",
"data": { ... }
}
--- 响应头 ---
{{响应头信息}}
--- 响应体 ---
{{响应体内容}}
api-token: xxx → api-token: ********MIAOYIN_API_TOKEN 环境变量的完整值 → ********如果 API 响应包含未预期的字段,原样展示,不要报错。
用途:用户想创作/生成音乐时调用。
请求地址:
POST https://ai.growingth.com/api/song/proxy?name=generateCustom
Headers:
{
"api-token": "${MIAOYIN_API_TOKEN}",
"Content-Type": "application/json; charset=utf-8"
}
请求体结构:
{
"data": {
"prompt": "歌词内容",
"tags": "歌曲风格,如 Chinese, Piano, Guitar",
"negative_tags": "排除风格(可选)",
"model": "chirp-v5",
"desc": "描述信息(可选)",
"title": "歌曲标题(可选)",
"make_instrumental": false
}
}
data 字段说明:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| prompt | String | ✅ 是 | 歌词内容 |
| tags | String | ❌ 否 | 歌曲风格,如 Chinese, Piano, Guitar |
| negative_tags | String | ❌ 否 | 排除风格 |
| model | String | ❌ 否 | 模型版本:chirp-v5-5, chirp-v5, chirp-v4-5, chirp-v4, chirp-v3-5,默认 chirp-v5 |
| desc | String | ❌ 否 | 描述信息 |
| title | String | ❌ 否 | 歌曲标题 |
| make_instrumental | Boolean | ❌ 否 | 是否纯音乐,默认 false |
响应示例:
{
"status": "Success",
"message": "请求成功",
"data": [
{
"taskId": "c13975cda17449da2261"
}
]
}
响应字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
| status | String | 请求状态:Success / Error |
| message | String | 响应消息 |
| data | Array | 任务数据数组 |
| data[].taskId | String | 任务编号,用于后续查询 |
当用户表达 [生成歌曲] [创作音乐] [写首歌] [做首曲子] 等意图时:
步骤 1:确认需求
IF 用户提供了歌词:
prompt = 用户提供的完整歌词
ELSE IF 用户描述了音乐风格(如"夏天的流行歌"):
prompt = 用户的描述
tags = 根据描述提取风格标签
ELSE:
询问用户:"请提供歌词,或描述您想要的音乐风格(例如:帮我生成一首关于夏天的流行歌曲)"
→ 停止,等待用户回复
步骤 2:构建请求
POST https://ai.growingth.com/api/song/proxy?name=generateCustom
Headers:
api-token: ${MIAOYIN_API_TOKEN}
Content-Type: application/json; charset=utf-8
请求体:
{
"data": {
"prompt": "步骤 1 中确定的歌词或描述",
"tags": "用户指定的风格(可选)",
"title": "用户指定的标题(可选)",
"model": "chirp-v5",
"make_instrumental": 用户要求纯音乐则为 true,否则为 false
}
}
步骤 3:发送请求并处理响应
IF response.status == "Success":
taskId = response.data[0].taskId
说:"✅ 提交成功!任务编号:{taskId},正在生成中,请稍候..."
→ 转到查询任务状态流程(待补充)
ELSE:
说:"❌ 生成失败:{response.message}"
→ 转到 "错误处理流程"
用户:我想用这首歌词生成音乐:
[Verse]
阳光洒在海面
微风吹拂着脸
[Chorus]
这是我们的夏天
永远不变的画面
AI: 收到!我将用您提供的歌词生成音乐。
[执行:POST https://ai.growingth.com/api/song/proxy?name=generateCustom]
[请求体] {
"data": {
"prompt": "[Verse]\n阳光洒在海面\n微风吹拂着脸\n\n[Chorus]\n这是我们的夏天\n永远不变的画面",
"model": "chirp-v5"
}
}
✅ 提交成功!任务编号:c13975cda17449da2261,正在生成中,请稍候...
用户:帮我生成一首关于夏天的流行歌曲,要有钢琴和吉他
AI: 好的,我来帮您创作一首夏天主题的流行歌曲。
[执行:POST https://ai.growingth.com/api/song/proxy?name=generateCustom]
[请求体] {
"data": {
"prompt": "关于夏天的流行歌曲",
"tags": "Piano, Guitar",
"model": "chirp-v5"
}
}
✅ 提交成功!任务编号:c13975cda17449da2261,正在生成中,请稍候...
用户:生成一首中国风的纯音乐
AI: 好的,我来为您创作一首中国风纯音乐。
[执行:POST https://ai.growingth.com/api/song/proxy?name=generateCustom]
[请求体] {
"data": {
"prompt": "中国风纯音乐",
"tags": "Chinese",
"model": "chirp-v5",
"make_instrumental": true
}
}
✅ 提交成功!任务编号:c13975cda17449da2261,正在生成中,请稍候...
编码要求
模型版本选择
chirp-v5风格标签(tags)
任务编号保存
用途:查询生成进度和结果。
⚠️ 重要警告:请勿过于频繁调用此接口,建议查询间隔不低于 10 秒,否则可能会被禁用。
请求地址:
POST https://ai.growingth.com/api/song/proxy?name=getMusic
Headers:
{
"api-token": "${MIAOYIN_API_TOKEN}",
"Content-Type": "application/json; charset=utf-8"
}
请求体结构:
{
"data": {
"ids": "c13975cda17449da2261,0e66d6dd-7a55-4cd3-bc03-2ea11324ce3f"
}
}
data 字段说明:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| ids | String | ✅ 是 | 歌曲 id 列表(也可以是 taskId),以英文逗号分隔多个 |
响应示例:
{
"status": "Success",
"message": "请求成功",
"data": [
{
"id": "0e66d6dd-7a55-4cd3-bc03-2ea11324ce3f",
"title": "Through the Fog",
"image_url": "https://cdn2.suno.ai/image_0e66d6dd-7a55-4cd3-bc03-2ea11324ce3f.jpeg",
"lyric": "[Instrumental]",
"audio_url": "https://cdn1.suno.ai/0e66d6dd-7a55-4cd3-bc03-2ea11324ce3f.mp3",
"video_url": "https://cdn1.suno.ai/0e66d6dd-7a55-4cd3-bc03-2ea11324ce3f.mp4",
"created_at": "2024-08-30T07:46:22.206Z",
"model_name": "chirp-v4",
"status": "complete"
}
]
}
响应字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
| status | String | 请求状态:Success / Error |
| message | String | 响应消息 |
| data | Array | 歌曲数据数组 |
| data[].id | String | 歌曲唯一标识 |
| data[].title | String | 歌曲标题 |
| data[].image_url | String | 封面图片链接 |
| data[].lyric | String | 歌词内容 |
| data[].audio_url | String | 音频播放链接 |
| data[].video_url | String | 视频播放链接 |
| data[].created_at | String | 创建时间 |
| data[].model_name | String | 使用的模型名称 |
| data[].status | String | 生成状态:complete(完成)/ processing(处理中)/ queued(排队中)/ failed(失败) |
当需要查询歌曲状态时(生成后自动查询 / 用户主动询问):
步骤 1:确定要查询的任务编号
IF 是刚生成的任务:
taskId = 上一步生成歌曲返回的 taskId
ELSE IF 用户提供了编号(如"查一下 c13975cda17449da2261 的状态"):
taskId = 用户提供的编号
ELSE IF 用户说"刚才的歌/最近的任务":
taskId = 最近一次提交的任务编号(需要从上下文记忆)
ELSE:
询问用户:"请问要查询哪个任务?请提供任务编号"
→ 停止,等待用户回复
步骤 2:构建请求
POST https://ai.growingth.com/api/song/proxy?name=getMusic
Headers:
api-token: ${MIAOYIN_API_TOKEN}
Content-Type: application/json; charset=utf-8
请求体:
{
"data": {
"ids": taskId
}
}
步骤 3:发送请求并处理响应
IF response.status == "Success":
FOR EACH song IN response.data:
status = song.status
IF status == "complete":
展示:
🎵 歌曲名:{song.title}
🎼 歌词:{song.lyric}
▶️ 音频播放:{song.audio_url} | 下载:{song.audio_url}
🎬 视频播放:{song.video_url} | 下载:{song.video_url}
🖼️ 封面图片:{song.image_url}
📅 创建时间:{song.created_at}
🤖 模型:{song.model_name}
ELSE IF status == "processing" 或 "queued":
说:
⏳ 音乐还在生成中,当前状态:{status}
请您过 10 秒以上再问我"好了吗",我会继续为您查询。
→ 停止,不要再调用 API
ELSE IF status == "failed":
说:
❌ 生成失败
任务编号:{song.id}
→ 停止,不要重试
ELSE:
说:
⚠️ 未知状态:{status}
ELSE:
说:"❌ 查询失败:{response.message}"
→ 转到 "错误处理流程"
用户:帮我生成一首关于夏天的流行歌曲
AI: [执行:POST https://ai.growingth.com/api/song/proxy?name=generateCustom]
✅ 提交成功!任务编号:c13975cda17449da2261,正在生成中,请稍候...
[等待 10 秒后执行:POST https://ai.growingth.com/api/song/proxy?name=getMusic]
[请求体] {
"data": {
"ids": "c13975cda17449da2261"
}
}
🎵 生成完成!
歌曲名:夏日微风
歌曲id:1231465
🎼 歌词:
[Verse]
阳光洒在海面
微风吹拂着脸
...
▶️ 音频播放:https://cdn1.suno.ai/c13975cda17449da2261.mp3 | 下载:https://cdn1.suno.ai/c13975cda17449da2261.mp3
🎬 视频播放:https://cdn1.suno.ai/c13975cda17449da2261.mp4 | 下载:https://cdn1.suno.ai/c13975cda17449da2261.mp4
🖼️ 封面图片:https://cdn2.suno.ai/image_c13975cda17449da2261.jpeg
用户:刚才那首歌好了吗
AI: [执行:POST https://ai.growingth.com/api/song/proxy?name=getMusic]
[请求体] {
"data": {
"ids": "c13975cda17449da2261"
}
}
⏳ 音乐还在生成中,当前状态:processing
请您过 10 秒以上再问我"好了吗",我会继续为您查询。
用户:帮我查一下这三个任务的状态:c13975cda17449da2261,0e66d6dd-7a55-4cd3-bc03-2ea11324ce3f,d57dba20-e63d-4c99-ab43-9469d2944f9f
AI: [执行:POST https://ai.growingth.com/api/song/proxy?name=getMusic]
[请求体] {
"data": {
"ids": "c13975cda17449da2261,0e66d6dd-7a55-4cd3-bc03-2ea11324ce3f,d57dba20-e63d-4c99-ab43-9469d2944f9f"
}
}
任务 1:✅ 已完成
歌曲名:夏日微风
▶️ 播放:https://cdn1.suno.ai/c13975cda17449da2261.mp3 | 下载:https://cdn1.suno.ai/c13975cda17449da2261.mp3
任务 2:✅ 已完成
歌曲名:Through the Fog
▶️ 播放:https://cdn1.suno.ai/0e66d6dd-7a55-4cd3-bc03-2ea11324ce3f.mp3 | 下载:https://cdn1.suno.ai/0e66d6dd-7a55-4cd3-bc03-2ea11324ce3f.mp3
任务 3:⏳ 生成中(processing)
请稍后再问
查询频率限制(非常重要)
轮询限制(必须严格遵守)
状态处理优先级
complete → 立即展示播放链接和完整信息
failed → 展示失败信息,不要重试
processing/queued → 告知用户稍后再问(至少 10 秒),然后停止
歌词展示
批量查询
用途:如果歌曲效果不错,但时长不足,可通过此接口进行续写。
请求地址:
POST https://ai.growingth.com/api/song/proxy?name=generateContinue
Headers:
{
"api-token": "${MIAOYIN_API_TOKEN}",
"Content-Type": "application/json; charset=utf-8"
}
请求体结构:
{
"data": {
"audio_id": "歌曲 clipId",
"continue_clip_id": "歌曲 clipId",
"continue_at": 7,
"prompt": "歌词内容(可选)",
"tags": "歌曲风格(可选)",
"negative_tags": "排除风格(可选)",
"model": "chirp-v5",
"desc": "描述信息(可选)",
"title": "歌曲标题(可选)",
"make_instrumental": false
}
}
data 字段说明:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| audio_id | String | ✅ 是 | 续写歌曲的 clipId |
| continue_clip_id | String | ✅ 是 | 续写歌曲的 clipId(与 audio_id 相同) |
| continue_at | Number | ✅ 是 | 续写时间点,单位秒 |
| prompt | String | ❌ 否 | 歌词内容 |
| tags | String | ❌ 否 | 歌曲风格,如 Chinese, Piano, Guitar |
| negative_tags | String | ❌ 否 | 排除风格 |
| model | String | ❌ 否 | 模型版本:chirp-v5, chirp-v4-5, chirp-v4, chirp-v3-5,默认 chirp-v5 |
| desc | String | ❌ 否 | 描述信息 |
| title | String | ❌ 否 | 歌曲标题 |
| make_instrumental | Boolean | ❌ 否 | 是否纯音乐,默认 false |
响应示例:
{
"status": "Success",
"message": "请求成功",
"data": [
{
"taskId": "xxx"
}
]
}
响应字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
| status | String | 请求状态:Success / Error |
| message | String | 响应消息 |
| data | Array | 任务数据数组 |
| data[].taskId | String | 任务编号,用于后续查询 |
当用户表达 [续写] [继续创作] [延长歌曲] [接着写] 等意图时:
步骤 1:确认续写需求
IF 用户提供了歌曲 ID 和续写时间点:
audio_id = 用户提供的歌曲 ID
continue_at = 用户指定的时间点(秒)
ELSE IF 用户提供了歌曲 ID 但未指定时间点:
audio_id = 用户提供的歌曲 ID
询问用户:"请问从第几秒开始续写?(例如:从第 7 秒开始)"
→ 停止,等待用户回复
ELSE IF 用户说"续写刚才的歌":
audio_id = 最近一次生成的歌曲 ID(从查询结果中获取)
询问用户:"请问从第几秒开始续写?(例如:从第 7 秒开始)"
→ 停止,等待用户回复
ELSE:
询问用户:"请提供要续写的歌曲 ID 和续写时间点(例如:续写歌曲 xxx,从第 7 秒开始)"
→ 停止,等待用户回复
步骤 2:构建请求
POST https://ai.growingth.com/api/song/proxy?name=generateContinue
Headers:
api-token: ${MIAOYIN_API_TOKEN}
Content-Type: application/json; charset=utf-8
请求体:
{
"data": {
"audio_id": audio_id,
"continue_clip_id": audio_id,
"continue_at": continue_at, // 必须明确指定续写时间点(秒)
"prompt": "用户指定的歌词(可选)",
"tags": "用户指定的风格(可选)",
"model": "chirp-v5", // 固定使用 chirp-v5 模型
"make_instrumental": 用户要求纯音乐则为 true,否则为 false
}
}
步骤 3:发送请求并处理响应
IF response.status == "Success":
taskId = response.data[0].taskId
说:"✅ 续写提交成功!任务编号:{taskId},正在生成中,请稍候..."
→ 转到 API 2 查询任务状态流程
ELSE:
说:"❌ 续写失败:{response.message}"
→ 转到 "错误处理流程"
用户:帮我续写歌曲 0e66d6dd-7a55-4cd3-bc03-2ea11324ce3f,从第 7 秒开始
AI: 好的,我将从第 7 秒开始续写这首歌曲。
[执行:POST https://ai.growingth.com/api/song/proxy?name=generateContinue]
[请求体] {
"data": {
"audio_id": "0e66d6dd-7a55-4cd3-bc03-2ea11324ce3f",
"continue_clip_id": "0e66d6dd-7a55-4cd3-bc03-2ea11324ce3f",
"continue_at": 7,
"model": "chirp-v5"
}
}
✅ 续写提交成功!任务编号:d57dba20-e63d-4c99-ab43-9469d2944f9f,正在生成中,请稍候...
用户:续写刚才那首歌
AI: 请问从第几秒开始续写?(例如:从第 7 秒开始)
用户:从第 10 秒开始
AI: 好的,我将从第 10 秒开始续写。
[执行:POST https://ai.growingth.com/api/song/proxy?name=generateContinue]
[请求体] {
"data": {
"audio_id": "c13975cda17449da2261",
"continue_clip_id": "c13975cda17449da2261",
"continue_at": 10,
"model": "chirp-v5"
}
}
✅ 续写提交成功!任务编号:xxx,正在生成中,请稍候...
用户:续写歌曲 0e66d6dd,从第 10 秒开始,加上这段歌词:
[Bridge]
时光流转不停
回忆永远鲜明
AI: 好的,我将从第 10 秒开始续写,并使用您提供的歌词。
[执行:POST https://ai.growingth.com/api/song/proxy?name=generateContinue]
[请求体] {
"data": {
"audio_id": "0e66d6dd-7a55-4cd3-bc03-2ea11324ce3f",
"continue_clip_id": "0e66d6dd-7a55-4cd3-bc03-2ea11324ce3f",
"continue_at": 10,
"prompt": "[Bridge]\n时光流转不停\n回忆永远鲜明",
"model": "chirp-v5"
}
}
✅ 续写提交成功!任务编号:xxx,正在生成中,请稍候...
歌曲 ID 获取
id 就是 clipId续写时间点(continue_at)
audio_id 和 continue_clip_id
续写后的查询
模型版本
用途:在保持主旋律的前提下,对歌曲进行翻唱改编或提升音质。
请求地址:
POST https://ai.growingth.com/api/song/proxy?name=generateCover
Headers:
{
"api-token": "${MIAOYIN_API_TOKEN}",
"Content-Type": "application/json; charset=utf-8"
}
请求体结构:
{
"data": {
"continue_clip_id": "歌曲 clipId",
"prompt": "歌词内容(可选)",
"tags": "歌曲风格(可选)",
"negative_tags": "排除风格(可选)",
"model": "chirp-v5",
"title": "歌曲标题(可选)",
"make_instrumental": false,
"persona_id": "音色 persona_clip_id(可选)",
"artist_clip_id": "音色 root_clip_id(可选)"
}
}
data 字段说明:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| continue_clip_id | String | ✅ 是 | 需要翻唱的歌曲 clipId |
| prompt | String | ❌ 否 | 歌词内容 |
| tags | String | ❌ 否 | 歌曲风格,如 Chinese, Piano, Guitar |
| negative_tags | String | ❌ 否 | 排除风格 |
| model | String | ❌ 否 | 模型版本:chirp-v5, chirp-v4-5, chirp-v4, chirp-v3-5,默认 chirp-v5 |
| title | String | ❌ 否 | 歌曲标题 |
| make_instrumental | Boolean | ❌ 否 | 是否纯音乐,默认 false |
| persona_id | String | ❌ 否 | 音色参数(通过 makePersona 任务获取的 persona_clip_id) |
| artist_clip_id | String | ❌ 否 | 音色参数(通过 makePersona 任务获取的 root_clip_id) |
响应示例:
{
"status": "Success",
"message": "请求成功",
"data": [
{
"taskId": "xxx"
}
]
}
响应字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
| status | String | 请求状态:Success / Error |
| message | String | 响应消息 |
| data | Array | 任务数据数组 |
| data[].taskId | String | 任务编号,用于后续查询 |
当用户表达 [翻唱] [改编] [Cover] [换个风格] [提升音质] 等意图时:
步骤 1:确认翻唱需求
IF 用户提供了歌曲 ID:
continue_clip_id = 用户提供的歌曲 ID
ELSE IF 用户说"翻唱刚才的歌":
continue_clip_id = 最近一次生成的歌曲 ID(从查询结果中获取)
ELSE:
询问用户:"请提供要翻唱的歌曲 ID"
→ 停止,等待用户回复
可选确认:
- tags = 用户指定的新风格
- prompt = 用户指定的新歌词
- persona_id / artist_clip_id = 用户指定的音色参数
步骤 2:构建请求
POST https://ai.growingth.com/api/song/proxy?name=generateCover
Headers:
api-token: ${MIAOYIN_API_TOKEN}
Content-Type: application/json; charset=utf-8
请求体:
{
"data": {
"continue_clip_id": continue_clip_id,
"prompt": "用户指定的歌词(可选)",
"tags": "用户指定的风格(可选)",
"model": "chirp-v5",
"title": "用户指定的标题(可选)",
"make_instrumental": 用户要求纯音乐则为 true,否则为 false
}
}
步骤 3:发送请求并处理响应
IF response.status == "Success":
taskId = response.data[0].taskId
说:"✅ 翻唱提交成功!任务编号:{taskId},正在生成中,请稍候..."
→ 转到 API 2 查询任务状态流程
ELSE:
说:"❌ 翻唱失败:{response.message}"
→ 转到 "错误处理流程"
用户:帮我翻唱歌曲 0e66d6dd-7a55-4cd3-bc03-2ea11324ce3f
AI: 好的,我将为您翻唱这首歌曲。
[执行:POST https://ai.growingth.com/api/song/proxy?name=generateCover]
[请求体] {
"data": {
"continue_clip_id": "0e66d6dd-7a55-4cd3-bc03-2ea11324ce3f",
"model": "chirp-v5"
}
}
✅ 翻唱提交成功!任务编号:xxx,正在生成中,请稍候...
用户:把刚才那首歌改成爵士风格
AI: 好的,我将把这首歌改编成爵士风格。
[执行:POST https://ai.growingth.com/api/song/proxy?name=generateCover]
[请求体] {
"data": {
"continue_clip_id": "c13975cda17449da2261",
"tags": "Jazz",
"model": "chirp-v5"
}
}
✅ 翻唱提交成功!任务编号:xxx,正在生成中,请稍候...
用户:翻唱歌曲 0e66d6dd,用这段新歌词:
[Verse]
夜色温柔如水
星光点点相随
AI: 好的,我将使用新歌词翻唱这首歌。
[执行:POST https://ai.growingth.com/api/song/proxy?name=generateCover]
[请求体] {
"data": {
"continue_clip_id": "0e66d6dd-7a55-4cd3-bc03-2ea11324ce3f",
"prompt": "[Verse]\n夜色温柔如水\n星光点点相随",
"model": "chirp-v5"
}
}
✅ 翻唱提交成功!任务编号:xxx,正在生成中,请稍候...
歌曲 ID 获取
id 就是 clipId翻唱与原创的区别
音色参数(高级功能)
persona_id 和 artist_clip_id 用于指定特定音色翻唱后的查询
推荐使用场景
用途:续写歌曲生成后,通过此接口将续写片段与父歌曲合并成完整歌曲。
请求地址:
POST https://ai.growingth.com/api/song/proxy?name=concat
Headers:
{
"api-token": "${MIAOYIN_API_TOKEN}",
"Content-Type": "application/json; charset=utf-8"
}
请求体结构:
{
"data": {
"clip_id": "1c51baab-5085-4e2e-a1d8-c6a103a55488"
}
}
data 字段说明:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| clip_id | String | ✅ 是 | 续写歌曲的 id(通过 API 3 续写后生成的歌曲 id) |
响应示例:
{
"status": "Success",
"message": "请求成功",
"data": [
{
"taskId": "xxx"
}
]
}
响应字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
| status | String | 请求状态:Success / Error |
| message | String | 响应消息 |
| data | Array | 任务数据数组 |
| data[].taskId | String | 任务编号,用于后续查询 |
当用户表达 [合并] [拼接] [合成完整歌曲] 等意图时:
步骤 1:确认合并需求
IF 用户提供了续写歌曲的 ID:
clip_id = 用户提供的续写歌曲 ID
ELSE IF 用户说"合并刚才续写的歌":
clip_id = 最近一次续写生成的歌曲 ID(从 API 3 的响应中获取)
ELSE:
询问用户:"请提供要合并的续写歌曲 ID"
→ 停止,等待用户回复
步骤 2:构建请求
POST https://ai.growingth.com/api/song/proxy?name=concat
Headers:
api-token: ${MIAOYIN_API_TOKEN}
Content-Type: application/json; charset=utf-8
请求体:
{
"data": {
"clip_id": clip_id
}
}
步骤 3:发送请求并处理响应
IF response.status == "Success":
taskId = response.data[0].taskId
说:"✅ 合并提交成功!任务编号:{taskId},正在处理中,请稍候..."
→ 转到 API 2 查询任务状态流程
ELSE:
说:"❌ 合并失败:{response.message}"
→ 转到 "错误处理流程"
用户:帮我续写歌曲 0e66d6dd,从第 7 秒开始
AI: [执行:POST https://ai.growingth.com/api/song/proxy?name=generateContinue]
✅ 续写提交成功!任务编号:1c51baab-5085-4e2e-a1d8-c6a103a55488,正在生成中...
[等待生成完成后]
🎵 续写完成!
用户:把续写的部分和原歌曲合并
AI: 好的,我将把续写片段与原歌曲合并成完整歌曲。
[执行:POST https://ai.growingth.com/api/song/proxy?name=concat]
[请求体] {
"data": {
"clip_id": "1c51baab-5085-4e2e-a1d8-c6a103a55488"
}
}
✅ 合并提交成功!任务编号:xxx,正在处理中,请稍候...
用户:合并续写歌曲 1c51baab-5085-4e2e-a1d8-c6a103a55488
AI: 好的,我将合并这首续写歌曲。
[执行:POST https://ai.growingth.com/api/song/proxy?name=concat]
[请求体] {
"data": {
"clip_id": "1c51baab-5085-4e2e-a1d8-c6a103a55488"
}
}
✅ 合并提交成功!任务编号:xxx,正在处理中,请稍候...
[等待 10 秒后查询]
🎵 合并完成!
歌曲名:夏日微风(完整版)
▶️ 音频播放:https://cdn1.suno.ai/xxx.mp3 | 下载:https://cdn1.suno.ai/xxx.mp3
用户:续写刚才那首歌,然后合并成完整版
AI: 好的,我先为您续写歌曲。
[执行:POST https://ai.growingth.com/api/song/proxy?name=generateContinue]
✅ 续写提交成功!任务编号:1c51baab,正在生成中...
[等待生成完成]
🎵 续写完成!现在开始合并...
[执行:POST https://ai.growingth.com/api/song/proxy?name=concat]
[请求体] {
"data": {
"clip_id": "1c51baab-5085-4e2e-a1d8-c6a103a55488"
}
}
✅ 合并提交成功!正在处理中...
[等待合并完成]
🎵 合并完成!完整歌曲已生成。
▶️ 音频播放:https://cdn1.suno.ai/xxx.mp3 | 下载:https://cdn1.suno.ai/xxx.mp3
合并前提条件
clip_id 获取
合并结果
推荐工作流程
1. 生成原歌曲(API 1)
2. 续写歌曲(API 3)
3. 查询续写状态(API 2)确认完成
4. 合并歌曲(API 5)
5. 查询合并结果(API 2)
合并后的查询
用途:为已生成的歌曲创建视频。
请求地址:
POST https://ai.growingth.com/api/song/proxy?name=generateVideo
Headers:
{
"api-token": "${MIAOYIN_API_TOKEN}",
"Content-Type": "application/json; charset=utf-8"
}
请求体结构:
{
"data": {
"title": "歌曲标题",
"clip_id": "需生成视频的 clip id"
}
}
data 字段说明:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| title | String | ✅ 是 | 歌曲标题 |
| clip_id | String | ✅ 是 | 需生成视频的歌曲 clip id |
响应示例:
{
"status": "Success",
"message": "请求成功",
"data": {
"taskId": "MBENVP5DFKOSPJHO"
}
}
响应字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
| status | String | 请求状态:Success / Error |
| message | String | 响应消息 |
| data | Object | 任务数据对象 |
| data.taskId | String | 任务编号,用于后续查询 |
当用户表达 [生成视频] [创建视频] [做个视频] [视频版] 等意图时:
步骤 1:确认视频生成需求
IF 用户提供了歌曲 ID:
clip_id = 用户提供的歌曲 ID
ELSE IF 用户说"给刚才的歌生成视频":
clip_id = 最近一次生成的歌曲 ID(从查询结果中获取)
ELSE:
询问用户:"请提供要生成视频的歌曲 ID"
→ 停止,等待用户回复
获取歌曲标题:
IF 已知歌曲标题(从之前的查询结果中):
title = 已知的歌曲标题
ELSE:
先调用 API 2 查询歌曲信息,获取标题
步骤 2:构建请求
POST https://ai.growingth.com/api/song/proxy?name=generateVideo
Headers:
api-token: ${MIAOYIN_API_TOKEN}
Content-Type: application/json; charset=utf-8
请求体:
{
"data": {
"title": title,
"clip_id": clip_id
}
}
步骤 3:发送请求并处理响应
IF response.status == "Success":
taskId = response.data.taskId
说:"✅ 视频生成提交成功!任务编号:{taskId},正在生成中,请稍候..."
→ 转到 API 2 查询任务状态流程
ELSE:
说:"❌ 视频生成失败:{response.message}"
→ 转到 "错误处理流程"
用户:帮我给歌曲 0e66d6dd-7a55-4cd3-bc03-2ea11324ce3f 生成视频
AI: 好的,我先查询一下这首歌的信息。
[执行:POST https://ai.growingth.com/api/song/proxy?name=getMusic]
[请求体] {
"data": {
"ids": "0e66d6dd-7a55-4cd3-bc03-2ea11324ce3f"
}
}
查询到歌曲:Through the Fog
现在开始生成视频...
[执行:POST https://ai.growingth.com/api/song/proxy?name=generateVideo]
[请求体] {
"data": {
"title": "Through the Fog",
"clip_id": "0e66d6dd-7a55-4cd3-bc03-2ea11324ce3f"
}
}
✅ 视频生成提交成功!任务编号:MBENVP5DFKOSPJHO,正在生成中,请稍候...
用户:给刚才那首歌生成一个视频
AI: 好的,我将为《夏日微风》生成视频。
[执行:POST https://ai.growingth.com/api/song/proxy?name=generateVideo]
[请求体] {
"data": {
"title": "夏日微风",
"clip_id": "c13975cda17449da2261"
}
}
✅ 视频生成提交成功!任务编号:MBENVP5DFKOSPJHO,正在生成中,请稍候...
[等待 10 秒后查询]
[执行:POST https://ai.growingth.com/api/song/proxy?name=getMusic]
[请求体] {
"data": {
"ids": "c13975cda17449da2261"
}
}
🎬 视频生成完成!
歌曲id:123465
歌曲名:夏日微风
🎬 视频播放:https://cdn1.suno.ai/c13975cda17449da2261.mp4 | 下载:https://cdn1.suno.ai/c13975cda17449da2261.mp4
用户:帮我生成一首关于夏天的流行歌曲,然后做成视频
AI: 好的,我先为您创作歌曲。
[执行:POST https://ai.growingth.com/api/song/proxy?name=generateCustom]
✅ 提交成功!任务编号:c13975cda17449da2261,正在生成中...
[等待生成完成]
🎵 歌曲生成完成!
歌曲名:夏日微风
歌曲id:123465
现在开始生成视频...
[执行:POST https://ai.growingth.com/api/song/proxy?name=generateVideo]
[请求体] {
"data": {
"title": "夏日微风",
"clip_id": "c13975cda17449da2261"
}
}
✅ 视频生成提交成功!正在处理中...
[等待视频生成完成]
🎬 视频生成完成!
🎬 视频id:123465
🎬 视频播放:https://cdn1.suno.ai/c13975cda17449da2261.mp4 | 下载:https://cdn1.suno.ai/c13975cda17449da2261.mp4
前提条件
clip_id 获取
id 就是 clip_idtitle 参数
视频生成时间
查询视频结果
video_url 字段video_url 为空或不存在,说明视频还在生成中推荐使用场景
用途:将歌曲转换为 WAV 无损音频格式。
请求地址:
POST https://ai.growingth.com/api/song/proxy?name=makeWav
Headers:
{
"api-token": "${MIAOYIN_API_TOKEN}",
"Content-Type": "application/json; charset=utf-8"
}
请求体结构:
{
"data": {
"clipId": "0e66d6dd-7a55-4cd3-bc03-2ea11324ce3f"
}
}
data 字段说明:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| clipId | String | ✅ 是 | 歌曲 id(clip id) |
响应示例:
{
"status": "Success",
"message": "请求成功",
"data": {
"taskId": "MBENVP5DFKOSPJHO"
}
}
响应字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
| status | String | 请求状态:Success / Error |
| message | String | 响应消息 |
| data | Object | 任务数据对象 |
| data.taskId | String | 任务编号,用于后续查询 |
当用户表达 [生成 WAV] [转换 WAV] [无损格式] [WAV 格式] 等意图时:
步骤 1:确认 WAV 生成需求
IF 用户提供了歌曲 ID:
clipId = 用户提供的歌曲 ID
ELSE IF 用户说"把刚才的歌转成 WAV":
clipId = 最近一次生成的歌曲 ID(从查询结果中获取)
ELSE:
询问用户:"请提供要转换的歌曲 ID"
→ 停止,等待用户回复
步骤 2:构建请求
POST https://ai.growingth.com/api/song/proxy?name=makeWav
Headers:
api-token: ${MIAOYIN_API_TOKEN}
Content-Type: application/json; charset=utf-8
请求体:
{
"data": {
"clipId": clipId
}
}
步骤 3:发送请求并处理响应
IF response.status == "Success":
taskId = response.data.taskId
说:"✅ WAV 格式生成提交成功!任务编号:{taskId},正在转换中,请稍候..."
→ 转到 API 2 查询任务状态流程
ELSE:
说:"❌ WAV 格式生成失败:{response.message}"
→ 转到 "错误处理流程"
用户:帮我把歌曲 0e66d6dd-7a55-4cd3-bc03-2ea11324ce3f 转成 WAV 格式
AI: 好的,我将为这首歌生成 WAV 无损格式。
[执行:POST https://ai.growingth.com/api/song/proxy?name=makeWav]
[请求体] {
"data": {
"clipId": "0e66d6dd-7a55-4cd3-bc03-2ea11324ce3f"
}
}
✅ WAV 格式生成提交成功!任务编号:MBENVP5DFKOSPJHO,正在转换中,请稍候...
用户:把刚才那首歌转成 WAV 格式
AI: 好的,我将为《夏日微风》生成 WAV 无损格式。
[执行:POST https://ai.growingth.com/api/song/proxy?name=makeWav]
[请求体] {
"data": {
"clipId": "c13975cda17449da2261"
}
}
✅ WAV 格式生成提交成功!任务编号:MBENVP5DFKOSPJHO,正在转换中,请稍候...
[等待 10 秒后查询]
[执行:POST https://ai.growingth.com/api/song/proxy?name=getMusic]
[请求体] {
"data": {
"ids": "c13975cda17449da2261"
}
}
🎵 WAV 格式生成完成!
歌曲名:夏日微风
歌曲id: 123312
▶️ WAV 播放:https://cdn1.suno.ai/c13975cda17449da2261.wav | 下载:https://cdn1.suno.ai/c13975cda17449da2261.wav
用户:帮我生成一首关于夏天的流行歌曲,要 WAV 格式的
AI: 好的,我先为您创作歌曲。
[执行:POST https://ai.growingth.com/api/song/proxy?name=generateCustom]
✅ 提交成功!任务编号:c13975cda17449da2261,正在生成中...
[等待生成完成]
🎵 歌曲生成完成!
歌曲名:夏日微风
现在开始生成 WAV 格式...
[执行:POST https://ai.growingth.com/api/song/proxy?name=makeWav]
[请求体] {
"data": {
"clipId": "c13975cda17449da2261"
}
}
✅ WAV 格式生成提交成功!正在转换中...
[等待转换完成]
🎵 WAV 格式生成完成!
▶️ WAV 播放:https://cdn1.suno.ai/c13975cda17449da2261.wav | 下载:https://cdn1.suno.ai/c13975cda17449da2261.wav
前提条件
clipId 获取
id 就是 clipIdWAV 格式特点
转换时间
查询 WAV 结果
推荐使用场景
用途:提取歌曲的伴奏音轨或去除混响,用于伴奏制作、音频处理等用途。
⚠️ 重要限制:
请求地址:
POST https://ai.growingth.com/api/song/proxy?name=generateStem
Headers:
{
"api-token": "${MIAOYIN_API_TOKEN}",
"Content-Type": "application/json; charset=utf-8"
}
请求体结构:
{
"data": {
"title": "歌曲标题",
"clip_id": "0e66d6dd-7a55-4cd3-bc03-2ea11324ce3f",
"stemType": "two"
}
}
data 字段说明:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| title | String | ✅ 是 | 歌曲标题 |
| clip_id | String | ✅ 是 | 需要分离的歌曲 ID |
| stemType | String | ✅ 是 | 分轨类型:two(2分轨)、twelve(12分轨)、dry(去除混响) |
stemType 选项说明:
| 值 | 说明 | 用途 |
|---|---|---|
| two | 2 分轨 | 提取伴奏音轨(不含人声) |
| twelve | 12 分轨 | 提取 12 个独立伴奏音轨(鼓、贝斯、吉他等乐器) |
| dry | 去除混响 | 生成干声版本(去除混响效果) |
响应示例:
{
"status": "Success",
"message": "请求成功",
"data": {
"taskId": "MBENVP5DFKOSPJHO"
}
}
响应字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
| status | String | 请求状态:Success / Error |
| message | String | 响应消息 |
| data | Object | 任务数据对象 |
| data.taskId | String | 任务编号,用于后续查询 |
当用户表达 [分轨] [提取伴奏] [去混响] [干声] 等意图时:
⚠️ 重要:如果用户要求提取人声,必须明确告知:
"抱歉,此功能只能提取伴奏音轨,不支持提取人声。"
→ 停止,不要调用 API
步骤 1:确认分轨需求
IF 用户提供了歌曲 ID:
clip_id = 用户提供的歌曲 ID
ELSE IF 用户说"给刚才的歌分轨":
clip_id = 最近一次生成的歌曲 ID(从查询结果中获取)
ELSE:
询问用户:"请提供要分轨的歌曲 ID"
→ 停止,等待用户回复
获取歌曲标题:
IF 已知歌曲标题(从之前的查询结果中):
title = 已知的歌曲标题
ELSE:
先调用 API 2 查询歌曲信息,获取标题
确定分轨类型:
IF 用户说"提取伴奏" 或 "只要伴奏":
stemType = "two"
ELSE IF 用户说"12 分轨" 或 "详细分轨" 或 "分离所有乐器":
stemType = "twelve"
ELSE IF 用户说"去混响" 或 "干声":
stemType = "dry"
ELSE:
询问用户:"请选择分轨类型:
1. 2 分轨(提取伴奏音轨)
2. 12 分轨(提取 12 个独立乐器音轨)
3. 去除混响(干声版本)"
→ 停止,等待用户回复
步骤 2:构建请求
POST https://ai.growingth.com/api/song/proxy?name=generateStem
Headers:
api-token: ${MIAOYIN_API_TOKEN}
Content-Type: application/json; charset=utf-8
请求体:
{
"data": {
"title": title,
"clip_id": clip_id,
"stemType": stemType
}
}
步骤 3:发送请求并处理响应
IF response.status == "Success":
taskId = response.data.taskId
说:"✅ 音频分轨提交成功!任务编号:{taskId},正在处理中,请稍候..."
→ 转到 API 2 查询任务状态流程
ELSE:
说:"❌ 音频分轨失败:{response.message}"
→ 转到 "错误处理流程"
用户:帮我把歌曲 0e66d6dd-7a55-4cd3-bc03-2ea11324ce3f 提取伴奏
AI: 好的,我先查询一下这首歌的信息。
[执行:POST https://ai.growingth.com/api/song/proxy?name=getMusic]
查询到歌曲:Through the Fog
现在开始提取伴奏音轨...
[执行:POST https://ai.growingth.com/api/song/proxy?name=generateStem]
[请求体] {
"data": {
"title": "Through the Fog",
"clip_id": "0e66d6dd-7a55-4cd3-bc03-2ea11324ce3f",
"stemType": "two"
}
}
✅ 音频分轨提交成功!任务编号:MBENVP5DFKOSPJHO,正在处理中,请稍候...
[等待 10 秒后查询]
🎵 伴奏提取完成!
▶️ 伴奏音轨 - 播放:https://cdn1.suno.ai/xxx-instrumental.mp3 | 下载:https://cdn1.suno.ai/xxx-instrumental.mp3
用户:给刚才那首歌做 12 分轨
AI: 好的,我将为《夏日微风》进行 12 分轨处理,提取 12 个独立乐器音轨。
[执行:POST https://ai.growingth.com/api/song/proxy?name=generateStem]
[请求体] {
"data": {
"title": "夏日微风",
"clip_id": "c13975cda17449da2261",
"stemType": "twelve"
}
}
✅ 音频分轨提交成功!任务编号:MBENVP5DFKOSPJHO,正在处理中...
⚠️ 注意:12 分轨处理时间较长,建议等待 30 秒以上再查询。
[等待处理完成]
🎵 12 分轨完成!
已生成 12 个独立伴奏音轨:
1. 鼓组
2. 贝斯
3. 吉他
4. 钢琴
5. 合成器
6. 弦乐
... (共 12 个乐器音轨)
用户:把这首歌的混响去掉,我要干声版本
AI: 好的,我将生成干声版本(去除混响)。
[执行:POST https://ai.growingth.com/api/song/proxy?name=generateStem]
[请求体] {
"data": {
"title": "夏日微风",
"clip_id": "c13975cda17449da2261",
"stemType": "dry"
}
}
✅ 音频分轨提交成功!任务编号:MBENVP5DFKOSPJHO,正在处理中,请稍候...
[等待处理完成]
🎵 干声版本生成完成!
▶️ 播放:https://cdn1.suno.ai/xxx-dry.mp3 | 下载:https://cdn1.suno.ai/xxx-dry.mp3
用户:帮我给这首歌分轨
AI: 好的,请选择分轨类型:
1. 2 分轨(提取伴奏音轨)- 适合制作伴奏
2. 12 分轨(提取 12 个独立乐器音轨)- 适合专业混音和编曲
3. 去除混响(干声版本)- 适合后期处理
用户:2 分轨
AI: 好的,我将提取伴奏音轨。
[执行分轨流程...]
重要限制
前提条件
clip_id 和 title 获取
分轨类型选择建议
处理时间
查询分轨结果
推荐使用场景
文件管理