Suno Voice自建音色生成接口
curl --request POST \
--url https://apibox.erweima.ai/api/v1/voice/generate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"taskId": "voice_create_001",
"verifyUrl": "https://example.com/audio/verify_read.mp3",
"voiceName": "My Voice",
"description": "created from uploaded voice",
"style": "Pop, Female Vocal",
"singerSkillLevel": "beginner",
"callBackUrl": "https://example.com/callback/suno/voice_create"
}
'import requests
url = "https://apibox.erweima.ai/api/v1/voice/generate"
payload = {
"taskId": "voice_create_001",
"verifyUrl": "https://example.com/audio/verify_read.mp3",
"voiceName": "My Voice",
"description": "created from uploaded voice",
"style": "Pop, Female Vocal",
"singerSkillLevel": "beginner",
"callBackUrl": "https://example.com/callback/suno/voice_create"
}
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({
taskId: 'voice_create_001',
verifyUrl: 'https://example.com/audio/verify_read.mp3',
voiceName: 'My Voice',
description: 'created from uploaded voice',
style: 'Pop, Female Vocal',
singerSkillLevel: 'beginner',
callBackUrl: 'https://example.com/callback/suno/voice_create'
})
};
fetch('https://apibox.erweima.ai/api/v1/voice/generate', 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://apibox.erweima.ai/api/v1/voice/generate",
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([
'taskId' => 'voice_create_001',
'verifyUrl' => 'https://example.com/audio/verify_read.mp3',
'voiceName' => 'My Voice',
'description' => 'created from uploaded voice',
'style' => 'Pop, Female Vocal',
'singerSkillLevel' => 'beginner',
'callBackUrl' => 'https://example.com/callback/suno/voice_create'
]),
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://apibox.erweima.ai/api/v1/voice/generate"
payload := strings.NewReader("{\n \"taskId\": \"voice_create_001\",\n \"verifyUrl\": \"https://example.com/audio/verify_read.mp3\",\n \"voiceName\": \"My Voice\",\n \"description\": \"created from uploaded voice\",\n \"style\": \"Pop, Female Vocal\",\n \"singerSkillLevel\": \"beginner\",\n \"callBackUrl\": \"https://example.com/callback/suno/voice_create\"\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://apibox.erweima.ai/api/v1/voice/generate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"taskId\": \"voice_create_001\",\n \"verifyUrl\": \"https://example.com/audio/verify_read.mp3\",\n \"voiceName\": \"My Voice\",\n \"description\": \"created from uploaded voice\",\n \"style\": \"Pop, Female Vocal\",\n \"singerSkillLevel\": \"beginner\",\n \"callBackUrl\": \"https://example.com/callback/suno/voice_create\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://apibox.erweima.ai/api/v1/voice/generate")
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 \"taskId\": \"voice_create_001\",\n \"verifyUrl\": \"https://example.com/audio/verify_read.mp3\",\n \"voiceName\": \"My Voice\",\n \"description\": \"created from uploaded voice\",\n \"style\": \"Pop, Female Vocal\",\n \"singerSkillLevel\": \"beginner\",\n \"callBackUrl\": \"https://example.com/callback/suno/voice_create\"\n}"
response = http.request(request)
puts response.read_body{
"code": 200,
"msg": "success",
"data": {
"taskId": "xxx_task_id_xxx"
}
}Suno Voice
Suno Voice 自建音色生成
根据用户录制的验证短句音频生成可复用的 Suno 自建音色。
POST
/
api
/
v1
/
voice
/
generate
Suno Voice自建音色生成接口
curl --request POST \
--url https://apibox.erweima.ai/api/v1/voice/generate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"taskId": "voice_create_001",
"verifyUrl": "https://example.com/audio/verify_read.mp3",
"voiceName": "My Voice",
"description": "created from uploaded voice",
"style": "Pop, Female Vocal",
"singerSkillLevel": "beginner",
"callBackUrl": "https://example.com/callback/suno/voice_create"
}
'import requests
url = "https://apibox.erweima.ai/api/v1/voice/generate"
payload = {
"taskId": "voice_create_001",
"verifyUrl": "https://example.com/audio/verify_read.mp3",
"voiceName": "My Voice",
"description": "created from uploaded voice",
"style": "Pop, Female Vocal",
"singerSkillLevel": "beginner",
"callBackUrl": "https://example.com/callback/suno/voice_create"
}
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({
taskId: 'voice_create_001',
verifyUrl: 'https://example.com/audio/verify_read.mp3',
voiceName: 'My Voice',
description: 'created from uploaded voice',
style: 'Pop, Female Vocal',
singerSkillLevel: 'beginner',
callBackUrl: 'https://example.com/callback/suno/voice_create'
})
};
fetch('https://apibox.erweima.ai/api/v1/voice/generate', 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://apibox.erweima.ai/api/v1/voice/generate",
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([
'taskId' => 'voice_create_001',
'verifyUrl' => 'https://example.com/audio/verify_read.mp3',
'voiceName' => 'My Voice',
'description' => 'created from uploaded voice',
'style' => 'Pop, Female Vocal',
'singerSkillLevel' => 'beginner',
'callBackUrl' => 'https://example.com/callback/suno/voice_create'
]),
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://apibox.erweima.ai/api/v1/voice/generate"
payload := strings.NewReader("{\n \"taskId\": \"voice_create_001\",\n \"verifyUrl\": \"https://example.com/audio/verify_read.mp3\",\n \"voiceName\": \"My Voice\",\n \"description\": \"created from uploaded voice\",\n \"style\": \"Pop, Female Vocal\",\n \"singerSkillLevel\": \"beginner\",\n \"callBackUrl\": \"https://example.com/callback/suno/voice_create\"\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://apibox.erweima.ai/api/v1/voice/generate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"taskId\": \"voice_create_001\",\n \"verifyUrl\": \"https://example.com/audio/verify_read.mp3\",\n \"voiceName\": \"My Voice\",\n \"description\": \"created from uploaded voice\",\n \"style\": \"Pop, Female Vocal\",\n \"singerSkillLevel\": \"beginner\",\n \"callBackUrl\": \"https://example.com/callback/suno/voice_create\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://apibox.erweima.ai/api/v1/voice/generate")
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 \"taskId\": \"voice_create_001\",\n \"verifyUrl\": \"https://example.com/audio/verify_read.mp3\",\n \"voiceName\": \"My Voice\",\n \"description\": \"created from uploaded voice\",\n \"style\": \"Pop, Female Vocal\",\n \"singerSkillLevel\": \"beginner\",\n \"callBackUrl\": \"https://example.com/callback/suno/voice_create\"\n}"
response = http.request(request)
puts response.read_body{
"code": 200,
"msg": "success",
"data": {
"taskId": "xxx_task_id_xxx"
}
}使用指南
- 请在验证短句生成完成,并且用户已完成验证音频录制后调用此接口。
- 验证短句是服务端返回的
validateInfo文本。为获得更佳的音色生成效果,建议用户以演唱方式录制服务端返回的验证短句。 - 提交原验证任务的
taskId,并在verifyUrl中传入验证音频 URL。 - 可选的
voiceName、description、style和singerSkillLevel可帮助管理并调整生成的音色。 - 接口会返回新的
taskId,后续通过它查询最终voiceId。 - 如果传入
callBackUrl,系统会在音色创建完成或任务失败时发送 POST 回调。回调地址必须可公网访问,并在 15 秒内返回 HTTP 200。
流程
- 生成并获取验证短句。
- 录制用户完成该短句的验证音频;为获得更佳的音色生成效果,建议采用演唱方式录制。
- 上传或托管验证音频,并将 URL 作为
verifyUrl传入。 - 提交音色生成任务,并保存返回的
taskId。 - 任务成功后,通过查询接口或回调获取
voiceId。
回调
自建音色生成回调
查看音色创建完成或失败时发送的回调格式
开发者注意事项
taskId必须来自同一音色流程中的验证短句任务。verifyUrl应指向用户录制服务端返回的同一条验证短句的音频;为获得更佳效果,建议采用演唱方式录制。- 获取
voiceId后,建议先调用音色可用性检查接口,再用于依赖自建音色的生成流程。
授权
API 认证说明
所有接口都需要通过 Bearer Token 方式进行认证。
获取 API Key
- 访问 API Key 管理页面 获取您的 API Key
使用方式
在请求头中添加:
Authorization: Bearer YOUR_API_KEY
注意:
- 请妥善保管您的 API Key,不要泄露给他人
- 如果怀疑 API Key 泄露,请立即在管理页面重置
请求体
application/json
任务task_id
用户录制服务端返回的验证短句后的音频URL;为获得更佳效果,建议采用演唱方式录制[必填]
音色名称
音色描述
音色风格
歌手技能等级。支持:beginner、intermediate、advanced、professional
可用选项:
beginner, intermediate, advanced, professional ⌘I
