Voz y catálogo
GET /v1/chat/catalog devuelve modelos públicos, voces y precios actuales. El texto usa POST /v1/chat/completions y la voz los endpoints siguientes.
Modelos y precios
Cargando el catálogo…
Reconocimiento de voz
POST /v1/chat/transcribe acepta { "audio": "data:audio/webm;base64,..." } o base64 sin prefijo, hasta 10 MB decodificados. Devuelve text y language.
Síntesis de voz
Cargando el catálogo…
Despliega un modelo para ver nombres, ID e idiomas de sus voces activadas. Las desactivadas se omiten y no pueden usarse en nuevas síntesis. Desactivar un modelo excluye todas sus voces; reactivarlo conserva sus ajustes individuales. Si la voz predeterminada o su modelo están desactivados, se selecciona otra voz activada. Actualiza para obtener la configuración vigente.
POST /v1/chat/speech acepta { "text": "Hello", "voice": "speech-light:af_bella" }, hasta 2.000 caracteres. Sin voice, usa la voz predeterminada. Utiliza voices[].id; modelId identifica el modelo vocal y su tarifa. Chat y voz eligen modelos de forma independiente.
La respuesta incluye audio (data:audio/mpeg;base64,...), voice y billing: { model, credits, characters, price, unit: "1000_characters" }. Todas las voces, incluida Speech Pro, devuelven MP3. Asigna audio al src de un elemento de audio o decodifica el base64 tras la coma y guárdalo como .mp3. Consulta el ejemplo Python.
Audio en streaming
Envía "stream": true al mismo endpoint. Speech Standard, Speech Light, Speech Pro y Speech Expressive lo admiten; consulta speechModels[].streaming. Omitirlo o usar false conserva la respuesta JSON.
{ "text": "Hello. How was your day?", "voice": "speech-pro:Ashley", "stream": true }La respuesta es un flujo binario MP3 continuo con Content-Type: audio/mpeg, no JSON, base64 ni SSE. El proxy reenvía el audio al recibirlo; Speech Pro se convierte progresivamente a MP3. Esto no garantiza la latencia de generación del modelo. El texto se envía en una sola solicitud, sin dividirlo automáticamente en frases.
Con curl y FFmpeg puedes reproducir durante la recepción:
curl --fail --no-buffer https://api.coldstart.win/v1/chat/speech \
-H "Authorization: Bearer $COLDSTART_API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Hello. How was your day?","voice":"speech-pro:Ashley","stream":true}' \
| ffplay -nodisp -autoexit -f mp3 -i pipe:0El cliente de llamadas debe alimentar continuamente un decodificador MP3 persistente. En un navegador usa response.body.getReader(); blob(), arrayBuffer() y json() esperan la respuesta completa. Los fragmentos de red son rangos arbitrarios de bytes, no archivos MP3 independientes. Cancela fetch y el lector si el usuario interrumpe o cuelga. Sigue siendo necesaria la interacción que el navegador exige para reproducir audio.
Cabeceras: X-Speech-Voice (ID público codificado para URL), X-Speech-Credits, X-Speech-Characters, X-Speech-Usage-Id. El importe es el débito inicial; las solicitudes completadas cuestan lo mismo que sin streaming. Un fallo o desconexión antes de terminar el procesamiento del servidor se reembolsa y registra como fallo. Cancelar después no revierte un cargo ya completado.
Antes de comenzar el audio, los errores usan HTTP y JSON habituales. Después, un fallo cierra la conexión abruptamente. Descarta la salida incompleta y comprueba el cargo final en el historial de uso. HTTP 200 o recibir el primer fragmento no garantizan que haya terminado correctamente. Otros proxys deben desactivar el almacenamiento en búfer y la compresión de esta ruta. La API envía X-Accel-Buffering: no y Cache-Control: no-store, no-transform.
Si la política de contenido rechaza explícitamente el texto, ambos modos devuelven 400 content_policy_violation antes del audio y reembolsan el cargo. No reintentes automáticamente el mismo texto; modifícalo para cumplir la política. El streaming no elimina restricciones de contenido.
Las solicitudes de voz son independientes. Indica el ID público de voz deseado. El JSON contiene audio data URI y facturación; el streaming devuelve bytes de audio.
Coste de voz = caracteres facturables normalizados × tarifa del modelo / 1.000, redondeado hacia arriba a ocho decimales. Speech Light, Pro y Expressive cuentan unidades UTF-16 (😀 vale dos), Standard cuenta puntos de código Unicode. speechModels[].characterCounting y billing.character_counting indican la regla (utf16_code_units o unicode_codepoints); billing.characters, la cantidad. El formato y las acotaciones se eliminan antes de sintetizar y contar. La síntesis fallida o vacía se reembolsa. Cada síntesis se factura, pero reproducir el audio recibido no cuesta. La consola conserva audio por mensaje y voz durante la sesión actual de la página.