API Reference

/v1/audio/transcriptions

Transcripción de audio a texto con API compatible con OpenAI. Canary 1B v2 y Parakeet TDT 0.6B v3 en GPU, con separación por hablante en conversaciones de varios interlocutores, y Whisper large-v3 por compatibilidad.

Resumen

Convierte audio en texto. Devuelve el texto completo, segmentos y palabras con marca de tiempo y, si lo pides, quién habla en cada momento (diarización) en entrevistas, llamadas y reuniones. Formatos de respuesta json, verbose_json, diarized_json, text, srt y vtt.

Modelos disponibles

Cuatro literales en el mismo endpoint. Canary y Parakeet son los recomendados: transcriben mejor el audio real, aceptan archivos de horas sin trocear y separan hablantes. Whisper se mantiene por compatibilidad con las integraciones que ya lo usan.

ModeloIdiomasDiarizaciónCuándo usarlo
nvidia/canary-1b-v225 idiomas europeos; language obligatorioSíEspañol y el resto de idiomas europeos cuando sabes el idioma. El más preciso en audio real en español.
nvidia/parakeet-tdt-0.6b-v325 idiomas europeos; detecta el idioma soloSíInglés, audio de idioma desconocido y volumen alto. En inglés real transcribe mejor que Canary, y es el más rápido (×300–400 tiempo real).
whisper-large-v399 idiomasNoCompatibilidad: integraciones hechas para Whisper, catalán y otros idiomas fuera de los 25, y /v1/audio/translations.
whisper-large-v3-turbo99 idiomasNoLo mismo que whisper-large-v3 con un decodificador destilado, más rápido.

Rendimiento en español e inglés frente a Whisper

Medido por Tessera en octubre de 2026, en la misma GPU y con la misma normalización (minúsculas, sin puntuación ni muletillas). FLEURS son frases cortas leídas: la cifra es el WER (palabras erróneas; menos es mejor). El audio real son conversaciones largas: llamadas en español de 8 y 41 minutos y entrevistas en inglés de 5 a 79 minutos con 2 o 3 interlocutores. Ahí la cifra es la diferencia frente a una transcripción de referencia.

ModeloFLEURS españolFLEURS inglésAudio real en españolAudio real en inglésVelocidad en audio largo
nvidia/canary-1b-v23,9 %5,7 %6,6 %10,5 % (escribe los números en cifras)×100–125 tiempo real
nvidia/parakeet-tdt-0.6b-v34,2 %5,6 %9,1 %7,6 %×300–400 tiempo real
whisper-large-v33,2 %4,8 %8,7 %, con un 2,3 % de texto inventadono medido×3 tiempo real

Endpoint y parámetros

POST https://api.tesseraai.cloud/v1/audio/transcriptions con multipart/form-data.

CampoValor
fileEl audio: mp3, wav, m4a, flac, ogg, opus, webm o mp4.
modelnvidia/canary-1b-v2, nvidia/parakeet-tdt-0.6b-v3, whisper-large-v3 o whisper-large-v3-turbo.
languageCódigo ISO 639-1 (es, en, pt…). Obligatorio con Canary; opcional con Parakeet, que detecta el idioma, y con Whisper.
response_formatjson (por defecto), verbose_json, diarized_json, text, srt o vtt.
timestamp_granularities[]segment, word o los dos, con verbose_json. Si no lo pasas, Canary y Parakeet devuelven los dos.
diarizetrue para separar hablantes (Canary y Parakeet). Ver «Varios interlocutores».
num_speakers, min_speakers, max_speakersPistas opcionales sobre el número de hablantes.
prompt, temperatureSe aceptan por compatibilidad con OpenAI; Canary y Parakeet los ignoran.

Request

POST /v1/audio/transcriptions
curl https://api.tesseraai.cloud/v1/audio/transcriptions \
  -H "Authorization: Bearer $TESSERA_API_KEY" \
  -F "[email protected]" \
  -F "model=nvidia/canary-1b-v2" \
  -F "language=es" \
  -F "response_format=verbose_json"

# Python (SDK oficial de OpenAI)
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.tesseraai.cloud/v1",
    api_key=os.environ["TESSERA_API_KEY"],
)
with open("llamada.mp3", "rb") as f:
    r = client.audio.transcriptions.create(
        model="nvidia/canary-1b-v2",
        file=f,
        language="es",
    )
print(r.text)

Response

Con json devuelve {"text": "..."}. Con verbose_json añade duration, language (el que pasaste en la petición), segments[] y words[] con inicio y fin en segundos, y usage con los segundos de audio.

verbose_json
{
  "task": "transcribe",
  "language": "es",
  "duration": 85.07,
  "text": "Hola, gracias por venir. ¿Has tenido problemas para encontrar la oficina? ...",
  "segments": [
    {
      "id": 0,
      "start": 0.48,
      "end": 4.56,
      "text": "Hola, gracias por venir. ¿Has tenido problemas para encontrar la oficina?"
    }
  ],
  "words": [
    {"word": "Hola,", "start": 0.48, "end": 0.8},
    {"word": "gracias", "start": 0.88, "end": 1.2}
  ],
  "usage": {"type": "duration", "seconds": 85.07}
}

Varios interlocutores (diarización)

Canary y Parakeet pueden indicar quién habla en cada momento: entrevistas, llamadas, reuniones o podcasts. No está activa por defecto, pero no hay nada que configurar en tu cuenta ni coste adicional: se activa en cada petición. Hay dos formas: añadir diarize=true (sirve con json, verbose_json, srt y vtt) o pedir response_format=diarized_json, que la activa sola y responde con el formato de OpenAI.

ParámetroValorEfecto
diarizetrueActiva la separación por hablante. Con el SDK de OpenAI va dentro de extra_body.
response_formatdiarized_jsonActiva la diarización y responde con el formato diarized_json de OpenAI. No hace falta diarize.
num_speakersenteroNúmero exacto de hablantes, si lo sabes.
min_speakers, max_speakersenteroRango de hablantes, si solo sabes aproximadamente cuántos son.

Activar la diarización

diarize=true · diarized_json
# cURL: transcripción con hablantes
curl https://api.tesseraai.cloud/v1/audio/transcriptions \
  -H "Authorization: Bearer $TESSERA_API_KEY" \
  -F "[email protected]" \
  -F "model=nvidia/canary-1b-v2" \
  -F "language=es" \
  -F "response_format=verbose_json" \
  -F "diarize=true" \
  -F "num_speakers=2"

# Python: los campos propios de Tessera van en extra_body
with open("reunion.mp3", "rb") as f:
    r = client.audio.transcriptions.create(
        model="nvidia/canary-1b-v2",
        file=f,
        language="es",
        response_format="verbose_json",
        extra_body={"diarize": True, "num_speakers": 2},
    )
for s in r.segments:
    print(s.speaker, s.start, s.text)

# Python: formato diarized_json de OpenAI (activa la diarización solo)
with open("reunion.mp3", "rb") as f:
    r = client.audio.transcriptions.create(
        model="nvidia/parakeet-tdt-0.6b-v3",
        file=f,
        response_format="diarized_json",
    )
for s in r.segments:
    print(s.speaker, s.start, s.text)

Dónde aparecen los hablantes

Los hablantes se etiquetan A, B, C… por orden de aparición. Las etiquetas son coherentes dentro de un archivo, pero no identifican a la persona: la A de una llamada no es la A de otra.

FormatoDónde va el hablante
json + diarize=truesegments[].speaker: cada segmento es un turno de palabra.
verbose_json + diarize=truesegments[].speaker y words[].speaker.
diarized_jsonsegments[].speaker, con type: "transcript.text.segment", igual que OpenAI.
srt o vtt + diarize=truePrefijo [A], [B]… en cada subtítulo.
diarized_json
{
  "task": "transcribe",
  "duration": 85.07,
  "text": "Hola, gracias por venir. Has tenido problemas para encontrar la oficina. Ninguno, ...",
  "segments": [
    {
      "type": "transcript.text.segment",
      "id": 0,
      "speaker": "A",
      "start": 0.32,
      "end": 4.96,
      "text": "Hola, gracias por venir. Has tenido problemas para encontrar la oficina."
    },
    {
      "type": "transcript.text.segment",
      "id": 1,
      "speaker": "B",
      "start": 5.36,
      "end": 10.16,
      "text": "Ninguno, el metro me deja justo enfrente, llegué con 10 minutos de margen."
    },
    {
      "type": "transcript.text.segment",
      "id": 2,
      "speaker": "A",
      "start": 10.4,
      "end": 14.8,
      "text": "Perfecto, cuéntame un poco sobre tu experiencia en atención al cliente."
    }
  ],
  "usage": {"type": "duration", "seconds": 85.07}
}

Whisper (compatibilidad)

whisper-large-v3 y whisper-large-v3-turbo siguen disponibles con el mismo contrato de siempre, para no romper integraciones existentes. Úsalos para catalán y otros idiomas fuera de los 25 de Canary y Parakeet, y para /v1/audio/translations (traducción al inglés). Para todo lo demás recomendamos Canary o Parakeet.

  • Hasta 25 MB por archivo. Para audio de más de 10 minutos, divide en tramos de 5–10 minutos y une el texto en el cliente.
  • whisper-large-v3-turbo recorta el decodificador de 32 a 4 capas: más rápido, con una pérdida de precisión pequeña.
  • Sin diarización.

Buenas prácticas

  • Pasa language si conoces el idioma. Con Canary es obligatorio.
  • Envía el archivo entero: Canary y Parakeet trocean y recomponen el audio en el servidor, hasta 4 horas.
  • En conversaciones, activa diarize=true y pasa num_speakers si sabes cuántas personas hablan.
  • Los formatos text, srt y vtt llegan dentro de un JSON {"text": "..."}. Con el SDK de OpenAI recibes esa cadena: léela con json.loads(r)["text"].
  • Un audio limpio da mejor resultado que un mp3 muy comprimido o con mucho ruido de fondo.