创建角色
curl --request POST \
--url https://api.mountsea.ai/suno/v2/persona \
--header 'Content-Type: application/json' \
--data '
{
"clip_id": "<string>",
"name": "<string>",
"is_public": true,
"description": "<string>",
"persona_type": "<string>",
"vox_audio_id": "<string>",
"vocal_start_s": 123,
"vocal_end_s": 123,
"user_input_styles": "<string>",
"image_s3_id": "<string>"
}
'import requests
url = "https://api.mountsea.ai/suno/v2/persona"
payload = {
"clip_id": "<string>",
"name": "<string>",
"is_public": True,
"description": "<string>",
"persona_type": "<string>",
"vox_audio_id": "<string>",
"vocal_start_s": 123,
"vocal_end_s": 123,
"user_input_styles": "<string>",
"image_s3_id": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
clip_id: '<string>',
name: '<string>',
is_public: true,
description: '<string>',
persona_type: '<string>',
vox_audio_id: '<string>',
vocal_start_s: 123,
vocal_end_s: 123,
user_input_styles: '<string>',
image_s3_id: '<string>'
})
};
fetch('https://api.mountsea.ai/suno/v2/persona', 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.mountsea.ai/suno/v2/persona",
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([
'clip_id' => '<string>',
'name' => '<string>',
'is_public' => true,
'description' => '<string>',
'persona_type' => '<string>',
'vox_audio_id' => '<string>',
'vocal_start_s' => 123,
'vocal_end_s' => 123,
'user_input_styles' => '<string>',
'image_s3_id' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"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.mountsea.ai/suno/v2/persona"
payload := strings.NewReader("{\n \"clip_id\": \"<string>\",\n \"name\": \"<string>\",\n \"is_public\": true,\n \"description\": \"<string>\",\n \"persona_type\": \"<string>\",\n \"vox_audio_id\": \"<string>\",\n \"vocal_start_s\": 123,\n \"vocal_end_s\": 123,\n \"user_input_styles\": \"<string>\",\n \"image_s3_id\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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.mountsea.ai/suno/v2/persona")
.header("Content-Type", "application/json")
.body("{\n \"clip_id\": \"<string>\",\n \"name\": \"<string>\",\n \"is_public\": true,\n \"description\": \"<string>\",\n \"persona_type\": \"<string>\",\n \"vox_audio_id\": \"<string>\",\n \"vocal_start_s\": 123,\n \"vocal_end_s\": 123,\n \"user_input_styles\": \"<string>\",\n \"image_s3_id\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mountsea.ai/suno/v2/persona")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"clip_id\": \"<string>\",\n \"name\": \"<string>\",\n \"is_public\": true,\n \"description\": \"<string>\",\n \"persona_type\": \"<string>\",\n \"vox_audio_id\": \"<string>\",\n \"vocal_start_s\": 123,\n \"vocal_end_s\": 123,\n \"user_input_styles\": \"<string>\",\n \"image_s3_id\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"name": "<string>",
"description": "<string>",
"persona_type": "<string>",
"is_public": true,
"clip": {},
"vocal_start_s": 123,
"vocal_end_s": 123
}Clip Persona
创建角色
从音频片段创建声音角色
POST
/
suno
/
v2
/
persona
创建角色
curl --request POST \
--url https://api.mountsea.ai/suno/v2/persona \
--header 'Content-Type: application/json' \
--data '
{
"clip_id": "<string>",
"name": "<string>",
"is_public": true,
"description": "<string>",
"persona_type": "<string>",
"vox_audio_id": "<string>",
"vocal_start_s": 123,
"vocal_end_s": 123,
"user_input_styles": "<string>",
"image_s3_id": "<string>"
}
'import requests
url = "https://api.mountsea.ai/suno/v2/persona"
payload = {
"clip_id": "<string>",
"name": "<string>",
"is_public": True,
"description": "<string>",
"persona_type": "<string>",
"vox_audio_id": "<string>",
"vocal_start_s": 123,
"vocal_end_s": 123,
"user_input_styles": "<string>",
"image_s3_id": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
clip_id: '<string>',
name: '<string>',
is_public: true,
description: '<string>',
persona_type: '<string>',
vox_audio_id: '<string>',
vocal_start_s: 123,
vocal_end_s: 123,
user_input_styles: '<string>',
image_s3_id: '<string>'
})
};
fetch('https://api.mountsea.ai/suno/v2/persona', 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.mountsea.ai/suno/v2/persona",
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([
'clip_id' => '<string>',
'name' => '<string>',
'is_public' => true,
'description' => '<string>',
'persona_type' => '<string>',
'vox_audio_id' => '<string>',
'vocal_start_s' => 123,
'vocal_end_s' => 123,
'user_input_styles' => '<string>',
'image_s3_id' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"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.mountsea.ai/suno/v2/persona"
payload := strings.NewReader("{\n \"clip_id\": \"<string>\",\n \"name\": \"<string>\",\n \"is_public\": true,\n \"description\": \"<string>\",\n \"persona_type\": \"<string>\",\n \"vox_audio_id\": \"<string>\",\n \"vocal_start_s\": 123,\n \"vocal_end_s\": 123,\n \"user_input_styles\": \"<string>\",\n \"image_s3_id\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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.mountsea.ai/suno/v2/persona")
.header("Content-Type", "application/json")
.body("{\n \"clip_id\": \"<string>\",\n \"name\": \"<string>\",\n \"is_public\": true,\n \"description\": \"<string>\",\n \"persona_type\": \"<string>\",\n \"vox_audio_id\": \"<string>\",\n \"vocal_start_s\": 123,\n \"vocal_end_s\": 123,\n \"user_input_styles\": \"<string>\",\n \"image_s3_id\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mountsea.ai/suno/v2/persona")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"clip_id\": \"<string>\",\n \"name\": \"<string>\",\n \"is_public\": true,\n \"description\": \"<string>\",\n \"persona_type\": \"<string>\",\n \"vox_audio_id\": \"<string>\",\n \"vocal_start_s\": 123,\n \"vocal_end_s\": 123,\n \"user_input_styles\": \"<string>\",\n \"image_s3_id\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"name": "<string>",
"description": "<string>",
"persona_type": "<string>",
"is_public": true,
"clip": {},
"vocal_start_s": 123,
"vocal_end_s": 123
}从已有 clip 创建已脱敏的片段 Persona。不绑声纹,任意账号可用。两个家族对比见 Persona 总览。
此端点直接返回创建的角色(不是任务 ID)。对于声音角色(
persona_type: "vox"),请先使用获取人声音轨提取人声音轨。在
/generate 里使用本 Persona 时不要设 is_voice: true。该字段只给 Voice Persona(Clone Voice 或 Init+Complete)用。请求体
string
必填
用于创建角色的音频片段 ID。
string
必填
角色名称。
boolean
默认值:true
必填
角色是否可公开访问。
string
角色描述。
string
角色类型。声音角色请使用
"vox"。number
要使用的声乐片段开始时间(秒)。
number
要使用的声乐片段结束时间(秒)。
string
描述角色的风格标签(例如 “soulful vocals, R&B, smooth harmonies”)。
string
角色头像的 Base64 编码图片(格式:
data:image/png;base64,...)。响应
响应包含完整的角色对象及所有详情。string
创建的角色 ID。
string
角色名称。
string
角色描述。
string
角色类型(例如
"vox")。boolean
角色是否公开。
object
源片段信息。
number
人声开始时间。
number
人声结束时间。
示例
curl -X POST https://api.mountsea.ai/suno/v2/persona \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your-api-key" \
-d '{
"clip_id": "316c630b-284b-4fbd-9b35-f0551d4b98da",
"name": "My Vocal Persona",
"description": "A soulful R&B voice",
"is_public": true,
"persona_type": "vox",
"vox_audio_id": "373efa9c-a366-42bb-806c-afdfc9b306a7",
"vocal_start_s": 16.13,
"vocal_end_s": 46.13,
"user_input_styles": "soulful vocals, R&B, smooth harmonies"
}'
const response = await fetch('https://api.mountsea.ai/suno/v2/persona', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your-api-key'
},
body: JSON.stringify({
clip_id: '316c630b-284b-4fbd-9b35-f0551d4b98da',
name: 'My Vocal Persona',
description: 'A soulful R&B voice',
is_public: true,
persona_type: 'vox',
vox_audio_id: '373efa9c-a366-42bb-806c-afdfc9b306a7',
vocal_start_s: 16.13,
vocal_end_s: 46.13,
user_input_styles: 'soulful vocals, R&B, smooth harmonies'
})
});
const persona = await response.json();
console.log('Created Persona ID:', persona.id);
console.log('Persona Name:', persona.name);
import requests
response = requests.post(
'https://api.mountsea.ai/suno/v2/persona',
headers={
'Content-Type': 'application/json',
'Authorization': 'Bearer your-api-key'
},
json={
'clip_id': '316c630b-284b-4fbd-9b35-f0551d4b98da',
'name': 'My Vocal Persona',
'description': 'A soulful R&B voice',
'is_public': True,
'persona_type': 'vox',
'vox_audio_id': '373efa9c-a366-42bb-806c-afdfc9b306a7',
'vocal_start_s': 16.13,
'vocal_end_s': 46.13,
'user_input_styles': 'soulful vocals, R&B, smooth harmonies'
}
)
persona = response.json()
print(f"Created Persona ID: {persona['id']}")
print(f"Persona Name: {persona['name']}")
响应示例
{
"id": "61515b86-62f5-427a-bc29-6befa382536a",
"name": "My Vocal Persona",
"description": "A soulful R&B voice",
"image_s3_id": "https://cdn2.suno.ai/image_316c630b-284b-4fbd-9b35-f0551d4b98da.jpeg",
"root_clip_id": "316c630b-284b-4fbd-9b35-f0551d4b98da",
"clip": {
"id": "316c630b-284b-4fbd-9b35-f0551d4b98da",
"status": "complete",
"title": "Roadtrip Sunrise",
"audio_url": "https://cdn1.suno.ai/316c630b-284b-4fbd-9b35-f0551d4b98da.mp3",
"image_url": "https://cdn2.suno.ai/image_316c630b-284b-4fbd-9b35-f0551d4b98da.jpeg"
},
"persona_type": "vox",
"is_public": true,
"user_input_styles": "soulful vocals, R&B, smooth harmonies",
"vocal_start_s": 16.13,
"vocal_end_s": 46.13,
"vocal_clip_id": "70149747-3f33-4e56-a4f4-8c44c30d7a0f",
"upvote_count": 0,
"clip_count": 1,
"follower_count": 0
}
工作流程:创建声音角色
创建声音角色请按以下步骤操作:// Step 1: Get vox stem to extract vocals
const voxResponse = await fetch('https://api.mountsea.ai/suno/v2/getVoxStem', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your-api-key'
},
body: JSON.stringify({ clip_id: 'your-clip-id' })
});
const voxData = await voxResponse.json();
// voxData.id is the vox_audio_id to use
// Step 2: Create persona with the extracted vox audio
const personaResponse = await fetch('https://api.mountsea.ai/suno/v2/persona', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your-api-key'
},
body: JSON.stringify({
clip_id: 'your-clip-id',
name: 'My Vocal Persona',
is_public: true,
persona_type: 'vox',
vox_audio_id: voxData.id,
vocal_start_s: voxData.vocal_start_s,
vocal_end_s: voxData.vocal_end_s,
user_input_styles: 'your style description'
})
});
const persona = await personaResponse.json();
console.log('Persona created:', persona.id);
创建后,可以通过 Generate Music 端点的
persona 参数使用角色,以创建具有一致声音特征的音乐。