Si tu código ya habla con la API de OpenAI para transcribir o para generar voz, no hace falta reescribirlo. Hablamos el mismo dialecto: mismas rutas, mismos nombres de parámetro, mismos nombres de voz.
from openai import OpenAI
client = OpenAI(
base_url="https://api.uttera.ai/v1", # ← 1
api_key="sk-echo-...", # ← 2
)
Y ya. El resto de tu código no se toca.
Esto no es una afirmación de folleto: los ejemplos publicados se ejecutan contra la API
real antes de publicarse, con el paquete oficial openai sin parchear. Están en
uttera-examples/openai-sdk,
en Python, Node y curl.
| Funciona igual | Solo nuestro |
|---|---|
POST /v1/audio/transcriptions |
POST /v1/summarize |
POST /v1/audio/speech |
POST /v1/translate |
GET /v1/models |
Análisis de voz con ?extras= |
Voces alloy echo fable nova onyx shimmer |
GET /v1/usage/last |
Los endpoints de más no estorban: un cliente que los ignora se comporta exactamente como se comportaría contra OpenAI. Puedes migrar hoy y descubrirlos el mes que viene.
El tiempo de espera. Y es el error más común al integrar, con diferencia.
Mantenemos la conexión abierta hasta 7200 segundos para que una grabación larga pueda terminar. Pero el valor por defecto de muchas librerías son 30 segundos o un minuto, y con eso cortas trabajos que iban perfectamente: el servidor sigue procesando, tú ya has recibido una excepción, y la conclusión equivocada es «esto no funciona».
client = OpenAI(base_url="https://api.uttera.ai/v1",
api_key="sk-echo-...",
timeout=7200)
Como referencia: una grabación de 100 minutos se transcribe en 10 a 35 segundos. La espera larga no es para el caso normal — es para que el caso raro no se pierda.
Se factura por segundo de audio, no por petición. Diez peticiones de seis segundos cuestan lo mismo que una de sesenta. Eso cambia cómo conviene trocear el trabajo: no hay penalización por hacer muchas llamadas pequeñas.
Cada respuesta te dice lo que te ha costado. La cabecera X-Audio-Duration trae los
segundos facturados, y las de créditos, lo que te queda. No hace falta esperar a fin de mes
ni consultar otro sitio.
Los errores llegan de dos formas. Los que genera el borde traen error y message. Los
que genera el motor —un fichero que no se puede decodificar, uno que pasa del tamaño
máximo— traen detail. Al leer un error, mira error y cae a detail si no está. Es una
línea de código y evita un log inútil el día que algo falle.
Tus audios se procesan en España y no se guardan. Eso no es una diferencia de API —tu código no lo nota— pero probablemente sea una diferencia para quien tenga que firmar el contrato. Está explicado, artículo por artículo, en la documentación de privacidad.
¿Algo que añadir o que corregir? Escríbenos a support@uttera.ai. Si nos corriges, editamos la entrada y te damos crédito.