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.
| Modelo | Idiomas | Diarización | Cuándo usarlo |
|---|---|---|---|
nvidia/canary-1b-v2 | 25 idiomas europeos; language obligatorio | Sí | 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-v3 | 25 idiomas europeos; detecta el idioma solo | Sí | 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-v3 | 99 idiomas | No | Compatibilidad: integraciones hechas para Whisper, catalán y otros idiomas fuera de los 25, y /v1/audio/translations. |
whisper-large-v3-turbo | 99 idiomas | No | Lo 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.
| Modelo | FLEURS español | FLEURS inglés | Audio real en español | Audio real en inglés | Velocidad en audio largo |
|---|---|---|---|---|---|
nvidia/canary-1b-v2 | 3,9 % | 5,7 % | 6,6 % | 10,5 % (escribe los números en cifras) | ×100–125 tiempo real |
nvidia/parakeet-tdt-0.6b-v3 | 4,2 % | 5,6 % | 9,1 % | 7,6 % | ×300–400 tiempo real |
whisper-large-v3 | 3,2 % | 4,8 % | 8,7 %, con un 2,3 % de texto inventado | no medido | ×3 tiempo real |
Endpoint y parámetros
POST https://api.tesseraai.cloud/v1/audio/transcriptions con multipart/form-data.
| Campo | Valor |
|---|---|
file | El audio: mp3, wav, m4a, flac, ogg, opus, webm o mp4. |
model | nvidia/canary-1b-v2, nvidia/parakeet-tdt-0.6b-v3, whisper-large-v3 o whisper-large-v3-turbo. |
language | Código ISO 639-1 (es, en, pt…). Obligatorio con Canary; opcional con Parakeet, que detecta el idioma, y con Whisper. |
response_format | json (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. |
diarize | true para separar hablantes (Canary y Parakeet). Ver «Varios interlocutores». |
num_speakers, min_speakers, max_speakers | Pistas opcionales sobre el número de hablantes. |
prompt, temperature | Se aceptan por compatibilidad con OpenAI; Canary y Parakeet los ignoran. |
Request
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.
{
"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ámetro | Valor | Efecto |
|---|---|---|
diarize | true | Activa la separación por hablante. Con el SDK de OpenAI va dentro de extra_body. |
response_format | diarized_json | Activa la diarización y responde con el formato diarized_json de OpenAI. No hace falta diarize. |
num_speakers | entero | Número exacto de hablantes, si lo sabes. |
min_speakers, max_speakers | entero | Rango de hablantes, si solo sabes aproximadamente cuántos son. |
Activar la diarización
# 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.
| Formato | Dónde va el hablante |
|---|---|
json + diarize=true | segments[].speaker: cada segmento es un turno de palabra. |
verbose_json + diarize=true | segments[].speaker y words[].speaker. |
diarized_json | segments[].speaker, con type: "transcript.text.segment", igual que OpenAI. |
srt o vtt + diarize=true | Prefijo [A], [B]… en cada subtítulo. |
{
"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-turborecorta 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
languagesi 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=truey pasanum_speakerssi sabes cuántas personas hablan. - Los formatos
text,srtyvttllegan dentro de un JSON{"text": "..."}. Con el SDK de OpenAI recibes esa cadena: léela conjson.loads(r)["text"]. - Un audio limpio da mejor resultado que un mp3 muy comprimido o con mucho ruido de fondo.