API de texto a voz
Convierta texto en voz con el endpoint compatible con OpenAI o el nativo (MiniMax Speech 2.8 y voz de Doubao), además de la clonación de voz de Doubao.
| Elemento | Valor |
|---|---|
| Base URL | https://api.hop-base.com |
| Compatible con OpenAI | POST /v1/audio/speech |
| Nativo (todos los parámetros, streaming; solo MiniMax) | POST /v1/t2a_v2 |
| Clonación de voz (Doubao) | POST /v1/voice_clone |
Esta página trata dos familias de modelos de voz. MiniMax Speech 2.8 pertenece a su propio grupo, MiniMax Speech oficial, y es la que describen por defecto las secciones siguientes. La voz de Doubao de ByteDance (seed-tts-2.0, seed-audio-1.0) pertenece a otro grupo y solo usa el endpoint compatible con OpenAI; vea Voz de Doubao. La clonación de voz con seed-icl-2.0, del mismo grupo, se explica en Clonación de voz de Doubao. Una clave solo llega a estos modelos si incluye el grupo correspondiente; puede añadir el grupo a una clave de chat o video existente en lugar de crear una nueva.
Sintetizar voz
Ambos endpoints devuelven el clip completo de forma síncrona. Use el endpoint compatible con OpenAI para trabajar directamente con los SDK de OpenAI, y el nativo para el conjunto completo de parámetros y el streaming.
MiniMax Speech 2.8 convierte texto en audio de forma síncrona: la respuesta es el propio audio, sin ninguna tarea que consultar. Usa la misma Base URL (vea la tabla al inicio de la página) y la misma autenticación Bearer que el resto de modelos; no hay un host ni una credencial de audio aparte.
| ID de modelo | Posicionamiento |
|---|---|
speech-2.8-hd | Máxima calidad |
speech-2.8-turbo | Más rápido y con tarifa menor |
Los ID distinguen mayúsculas y minúsculas y no tienen alias; tts-1 / tts-1-hd no se reconocen. Use una clave con este grupo habilitado y confirme los ID con GET /v1/models.
| Endpoint | Indicado para | Límite de texto |
|---|---|---|
POST /v1/audio/speech | Usar los SDK de OpenAI sin cambios | 4096 caracteres |
POST /v1/t2a_v2 | Todos los parámetros y streaming | 10.000 caracteres |
curl https://api.hop-base.com/v1/audio/speech \
-H "Authorization: Bearer sk-tu-clave" \
-H "Content-Type: application/json" \
-d '{
"model": "speech-2.8-turbo",
"input": "Hola, mundo.",
"voice": "English_expressive_narrator",
"response_format": "mp3"
}' \
--output hola.mp3Endpoint compatible con OpenAI
POST /v1/audio/speech acepta la estructura de solicitud de OpenAI y responde con los bytes de audio sin envolver. Los campos también están en la referencia de la API.
| Parámetro | Obligatorio | Tipo y límites | Predeterminado | Descripción |
|---|---|---|---|---|
model | Obligatorio | speech-2.8-hd / speech-2.8-turbo | — | Distingue mayúsculas y minúsculas |
input | Obligatorio | cadena, 1-4096 caracteres | — | — |
voice | Opcional | ID de voz del sistema o clonada, o nombre de voz de OpenAI | según el texto, vea abajo | — |
response_format | Opcional | mp3 / opus / flac / wav / pcm | mp3 | aac devuelve 400 |
speed | Opcional | número 0.25-4 | 1.0 | Fuera del rango devuelve 400 |
- Sin
voice, el texto con caracteres chinos usaChinese (Mandarin)_News_Anchor; el resto usaEnglish_expressive_narrator. - Los nombres de voz de OpenAI usan la misma voz predeterminada.
- Un
speeddentro del rango se ajusta a 0.5-2. stream_formatno es compatible y devuelve 400.
- Nombres de voz de OpenAI admitidos:
alloy,ash,ballad,cedar,coral,echo,fable,marin,nova,onyx,sage,shimmer,verse. opuses Ogg a 24 kHz.instructionsse acepta y se ignora.- Cualquier otro campo devuelve 400
unknown field, incluidos los nativos comosample_rate,language_boostovoice_setting. Para ellos use el endpoint nativo. - El
Content-Typede la respuesta esaudio/mpeg,audio/ogg,audio/flac,audio/wavoaudio/pcm, segúnresponse_format.
Con los SDK oficiales de openai solo cambian la Base URL y los valores de model / voice:
from openai import OpenAI
client = OpenAI(base_url="https://api.hop-base.com/v1", api_key="sk-tu-clave")
response = client.audio.speech.create(
model="speech-2.8-turbo",
voice="English_expressive_narrator",
input="Hola, mundo.",
response_format="mp3",
)
response.write_to_file("hola.mp3")
# Texto largo: escriba los bytes en disco a medida que llegan
# en lugar de acumular todo el clip
with client.audio.speech.with_streaming_response.create(
model="speech-2.8-turbo",
voice="English_expressive_narrator",
input="Aquí va un guion más largo.",
) as streamed:
streamed.stream_to_file("largo.mp3")Endpoint nativo
POST /v1/t2a_v2 toma el cuerpo de solicitud T2A v2 de MiniMax tal cual, y los campos que la pasarela no conoce se reenvían sin cambios. La respuesta JSON también sigue la estructura oficial, salvo los errores.
data.audio es el audio codificado en hexadecimal y extra_info incluye usage_characters y los metadatos del audio. stream: true cambia a SSE; vea Streaming.
import requests
resp = requests.post(
"https://api.hop-base.com/v1/t2a_v2",
headers={"Authorization": "Bearer sk-tu-clave"},
json={
"model": "speech-2.8-hd",
"text": "你好,世界",
"voice_setting": {"voice_id": "Chinese (Mandarin)_News_Anchor", "speed": 1.0},
"audio_setting": {"format": "mp3", "sample_rate": 32000},
},
)
body = resp.json()
open("hola.mp3", "wb").write(bytes.fromhex(body["data"]["audio"]))
print(body["extra_info"]["usage_characters"]) # caracteres facturadosEn el endpoint nativo la pasarela solo hace tres cosas:
- Valida
model, la longitud detext,streamyoutput_format. - Ajusta
voice_setting.speedal rango oficial. - Limita el cuerpo a 1 MiB.
El resto se reenvía tal cual, y un valor fuera del rango oficial lo rechaza el servicio con 400. Los valores y predeterminados de las tablas siguientes son los oficiales.
| Parámetro | Obligatorio | Tipo y límites | Predeterminado | Descripción |
|---|---|---|---|---|
model | Obligatorio | speech-2.8-hd / speech-2.8-turbo | — | — |
text | Obligatorio | cadena, 1-10.000 caracteres | — | Separe los párrafos con saltos de línea |
stream | Opcional | true / false | false | true cambia la respuesta a SSE |
stream_options.exclude_aggregated_audio | Opcional | true / false | false | true quita el audio completo del fragmento final |
language_boost | Opcional | auto, o un idioma de la lista de abajo | sin definir | Refuerza el reconocimiento de ese idioma o dialecto |
pronunciation_dict.tone | Opcional | array de cadenas original/sustitución | — | Todas las reglas se aplican a la vez |
voice_modify | Opcional | vea abajo | — | Se reenvía sin validación en la pasarela |
output_format | Opcional | hex | hex | url devuelve 400 |
- Los controles en línea de
textestán en «Controles en línea dentro del texto». Oficialmente se recomienda streaming a partir de 3000 caracteres. - Idiomas de
language_boost:Chinese,Chinese,Yue,English,Arabic,Russian,Spanish,French,Portuguese,German,Turkish,Dutch,Ukrainian,Vietnamese,Indonesian,Japanese,Italian,Korean,Thai,Polish,Romanian,Greek,Czech,Finnish,Hindi,Bulgarian,Danish,Hebrew,Malay,Persian,Slovak,Swedish,Croatian,Filipino,Hungarian,Norwegian,Slovenian,Catalan,Nynorsk,Tamil,Afrikaans. - Con
language_boostenautoel modelo detecta el idioma; las voces en cantonés necesitanChinese,Yue. - Una sustitución de
pronunciation_dict.tonepuede ser texto plano (omg/oh my god) o kana japonés (東京/トウキョウ). - También puede ser pinyin con números de tono 1-5 entre paréntesis (
处理/(chu3)(li3)) o IPA entre paréntesis (resume/(rɪˈzjuːm)). voice_modifyaceptapitch,intensityytimbrecomo enteros de -100 a 100.- Semántica oficial:
pitchmás grave → más brillante,intensitymás fuerte → más suave,timbremás lleno → más nítido. voice_modify.sound_effectsaceptaspacious_echo/auditorium_echo/lofi_telephone/robotic, un solo efecto a la vez.- Con un efecto, sin streaming funcionan
mp3/wav/flac, y con streaming solomp3.
| Parámetro | Obligatorio | Tipo y límites | Predeterminado | Descripción |
|---|---|---|---|---|
voice_id | Obligatorio | ID de voz del sistema o clonada | — | Vea Voces del sistema, Clonación de voz |
speed | Opcional | 0.5-2 | 1.0 | La pasarela ajusta al rango los valores que quedan fuera |
vol | Opcional | mayor que 0, hasta 10 | 1.0 | Volumen |
pitch | Opcional | entero de -12 a 12 | 0 | 0 conserva el tono original |
emotion | Opcional | vea abajo | se elige según el texto | Indíquelo solo si necesita una emoción fija |
text_normalization | Opcional | true / false | false | Lectura normalizada de números en chino / inglés, con algo más de latencia |
latex_read | Opcional | true / false | false | Solo chino; envuelva las fórmulas en $$ |
emotionaceptahappy/sad/angry/fearful/disgusted/surprised/calm/fluent/whisper.fluentywhisperestán documentados para la serie 2.6;whisperno es compatible con Speech 2.8 de forma explícita.latex_readfuerzalanguage_boostaChinese.
| Parámetro | Obligatorio | Tipo y límites | Predeterminado | Descripción |
|---|---|---|---|---|
format | Opcional | mp3 / pcm / flac / wav / opus | mp3 | opus es Ogg/Opus |
sample_rate | Obligatorio con opus | 8000 / 16000 / 22050 / 24000 / 32000 / 44100 | no consta oficialmente | — |
bitrate | Opcional | 32000 / 64000 / 128000 / 256000 | no consta oficialmente | Solo mp3 |
channel | Opcional | 1 / 2 | 1 | Mono / estéreo |
force_cbr | Opcional | true / false | false | Tasa de bits constante; solo mp3 en streaming |
opusexige unsample_rateexplícito.- No constan predeterminados oficiales para
sample_rateybitrate; los ejemplos oficiales usan32000y128000.
Pausa
- Escriba
<#x#>conxen segundos, de 0.01 a 99.99 y hasta dos decimales, por ejemploHola<#0.5#>mundo. - Colóquela entre dos segmentos pronunciables; dos marcas seguidas se rechazan.
- Cada marca se factura como 1 carácter.
Pronunciación en línea
- Justo después de la palabra objetivo, escriba entre paréntesis de ancho medio pinyin con números de tono 1-5, IPA o jyutping cantonés con tonos 1-6.
- Ejemplos:
This is (he2)平, not (huo4)面.,pronounced (lɪv) as a verb,去街市買啲(sung3)。
Interjecciones (solo Speech 2.8)
(laughs) (chuckle) (coughs) (clear-throat) (groans) (breath) (pant) (inhale) (exhale) (gasps)
(sniffs) (sighs) (snorts) (burps) (lip-smacking) (humming) (hissing) (emm) (sneezes)Voces del sistema
Todas las voces de la lista oficial de voces del sistema de MiniMax — 332 voces en 24 idiomas — funcionan aquí; pase el voice_id exactamente como aparece allí. La tabla siguiente es solo una selección inicial.
Use la columna voice_id tal cual: mayúsculas, espacios y paréntesis incluidos. Nombre es la etiqueta oficial.
voice_id | Idioma | Nombre |
|---|---|---|
English_expressive_narrator | Inglés | Expressive Narrator |
English_radiant_girl | Inglés | Radiant Girl |
English_magnetic_voiced_man | Inglés | Magnetic-voiced Male |
English_compelling_lady1 | Inglés | Compelling Lady |
English_Aussie_Bloke | Inglés | Aussie Bloke |
English_captivating_female1 | Inglés | Captivating Female |
English_Upbeat_Woman | Inglés | Upbeat Woman |
English_Trustworth_Man | Inglés | Trustworthy Man |
Chinese (Mandarin)_Reliable_Executive | Mandarín | Reliable Executive |
Chinese (Mandarin)_News_Anchor | Mandarín | News Anchor |
Chinese (Mandarin)_Unrestrained_Young_Man | Mandarín | Unrestrained Young Man |
Chinese (Mandarin)_Mature_Woman | Mandarín | Mature Woman |
Arrogant_Miss | Mandarín | Arrogant Miss |
Robot_Armor | Mandarín | Robot Armor |
Chinese (Mandarin)_Kind-hearted_Antie | Mandarín | Kind-hearted Antie |
Chinese (Mandarin)_HK_Flight_Attendant | Mandarín | HK Flight Attendant |
Japanese_IntellectualSenior | Japonés | Intellectual Senior |
Japanese_DecisivePrincess | Japonés | Decisive Princess |
Japanese_LoyalKnight | Japonés | Loyal Knight |
Spanish_SereneWoman | Español | Serene Woman |
Spanish_MaturePartner | Español | Mature Partner |
Spanish_CaptivatingStoryteller | Español | Captivating Storyteller |
Cantonese_GentleLady | Cantonés | Gentle Lady |
- Las voces en cantonés necesitan
language_boost: "Chinese,Yue". - Use una voz en mandarín para texto en chino.
- Verificado el 2026-09-16: solo fallan dos voces de la lista oficial; el servicio las rechaza con "voice id not exist".
- Son
Cantonese_ProfessionalHost (F)yCantonese_ProfessionalHost (M). POST /v1/get_voicecon{"voice_type": "system"}devuelve la lista de voces del sistema.
Streaming
En el endpoint nativo, stream: true cambia la respuesta a SSE. Cada evento data: {...} lleva un fragmento de audio en hexadecimal, y el evento final tiene data.status 2 más extra_info. Lea el cuerpo línea a línea, decodifique el fragmento de cada evento y añádalo al archivo.
Por defecto, el data.audio del evento final repite el clip completo, y un append ingenuo duplica el audio. Con stream_options.exclude_aggregated_audio: true, el evento final lleva solo extra_info.
import json
import requests
with requests.post(
"https://api.hop-base.com/v1/t2a_v2",
headers={"Authorization": "Bearer sk-tu-clave"},
json={
"model": "speech-2.8-turbo",
"text": "Aquí va un guion más largo.",
"stream": True,
"stream_options": {"exclude_aggregated_audio": True},
"voice_setting": {"voice_id": "Spanish_SereneWoman"},
"audio_setting": {"format": "mp3", "sample_rate": 32000},
},
stream=True,
timeout=(10, 300),
) as resp, open("largo.mp3", "wb") as out:
resp.raise_for_status()
for line in resp.iter_lines():
if not line.startswith(b"data:"):
continue
event = json.loads(line[5:])
base = event.get("base_resp") or {}
if base.get("status_code", 0) != 0: # fallo a mitad: no se factura y el stream termina
raise RuntimeError(base.get("status_msg"))
data = event.get("data") or {}
if data.get("audio"):
out.write(bytes.fromhex(data["audio"]))
if data.get("status") == 2:
print(event["extra_info"]["usage_characters"]) # caracteres facturadosLatencia y tiempos de espera
Medido con texto corto (una o dos frases): los endpoints síncronos devuelven el clip completo en unos 1.5-2.4 s, y con stream: true el primer fragmento de audio llega en aproximadamente 1 s.
La latencia crece con la longitud del texto, así que use streaming para todo lo largo (MiniMax recomienda streaming a partir de 3000 caracteres). Para las solicitudes síncronas, siga la misma pauta de cliente que los demás endpoints síncronos en Concurrencia, tiempos de espera y facturación: un tiempo de lectura de 300 s o más.
Clonación de voz
Clone una voz a partir de su propia grabación y úsela en ambos endpoints como una voz del sistema. El flujo replica la API oficial de clonación de voz de MiniMax, así que el código de los SDK oficiales funciona cambiando la Base URL y la clave. El grupo de la clave debe incluir los modelos de MiniMax Speech.
Clone solo su propia voz o la de un hablante que le haya dado permiso explícito por escrito. Usted es responsable del uso lícito, incluidas las normas sobre síntesis profunda y derechos de imagen y voz.
1. Suba el audio
POST /v1/files/upload recibe multipart/form-data con exactamente estos dos campos; cualquier otro devuelve 400.
| Parámetro | Obligatorio | Tipo y límites | Predeterminado | Descripción |
|---|---|---|---|---|
purpose | Obligatorio | voice_clone / prompt_audio | — | Vea abajo |
file | Obligatorio | un archivo con extensión .mp3 / .m4a / .wav, ≤20 MB | — | El formato y el tamaño se validan al subir |
voice_clonees la grabación a clonar;prompt_audioes un fragmento de ejemplo opcional.- Duración:
voice_clonede 10 s a 5 min,prompt_audiomenos de 8 s. - La duración se valida al clonar.
curl https://api.hop-base.com/v1/files/upload \
-H "Authorization: Bearer sk-your-key" \
-F purpose=voice_clone \
-F file=@my_voice.mp3
# → {"file":{"file_id":123456789,"bytes":…,"created_at":…,"filename":"my_voice.mp3","purpose":"voice_clone"},"base_resp":{…}}2. Clone la voz
POST /v1/voice_clone recibe el file_id y un voice_id que usted elige. Añada text y model para obtener una vista previa.
curl https://api.hop-base.com/v1/voice_clone \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
-d '{
"file_id": 123456789,
"voice_id": "MyNarrator01",
"text": "Hello, this is my cloned voice.",
"model": "speech-2.8-hd",
"need_noise_reduction": true
}'
# respuesta: input_sensitive, input_sensitive_type, demo_audio (enlace de descarga de la vista previa en api.hop-base.com, válido 24 horas; vacío sin text), extra_info.usage_characters (caracteres facturados de la vista previa), base_resp| Parámetro | Obligatorio | Tipo y límites | Predeterminado | Descripción |
|---|---|---|---|---|
file_id | Obligatorio | entero del paso 1 | — | De un solo uso |
voice_id | Obligatorio | 8-256 caracteres, reglas abajo | — | Único en su cuenta |
clone_prompt | Opcional | objeto, vea abajo | — | Fragmento de ejemplo |
text | Opcional | texto de vista previa, ≤1000 caracteres | — | Devuelve una vista previa, facturada como caracteres de voz |
model | Obligatorio con text | speech-2.8-hd / speech-2.8-turbo | — | — |
language_boost | Opcional | mismos valores que en el endpoint nativo | — | — |
text_validation | Opcional | transcripción esperada, ≤200 caracteres | — | Verificación del audio de origen por reconocimiento de voz |
accuracy | Opcional | número 0-1 | 0.7 | Umbral de aprobación de text_validation |
need_noise_reduction | Opcional | booleano | false | — |
need_volume_normalization | Opcional | booleano | false | — |
aigc_watermark | Opcional | booleano | false | — |
voice_idusa letras, dígitos,-y_; empieza por letra y no termina en-ni_.clone_promptes{"prompt_audio": <file_id>, "prompt_text": "…"}, y ambas claves son obligatorias.prompt_textes la transcripción exacta del fragmento, terminada en puntuación.
Use la voz clonada
Pase su voice_id como voice en /v1/audio/speech, o como voice_setting.voice_id (también timber_weights[].voice_id) en /v1/t2a_v2.
curl https://api.hop-base.com/v1/audio/speech \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
-d '{"model": "speech-2.8-turbo", "input": "Hello again.", "voice": "MyNarrator01"}' \
--output cloned.mp3Ciclo de vida
- Los archivos subidos son de un solo uso: una clonación correcta elimina el archivo de origen y el de ejemplo, así que vuelva a subirlos para clonar otra vez.
- Si la clonación falla, los archivos se conservan para reintentar.
- Los archivos sin usar se eliminan 24 horas después de subirlos. Eliminar un archivo nunca afecta a las voces ya clonadas.
- Una voz que no se usa para sintetizar en los 7 días siguientes a la clonación se elimina, y no se cobra tarifa de clonación por ella.
- Las voces son privadas de su cuenta (en una cuenta de empresa, las comparten las claves de los miembros del titular); otras cuentas no pueden usarlas aunque conozcan el
voice_id.
POST /v1/get_voicelista sus voces (voice_id,description,created_time).POST /v1/delete_voiceelimina una voz y libera su nombre.GET /v1/files/list/GET /v1/files/retrieve/POST /v1/files/deletegestionan los archivos subidos aún sin usar.- El audio subido no se puede descargar.
# Lista sus voces clonadas ("system" = voces del sistema, "all" = ambas; "voice_generation" siempre está vacío)
curl https://api.hop-base.com/v1/get_voice \
-H "Authorization: Bearer sk-your-key" -H "Content-Type: application/json" \
-d '{"voice_type": "voice_cloning"}'
# Elimina una voz clonada
curl https://api.hop-base.com/v1/delete_voice \
-H "Authorization: Bearer sk-your-key" -H "Content-Type: application/json" \
-d '{"voice_type": "voice_cloning", "voice_id": "MyNarrator01"}'
# Archivos subidos aún sin usar: listar, consultar, eliminar
curl "https://api.hop-base.com/v1/files/list?purpose=voice_clone" -H "Authorization: Bearer sk-your-key"
curl "https://api.hop-base.com/v1/files/retrieve?file_id=123456789" -H "Authorization: Bearer sk-your-key"
curl https://api.hop-base.com/v1/files/delete \
-H "Authorization: Bearer sk-your-key" -H "Content-Type: application/json" \
-d '{"file_id": 123456789, "purpose": "voice_clone"}'Facturación
La voz se factura por carácter facturado. El recuento autoritativo es extra_info.usage_characters en la respuesta nativa; el endpoint compatible con OpenAI solo devuelve audio, así que consulte la misma cifra como tts_characters en el registro de uso de la consola.
Cada carácter Unicode cuenta 1, y cada carácter chino (CJK) cuenta 1 más, de modo que un carácter chino cuenta 2. La puntuación, los espacios, los emoji y las marcas de pausa como <#0.5#> cuentan 1 cada uno.
Hello, world.→ 13 caracteres facturados你好,世界→ 5 caracteres, 4 de ellos chinos → 9 caracteres facturados
Una solicitud rechazada con 400 o que falla durante la síntesis no se factura, y un stream que termina antes del evento final tampoco. Los precios de lista oficiales por millón de caracteres están en la página de precios; la tarifa de su grupo aparece en el catálogo de modelos con la sesión iniciada.
Tarifa de clonación
Subir y clonar es gratis. La tarifa de clonación se cobra una sola vez, con la primera síntesis correcta de la voz, y aparece como un concepto adicional voice_clone_activation en el registro de uso de esa síntesis.
El text de vista previa se factura solo como caracteres de voz y no cuenta como primer uso; las solicitudes fallidas no se facturan. La tarifa figura en la página de precios.
Errores y recomendaciones
En ambos endpoints los errores son un estado distinto de 200 con {"error":{…}}, no base_resp. Las validaciones propias del gateway (modelo, texto, formato, velocidad, campos desconocidos) no llevan code; guíese por message.
| Estado | Causa | Qué hacer |
|---|---|---|
| 400 | Valor fuera de rango, o stream_format / output_format: "url" | Corrija el campo que indica message; no reintente tal cual |
| 400 | opus sin sample_rate | Pase sample_rate de forma explícita |
| 400 | ID de voz desconocido, o voz clonada eliminada o caducada | Use un ID de Voces del sistema tal cual, o vuelva a clonar |
| 400 | Texto por encima del límite (4096 / 10.000 caracteres) | Divida el guion y envíelo por partes |
| 400 | Formato no compatible, como response_format: "aac" | Use mp3 / opus / flac / wav / pcm |
| 400 | Clonación: archivo, nombre de voz, duración o verificación | Actúe según los mensajes de abajo |
| 402 | Saldo de la cuenta o cuota de la clave agotados | Recargue o amplíe la cuota de la clave; no reintente en bucle |
| 404 | El modelo no está en el grupo de la clave | Confírmelo con GET /v1/models |
| 429 | Límite de tasa o de concurrencia | Reintente según Retry-After y reduzca la concurrencia |
| 503 | No hay servicio disponible en este momento | Espere y reintente (2 s, 5 s, 15 s, hasta tres intentos) |
Los 400 de clonación cubren un file_id usado o caducado, un voice_id ya ocupado, una duración del audio fuera de rango o una verificación de text_validation fallida. Mensajes habituales y cómo actuar:
400 voice id not exist ID de voz desconocido, o voz clonada eliminada / caducada
400 file_id ... does not exist; uploaded files are single-use and expire 24 hours after upload vuelva a subir el audio
400 voice_id ... already exists elija otro nombre o elimine la voz anterior
400 (clonación) duración del audio fuera de rango origen de 10 s a 5 min, ejemplo de menos de 8 s
400 (clonación) falla del reconocimiento de voz solo con text_validation: corrija la transcripción o baje accuracy
503 voice cloning is temporarily unavailable reintente más tarde
400 sensitive content / >10% invalid chars reescriba o limpie el texto
400 invalid request parameters; check text, voice_setting and audio_setting (opus requires an explicit sample_rate)
413 request body exceeds the 1048576 byte limit (got N bytes) cuerpo de más de 1 MiB
502 response_size_limit_exceeded (audio over 64 MiB) use stream: true, texto más corto o menor bitrate
stream que falla a mitad: un último evento data: {"base_resp":{...}} y se cierra; no se facturaVoz de Doubao
Los dos modelos de voz Doubao de ByteDance pertenecen a su propio grupo, Doubao Voz en la nube. Una clave solo llega a ellos si incluye este grupo; puede añadirlo a una clave existente. Solo usan el endpoint compatible con OpenAI POST /v1/audio/speech, devuelven el clip completo de forma síncrona y no admiten streaming. El endpoint nativo /v1/t2a_v2 no admite estos dos modelos y devuelve 400 indicando que use /v1/audio/speech.
| ID de modelo | Posicionamiento | Precio oficial |
|---|---|---|
seed-tts-2.0 | Doubao Seed TTS 2.0 (Doubao-Seed-TTS-2.0), texto a voz | ¥3 / 10.000 caracteres |
seed-audio-1.0 | Doubao Seed Audio 1.0, genera audio con entonación y efectos de sonido a partir de la descripción de una escena | ¥1 / minuto (según la duración del audio generado) |
seed-icl-2.0 | Doubao Voice Cloning 2.0, sintetiza con una voz que usted clonó; vea Clonación de voz de Doubao | ¥3 / 10.000 caracteres |
curl https://api.hop-base.com/v1/audio/speech \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
-d '{
"model": "seed-tts-2.0",
"input": "你好,欢迎使用豆包语音合成。",
"voice": "zh_female_vv_uranus_bigtts"
}' \
-o out.mp3Con el SDK oficial openai, solo cambie la Base URL y los valores de model / voice. Con seed-audio-1.0, escriba la escena y los diálogos en input:
from openai import OpenAI
client = OpenAI(base_url="https://api.hop-base.com/v1", api_key="sk-your-key")
response = client.audio.speech.create(
model="seed-tts-2.0",
voice="en_female_dacey_uranus_bigtts",
input="Hola, bienvenido a la síntesis de voz de Doubao.",
)
response.write_to_file("out.mp3")
# Audio de escena: escriba "descripción de la escena + diálogos" en input; tarda unos 10-30 s
scene = client.audio.speech.create(
model="seed-audio-1.0",
voice="alloy", # el SDK exige voice; un nombre de voz de OpenAI equivale a no indicarla y la voz la decide la descripción
input="先是一声手机震动的声音,随后一名男子(中青年,嗓音低沉)用严肃语气说道:“钟sir,你是什么时候被收买的?”",
timeout=300,
)
scene.write_to_file("scene.mp3")Parámetros de voz de Doubao
| Parámetro | Obligatorio | Tipo y límites | Valor por defecto | Notas |
|---|---|---|---|---|
model | Obligatorio | seed-tts-2.0 / seed-audio-1.0 | — | Distingue mayúsculas y minúsculas |
input | Obligatorio | Cadena; como máximo 5.000 caracteres en seed-tts-2.0 y 3.000 en seed-audio-1.0 | — | Se cuenta en caracteres: cada carácter chino, letra o signo de puntuación cuenta como 1; si se supera, devuelve 400 input_too_long |
voice | Opcional | ID de voz de Doubao o nombre de voz de OpenAI | Vea abajo | Una voz inexistente devuelve 400 unknown_voice |
response_format | Opcional | seed-tts-2.0: mp3 / opus / aac / wav / pcm; seed-audio-1.0: mp3 / wav / pcm / flac | mp3 | Los formatos no listados devuelven 400 |
speed | Opcional | De 0.5 a 2.0 | 1.0 | Los valores fuera de rango devuelven 400 |
instructions | Opcional | Cadena | — | Se acepta, pero no tiene efecto; ponga el tono y la emoción en input |
seed-tts-2.0: sinvoice, o con un nombre de voz estándar de OpenAI comoalloy, la voz por defecto depende del idioma del texto:zh_female_vv_uranus_bigttspara chino yen_female_dacey_uranus_bigttspara los demás idiomas. Puede elegir otras voces 2.0 (ID terminados en_uranus_bigtts, comozh_male_m191_uranus_bigtts).seed-audio-1.0: escriba "descripción de la escena + diálogos" eninput, como en el ejemplo de arriba. Sinvoice, o con un nombre de voz estándar de OpenAI, la voz la decide la descripción; también puede indicar un ID de voz de Doubao. Si la descripción es demasiado larga, el audio que pide puede superar la duración máxima del modelo y la solicitud devuelve 400duration_out_of_range; acórtela y vuelva a enviarla.- Salida:
seed-tts-2.0es mono a 24 kHz (pcmson datos sin procesar mono de 16 bits a 24 kHz, igual que en OpenAI);seed-audio-1.0es estéreo a 48 kHz. - No admite streaming;
stream_formatdevuelve 400. Si la voz no coincide con el idioma del texto (por ejemplo, una voz inglesa leyendo texto solo en chino) y no se genera audio, la solicitud devuelve 400no_audio. - Para textos más largos, divídalos en el cliente dentro del límite, pida cada fragmento y una el audio.
Tiempos y facturación
seed-tts-2.0: unos 1-3 s para una frase corta y unos 70 s para 2.000 caracteres.seed-audio-1.0: unos 10-30 s.- Ambos responden cuando el clip completo está generado. Configure el tiempo de lectura del cliente como en los demás endpoints síncronos de Concurrencia, tiempos de espera y facturación: al menos 300 segundos.
seed-tts-2.0se factura por caracteres de entrada yseed-audio-1.0por la duración del audio generado; los precios oficiales están en la tabla de modelos de arriba y la tarifa real de su grupo aparece en el catálogo de modelos con la sesión iniciada. Las solicitudes rechazadas con 400 o que fallan durante la generación no se facturan.
Cualquier valor fuera de la tabla anterior devuelve 400; corrija la solicitud según el error en lugar de reintentarla sin cambios. Llamar a /v1/t2a_v2 también devuelve 400. 402, 404, 429 y 503 significan lo mismo que en Errores y recomendaciones, más arriba.
Clonación de voz de Doubao
Clone una voz propia a partir de una grabación suya y sintetice voz con ella. El modelo es seed-icl-2.0 (Doubao Voice Cloning 2.0). Está en el mismo grupo que la voz de Doubao, Doubao Voz en la nube, y una clave solo llega a él si incluye este grupo. Son tres pasos: envíe la grabación a POST /v1/voice_clone para obtener un voice_id (empieza por hbv_), páselo como voice a POST /v1/audio/speech y, cuando ya no lo necesite, consúltelo o elimínelo.
El formato de la solicitud es distinto al de la clonación de voz de MiniMax de arriba: la grabación va directamente en el JSON como base64, sin subir antes un archivo, y los tres endpoints de clonación exigen "model": "seed-icl-2.0" en el cuerpo. Si usa la clonación de voz de MiniMax y la de Doubao a la vez, use una clave distinta para cada una.
Clone solo su propia voz o la de un hablante que le haya dado permiso explícito por escrito. Usted es responsable del uso lícito, incluidas las normas sobre síntesis profunda y derechos de imagen y voz.
Cupo durante la fase de prueba: Durante la fase de prueba, cada cuenta puede conservar una voz clonada. Para cambiar de voz, elimine la anterior y vuelva a clonar, o reentrénela enviando su voice_id. El cupo de voces clonadas es limitado; cuando está lleno, la solicitud devuelve 503 voice_capacity_full, así que vuelva a intentarlo más tarde.
1. Clone una voz
POST /v1/voice_clone recibe un cuerpo JSON de hasta 16 MiB.
| Parámetro | Obligatorio | Tipo y límites | Valor por defecto | Notas |
|---|---|---|---|---|
model | Obligatorio | seed-icl-2.0 | — | Distingue mayúsculas y minúsculas |
audio | Obligatorio | La grabación en base64 o como data:audio/…;base64,…; como máximo 10 MB una vez decodificada | — | wav / mp3 / ogg / m4a / aac / pcm |
format | Opcional | wav / mp3 / ogg / m4a / aac / pcm | Detección automática | Si se omite, se toma del tipo del data URI o de la cabecera del archivo; pcm debe ser mono a 24 kHz y siempre requiere format explícito |
text | Opcional | Cadena de hasta 1.000 caracteres | — | Transcripción literal de la grabación. Si difiere mucho del audio, la clonación falla con 400 audio_text_mismatch; si no está seguro, no lo envíe |
language | Opcional | Código de idioma, vea abajo | — | Idioma de la grabación |
demo_text | Opcional | 4-300 caracteres | — | La respuesta incluye entonces una muestra de la nueva voz leyendo este texto, facturada al precio de síntesis |
denoise | Opcional | Booleano | — | Reduce el ruido de la grabación antes de clonar |
voice_id | Opcional | Uno de sus hbv_… existentes | — | Reentrena esa voz en su sitio: sustituye la voz anterior, conserva el voice_id y consume un intento de entrenamiento. Omítalo para crear una voz nueva |
languageadmitezh,en,ja,es,id,pt,de,fr,ko,it,th,vi,ru,fil,ms,ar,es-mx,pt-br,pl,tr,sv.- La clonación termina de forma síncrona: en nuestra prueba, una grabación de 17 segundos tardó unos 33 segundos. Configure el tiempo de lectura del cliente en 300 s o más.
# Ponga la grabación en el cuerpo de la solicitud como base64 (jq 1.6+)
jq -n --rawfile audio <(base64 < my_voice.wav | tr -d '\n') \
'{model: "seed-icl-2.0", audio: $audio, language: "es", demo_text: "Hola, esta es mi voz clonada."}' > clone.json
curl https://api.hop-base.com/v1/voice_clone \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
--max-time 300 \
-d @clone.json{
"voice_id": "hbv_k3m9x2p7q8r4t6w1y5z0a2b4",
"status": "ready",
"language": "es",
"remaining_trainings": 14,
"created_at": 1792051200,
"demo_audio": "<audio en base64>",
"demo_audio_format": "wav"
}| Campo | Notas |
|---|---|
voice_id | ID de la voz clonada; páselo como voice al sintetizar |
status | ready ya se puede usar; training sigue entrenándose, consúltelo más tarde con POST /v1/get_voice; failed indica que el entrenamiento falló y puede reentrenarla enviando el voice_id o eliminarla |
language | Idioma de la grabación |
remaining_trainings | Intentos de entrenamiento que le quedan a esta voz (15 por voz); cuando se agotan, elimínela y vuelva a clonar |
created_at | Fecha de creación, en segundos Unix |
demo_audio / demo_audio_format | Solo si envió demo_text: la muestra en base64 y su formato |
2. Sintetice con la voz clonada
Llame a POST /v1/audio/speech con model igual a seed-icl-2.0 y voice igual a su voice_id. Todo lo demás (parámetros, formatos y límites) es igual que en seed-tts-2.0 (vea Parámetros de voz de Doubao): input de hasta 5.000 caracteres, response_format entre mp3 / opus / aac / wav / pcm, speed de 0,5 a 2,0, salida mono a 24 kHz, clip completo devuelto de forma síncrona y sin streaming.
curl https://api.hop-base.com/v1/audio/speech \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
-d '{"model": "seed-icl-2.0", "input": "La reunión se ha movido a las tres de la tarde.", "voice": "hbv_k3m9x2p7q8r4t6w1y5z0a2b4"}' \
-o cloned.mp3seed-icl-2.0solo funciona con una voz que usted haya clonado: si omitevoiceo envía una voz del sistema o un nombre de voz de OpenAI, devuelve 400voice_required.- Una voz clonada solo funciona con
seed-icl-2.0; con cualquier otro modelo devuelve 400unknown_voice. - Las voces clonadas son privadas de su cuenta (en una cuenta de empresa, las comparten las claves de los miembros del titular); otras cuentas no pueden usarlas aunque conozcan el
voice_id.
3. Consulte y elimine
Ambos endpoints son gratuitos y el cuerpo también necesita model.
# Liste sus voces clonadas (añada voice_id para consultar solo esa)
curl https://api.hop-base.com/v1/get_voice \
-H "Authorization: Bearer sk-your-key" -H "Content-Type: application/json" \
-d '{"model": "seed-icl-2.0"}'
# → {"voices":[{"voice_id":"hbv_k3m9x2p7q8r4t6w1y5z0a2b4","status":"ready","language":"es","remaining_trainings":14,"created_at":1792051200}]}
# Elimine una voz clonada
curl https://api.hop-base.com/v1/delete_voice \
-H "Authorization: Bearer sk-your-key" -H "Content-Type: application/json" \
-d '{"model": "seed-icl-2.0", "voice_id": "hbv_k3m9x2p7q8r4t6w1y5z0a2b4"}'
# → {"voice_id":"hbv_k3m9x2p7q8r4t6w1y5z0a2b4","deleted":true}Con voice_id, get_voice devuelve directamente el objeto de esa voz (los mismos campos que la respuesta de clonación, sin la muestra de audio). Tras eliminarla, ese voice_id ya no se puede usar y el cupo se libera de inmediato.
Facturación de la clonación de voz
- La síntesis con una voz clonada se factura por caracteres de entrada al precio oficial de ¥3 por 10.000 caracteres, igual que
seed-tts-2.0. - Muestra:
demo_textse factura por caracteres al mismo precio. - La clonación en sí, la consulta y la eliminación son gratuitas; por ahora no hay tarifa de clonación. Las solicitudes fallidas no se facturan.
La tarifa real de su grupo aparece en el catálogo de modelos con la sesión iniciada.
Errores de la clonación de voz
Los errores tienen el mismo formato que en los demás endpoints: un estado distinto de 200 más {"error":{"message","type","code"}}. Los errores de validación de parámetros no llevan code; guíese por el message.
| Estado | code | Causa | Qué hacer |
|---|---|---|---|
| 400 | — | Falta model o no es seed-icl-2.0; audio no es base64 válido, supera 10 MB o tiene un formato no admitido o no detectable; text demasiado largo, language no admitido o demo_text de longitud incorrecta; voice_id no empieza por hbv_ | Corrija lo que indique el message |
| 400 | voice_limit_reached | La cuenta ya tiene una voz clonada | Elimínela o reentrénela enviando su voice_id |
| 400 | audio_text_mismatch | La grabación no coincide con text | Corrija text o no lo envíe |
| 400 | invalid_audio | La grabación fue rechazada, por ejemplo por su duración, frecuencia de muestreo o codificación | Use una grabación limpia |
| 400 | no_trainings_left | A esta voz no le quedan intentos de entrenamiento | Elimínela y vuelva a clonar |
| 400 | unknown_voice | El voice_id no existe, se eliminó o pertenece a otra cuenta; o se usó una voz clonada con un modelo distinto de seed-icl-2.0 | Compruébelo con POST /v1/get_voice |
| 400 | voice_required | Síntesis con seed-icl-2.0 sin voz clonada | Clone primero y pase el voice_id como voice |
| 400 | voice_not_ready | La voz aún se está creando o entrenando | Vuelva a intentarlo en un momento |
| 400 | voice_training_failed | El entrenamiento falló | Reentrénela enviando el voice_id o elimínela |
| 409 | voice_clone_in_progress | Otra solicitud de clonación o eliminación de la misma cuenta sigue en curso | Vuelva a enviarla cuando termine |
| 413 | — | El cuerpo de la solicitud supera 16 MiB | Comprima o acorte la grabación |
| 503 | voice_capacity_full | El cupo de voces clonadas está lleno temporalmente | Vuelva a intentarlo más tarde |
| 503 | voice_unavailable, voice_registry_unavailable | No disponible temporalmente | Reintente con espera progresiva |
Próximos pasos
- Modelos disponibles: todos los ID de modelo y su grupo
- Referencia de la API: Crear voz
- API de video MiniMax Hailuo H3
- Códigos de error y reintentos
- Concurrencia, tiempos de espera y facturación