init voice persona
curl --request POST \
--url https://api.mountsea.ai/suno/v2/voicePersona/init \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"voice_audio_url": "https://example.com/my-voice.wav",
"language": "zh",
"vocal_start_s": 0,
"vocal_end_s": 12.6
}
'import requests
url = "https://api.mountsea.ai/suno/v2/voicePersona/init"
payload = {
"voice_audio_url": "https://example.com/my-voice.wav",
"language": "zh",
"vocal_start_s": 0,
"vocal_end_s": 12.6
}
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({
voice_audio_url: 'https://example.com/my-voice.wav',
language: 'zh',
vocal_start_s: 0,
vocal_end_s: 12.6
})
};
fetch('https://api.mountsea.ai/suno/v2/voicePersona/init', 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/voicePersona/init",
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([
'voice_audio_url' => 'https://example.com/my-voice.wav',
'language' => 'zh',
'vocal_start_s' => 0,
'vocal_end_s' => 12.6
]),
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.mountsea.ai/suno/v2/voicePersona/init"
payload := strings.NewReader("{\n \"voice_audio_url\": \"https://example.com/my-voice.wav\",\n \"language\": \"zh\",\n \"vocal_start_s\": 0,\n \"vocal_end_s\": 12.6\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.mountsea.ai/suno/v2/voicePersona/init")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"voice_audio_url\": \"https://example.com/my-voice.wav\",\n \"language\": \"zh\",\n \"vocal_start_s\": 0,\n \"vocal_end_s\": 12.6\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mountsea.ai/suno/v2/voicePersona/init")
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 \"voice_audio_url\": \"https://example.com/my-voice.wav\",\n \"language\": \"zh\",\n \"vocal_start_s\": 0,\n \"vocal_end_s\": 12.6\n}"
response = http.request(request)
puts response.read_body{
"taskId": "15c257ff-43f7-4678-bd41-202ad6b8488b"
}Voice Persona
Voice Persona Init
Upload voice audio and get verification phrase
POST
/
suno
/
v2
/
voicePersona
/
init
init voice persona
curl --request POST \
--url https://api.mountsea.ai/suno/v2/voicePersona/init \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"voice_audio_url": "https://example.com/my-voice.wav",
"language": "zh",
"vocal_start_s": 0,
"vocal_end_s": 12.6
}
'import requests
url = "https://api.mountsea.ai/suno/v2/voicePersona/init"
payload = {
"voice_audio_url": "https://example.com/my-voice.wav",
"language": "zh",
"vocal_start_s": 0,
"vocal_end_s": 12.6
}
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({
voice_audio_url: 'https://example.com/my-voice.wav',
language: 'zh',
vocal_start_s: 0,
vocal_end_s: 12.6
})
};
fetch('https://api.mountsea.ai/suno/v2/voicePersona/init', 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/voicePersona/init",
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([
'voice_audio_url' => 'https://example.com/my-voice.wav',
'language' => 'zh',
'vocal_start_s' => 0,
'vocal_end_s' => 12.6
]),
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.mountsea.ai/suno/v2/voicePersona/init"
payload := strings.NewReader("{\n \"voice_audio_url\": \"https://example.com/my-voice.wav\",\n \"language\": \"zh\",\n \"vocal_start_s\": 0,\n \"vocal_end_s\": 12.6\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.mountsea.ai/suno/v2/voicePersona/init")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"voice_audio_url\": \"https://example.com/my-voice.wav\",\n \"language\": \"zh\",\n \"vocal_start_s\": 0,\n \"vocal_end_s\": 12.6\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mountsea.ai/suno/v2/voicePersona/init")
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 \"voice_audio_url\": \"https://example.com/my-voice.wav\",\n \"language\": \"zh\",\n \"vocal_start_s\": 0,\n \"vocal_end_s\": 12.6\n}"
response = http.request(request)
puts response.read_body{
"taskId": "15c257ff-43f7-4678-bd41-202ad6b8488b"
}This is Phase 1 of the free Init + Complete Voice Persona flow. Same result as paid Clone Voice. See the full workflow guide.
taskId and wait for status to become awaiting (not success). The data field will contain phrase_text — the text the user must read aloud and record.
Once you have the recording, call Complete with the same taskId within 30 seconds.
The
language parameter determines the language of the verification phrase. Choose a language that matches the user’s voice audio for best results. Supported: zh, en, ja, ko, es, fr, de, pt, ru, hi.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
application/json
Response
201 - application/json
task id. Use this id to query task status.
Example:
"15c257ff-43f7-4678-bd41-202ad6b8488b"