跳转到主要内容
POST
/
api
/
v1
/
generate
/
add-vocals
添加人声
curl --request POST \
  --url https://api.sunoapi.org/api/v1/generate/add-vocals \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "prompt": "一段平静放松的钢琴曲配舒缓人声",
  "title": "轻松钢琴配人声",
  "negativeTags": "重金属, 激进人声",
  "style": "爵士",
  "uploadUrl": "https://example.com/instrumental.mp3",
  "callBackUrl": "https://api.example.com/callback",
  "vocalGender": "m",
  "styleWeight": 0.61,
  "weirdnessConstraint": 0.72,
  "audioWeight": 0.65,
  "model": "V4_5PLUS"
}
'
import requests

url = "https://api.sunoapi.org/api/v1/generate/add-vocals"

payload = {
"prompt": "一段平静放松的钢琴曲配舒缓人声",
"title": "轻松钢琴配人声",
"negativeTags": "重金属, 激进人声",
"style": "爵士",
"uploadUrl": "https://example.com/instrumental.mp3",
"callBackUrl": "https://api.example.com/callback",
"vocalGender": "m",
"styleWeight": 0.61,
"weirdnessConstraint": 0.72,
"audioWeight": 0.65,
"model": "V4_5PLUS"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
prompt: '一段平静放松的钢琴曲配舒缓人声',
title: '轻松钢琴配人声',
negativeTags: '重金属, 激进人声',
style: '爵士',
uploadUrl: 'https://example.com/instrumental.mp3',
callBackUrl: 'https://api.example.com/callback',
vocalGender: 'm',
styleWeight: 0.61,
weirdnessConstraint: 0.72,
audioWeight: 0.65,
model: 'V4_5PLUS'
})
};

fetch('https://api.sunoapi.org/api/v1/generate/add-vocals', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sunoapi.org/api/v1/generate/add-vocals",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'prompt' => '一段平静放松的钢琴曲配舒缓人声',
'title' => '轻松钢琴配人声',
'negativeTags' => '重金属, 激进人声',
'style' => '爵士',
'uploadUrl' => 'https://example.com/instrumental.mp3',
'callBackUrl' => 'https://api.example.com/callback',
'vocalGender' => 'm',
'styleWeight' => 0.61,
'weirdnessConstraint' => 0.72,
'audioWeight' => 0.65,
'model' => 'V4_5PLUS'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main

import (
"fmt"
"strings"
"net/http"
"io"
)

func main() {

url := "https://api.sunoapi.org/api/v1/generate/add-vocals"

payload := strings.NewReader("{\n \"prompt\": \"一段平静放松的钢琴曲配舒缓人声\",\n \"title\": \"轻松钢琴配人声\",\n \"negativeTags\": \"重金属, 激进人声\",\n \"style\": \"爵士\",\n \"uploadUrl\": \"https://example.com/instrumental.mp3\",\n \"callBackUrl\": \"https://api.example.com/callback\",\n \"vocalGender\": \"m\",\n \"styleWeight\": 0.61,\n \"weirdnessConstraint\": 0.72,\n \"audioWeight\": 0.65,\n \"model\": \"V4_5PLUS\"\n}")

req, _ := http.NewRequest("POST", url, payload)

req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.post("https://api.sunoapi.org/api/v1/generate/add-vocals")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"prompt\": \"一段平静放松的钢琴曲配舒缓人声\",\n \"title\": \"轻松钢琴配人声\",\n \"negativeTags\": \"重金属, 激进人声\",\n \"style\": \"爵士\",\n \"uploadUrl\": \"https://example.com/instrumental.mp3\",\n \"callBackUrl\": \"https://api.example.com/callback\",\n \"vocalGender\": \"m\",\n \"styleWeight\": 0.61,\n \"weirdnessConstraint\": 0.72,\n \"audioWeight\": 0.65,\n \"model\": \"V4_5PLUS\"\n}")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.sunoapi.org/api/v1/generate/add-vocals")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"prompt\": \"一段平静放松的钢琴曲配舒缓人声\",\n \"title\": \"轻松钢琴配人声\",\n \"negativeTags\": \"重金属, 激进人声\",\n \"style\": \"爵士\",\n \"uploadUrl\": \"https://example.com/instrumental.mp3\",\n \"callBackUrl\": \"https://api.example.com/callback\",\n \"vocalGender\": \"m\",\n \"styleWeight\": 0.61,\n \"weirdnessConstraint\": 0.72,\n \"audioWeight\": 0.65,\n \"model\": \"V4_5PLUS\"\n}"

response = http.request(request)
puts response.read_body
{
  "code": 200,
  "msg": "success",
  "data": {
    "taskId": "5c79****be8e"
  }
}
通过上传音频文件为现有乐器音乐添加人声轨道。此接口允许您使用AI生成的人声来增强乐器曲目,人声与您指定的风格和内容相匹配。

主要功能

  • 人声增强: 为现有乐器曲目添加人声
  • 风格匹配: 生成与上传音频风格和情绪匹配的人声
  • 内容控制: 指定人声风格、流派和特征
  • 质量筛选: 使用负面标签避免不需要的人声风格

参数使用指南

所有请求的必需参数:
  • uploadUrl: 有效的乐器音频文件URL
  • prompt: 所需人声内容和风格的描述
  • title: 生成的人声曲目标题
  • style: 音乐和人声风格(例如:“爵士”、“流行”、“古典”)
  • negativeTags: 要排除的人声风格或特征
  • callBackUrl: 接收完成通知的URL

可选参数

通过以下参数微调人声生成:
  • vocalGender: 首选人声性别(‘m’表示男性,‘f’表示女性)
  • styleWeight: 风格指引权重(0.00-1.00)
  • weirdnessConstraint: 创意/新颖性约束(0.00-1.00)
  • audioWeight: 音频一致性权重(0.00-1.00)
  • model:用于生成的模型版本。可选值:V4_5PLUS(默认)、V5V5_5

音频要求

  • 输入类型: 乐器或背景音轨音频文件
  • 文件格式: MP3、WAV或其他支持的音频格式
  • 质量: 清晰的乐器曲目最适合人声添加
  • 可访问性: 确保上传的音频URL是公开可访问的

人声生成过程

  1. 音频分析: 系统分析上传的乐器曲目
  2. 风格匹配: 生成与音乐风格互补的人声
  3. 内容创建: 基于您的提示和风格参数创建人声内容
  4. 最终混音: 将人声与原始乐器混合

响应信息

  • 处理时间: 通常需要2-4分钟,取决于曲目复杂性
  • 回调阶段: 可能发生多个回调阶段(text、first、complete)
  • 输出: 在原始乐器上添加人声的增强音频

开发者注意事项

  1. 内容权利: 确保您有使用上传音频的适当权利
  2. 文件保留: 生成的人声曲目保留15天
  3. 输入质量: 更高质量的乐器输入产生更好的人声效果
  4. 风格一致性: AI尝试使人声风格与乐器风格匹配
  5. 处理时间: 复杂的编排可能需要额外的处理时间

最佳实践

人声增强提示

  • 使用清晰、混音良好的乐器曲目以获得最佳效果
  • 在提示中具体说明人声风格(例如:“流畅爵士人声”、“充满活力的流行人声”)
  • 当您有偏好时指定人声性别
  • 使用负面标签避免冲突的人声风格

重要考虑事项

  • 系统在具有清晰旋律结构的乐器曲目上效果最佳
  • 非常繁忙或密集的乐器编排可能影响人声清晰度
  • 确保您的提示描述了所需的人声内容和情绪
  • 在描述人声风格时考虑您乐器的调性和节拍

示例用例

  • 音乐制作: 为乐器作品添加人声
  • 演示创建: 从乐器草图创建人声演示
  • 风格探索: 在同一乐器上尝试不同的人声风格
  • 内容创建: 为多媒体项目生成人声内容

授权

Authorization
string
header
必填

🔑 API 认证说明

所有接口都需要通过 Bearer Token 方式进行认证。

获取 API Key

  1. 访问 API Key 管理页面 获取您的 API Key

使用方式

在请求头中添加:

Authorization: Bearer YOUR_API_KEY

⚠️ 注意:

  • 请妥善保管您的 API Key,不要泄露给他人
  • 如果怀疑 API Key 泄露,请立即在管理页面重置

请求体

application/json
prompt
string
必填

要生成人声的音频内容描述。

  • 必填。
  • 提供关于所需人声风格和内容的上下文。
  • 您的提示越详细,人声生成越符合您的设想。
示例:

"一段平静放松的钢琴曲配舒缓人声"

title
string
必填

音乐曲目的标题。

  • 必填。
  • 这将用作生成的人声曲目的标题。
示例:

"轻松钢琴配人声"

negativeTags
string
必填

要从生成的曲目中排除的音乐风格或人声特征。

  • 必填。
  • 用于避免特定的人声风格或特征。
    示例:"重金属, 激进人声"
示例:

"重金属, 激进人声"

style
string
必填

音乐和人声风格。

  • 必填。
  • 示例:"爵士"、"古典"、"电子"、"流行"。
  • 描述整体流派和人声方式。
示例:

"爵士"

uploadUrl
string<uri>
必填

要添加人声的上传音频文件的URL。

  • 必填。
  • 必须是系统可访问的有效音频文件URL。
  • 上传的音频应为支持的格式(MP3、WAV等)。
示例:

"https://example.com/instrumental.mp3"

callBackUrl
string<uri>
必填

人声生成完成时接收任务完成通知的URL。回调过程有三个阶段:text(文本生成)、first(第一首完成)、complete(全部完成)。注意:某些情况下可能会跳过 textfirst 阶段,直接返回 complete

  • 详细的回调格式和实现指南,请参见 添加人声回调
  • 或者,您也可以使用获取音乐生成详情接口来轮询任务状态
示例:

"https://api.example.com/callback"

vocalGender
enum<string>

首选人声性别。可选。允许的值:'m'(男性)、'f'(女性)。

可用选项:
m,
f
示例:

"m"

styleWeight
number

风格指引权重。可选。范围:0-1。建议使用两位小数。

必填范围: 0 <= x <= 1必须是以下数值的倍数 0.01
示例:

0.61

weirdnessConstraint
number

创意/新颖性约束。可选。范围:0-1。建议使用两位小数。

必填范围: 0 <= x <= 1必须是以下数值的倍数 0.01
示例:

0.72

audioWeight
number

音频一致性相对于其他控制的权重。可选。范围:0-1。建议使用两位小数。

必填范围: 0 <= x <= 1必须是以下数值的倍数 0.01
示例:

0.65

model
enum<string>
默认值:V4_5PLUS

用于生成的模型版本。可选。默认值:V4_5PLUS。

可用选项:
V4_5PLUS,
V5,
V5_5
示例:

"V4_5PLUS"

回调

POST
{request.body#/callBackUrl}vocalsAdded

请求体

application/json
code
integer

状态码

示例:

200

msg
string

响应消息

示例:

"All generated successfully"

data
object

响应

200

回调接收成功

响应

请求成功

code
enum<integer>

状态码说明

  • ✅ 200 - 请求成功
  • ⚠️ 400 - 参数错误
  • ⚠️ 401 - 没有访问权限
  • ⚠️ 404 - 请求方式或者路径错误
  • ⚠️ 405 - 调用超过限制
  • ⚠️ 413 - 主题或者prompt过长
  • ⚠️ 429 - 积分不足
  • ⚠️ 430 - 您的调用频率过高,请稍后再试。
  • ⚠️ 455 - 网站维护
  • ❌ 500 - 服务器异常
可用选项:
200,
400,
401,
404,
405,
413,
429,
430,
455,
500
示例:

200

msg
string

当 code != 200 时,展示错误信息

示例:

"success"

data
object