Nemotron 3.5 ASR llega como una respuesta práctica a problemas reales que enfrentan los productos que transcriben voz: soporte de muchos idiomas sin desplegar 40 modelos, subtitulado en vivo con baja latencia sin perder precisión, texto final ya puntado y capitalizado, y detección de idioma en caliente. ¿Quieres un único modelo que haga todo eso? Aquí te explico cómo funciona y cómo afinarlo para tu idioma, dominio o acento.
Qué resuelve Nemotron 3.5 ASR
Si alguna vez construiste un servicio de transcripción, reconoces estas paredes:
- Soportar muchos idiomas deja tu infra como un museo de integraciones puntuales.
- Streaming realista suele re-procesar ventanas solapadas y dispara la latencia y el costo.
- Salida cruda sin puntuación obliga a añadir otro modelo para restaurarla.
- Muchos sistemas exigen conocer el idioma por adelantado; ¿y si la persona cambia de idioma en la misma frase?
Nemotron 3.5 ASR unifica las soluciones: un solo checkpoint de 600M parámetros que cubre 40 locales, streaming real sin recomputo, output puntado y condicionamiento de idioma (puedes forzarlo con target_lang=es-ES o dejar target_lang=auto).
Arquitectura y por qué es eficiente
Dos piezas principales:
-
Un encoder Cache-Aware FastConformer de 24 capas. FastConformer es una evolución eficiente del Conformer con atención linealmente escalable. La parte "cache-aware" guarda estados internos (activaciones de self-attention y convolución) de frames previos para que cada frame de audio se procese exactamente una vez. ¿Resultado? No hay trabajo duplicado, menor cálculo y menor latencia sin sacrificar precisión.
-
Un decoder RNNT (Recurrent Neural Network Transducer). RNNT emite texto conforme llega audio, ideal para transcripción en vivo.
Además, el modelo usa condicionamiento por prompt de identificación de idioma: cada clip puede llevar una señal target_lang que especializa la salida. En auto el modelo detecta el idioma y lo adjunta como una etiqueta al final de cada frase.
Latencia vs. precisión: el control está en tus manos
El balance entre rapidez de emisión y cuánto audio "espiar" hacia el futuro se controla con att_context_size. Algunos puntos prácticos:
| Attention Context | Chunk Size (Latency) | Uso sugerido |
|---|---|---|
| [56,0] | 80ms (Ultra-Low) | Agentes de voz ultra rápidos |
| [56,1] | 160ms (Low) | Agentes interactivos |
| [56,3] | 320ms (Balanced) | Conversación y subtitulado en vivo |
| [56,6] | 560ms (Medium) | Precisión alta con latencia razonable |
| [56,13] | 1.12s (High) | Precisión máxima cuando la latencia no es crítica |
La misma checkpoint cubre todo el espectro: eliges el punto de operación en inferencia, sin necesidad de reentrenar.
Primeros pasos: clonar NeMo y probar el modelo
Clona NeMo y apunta el script de streaming a tu audio:
git clone https://github.com/NVIDIA-NeMo/NeMo.git
Transcripción con idioma conocido:
python ${NEMO_ROOT}/examples/asr/asr_cache_aware_streaming/speech_to_text_cache_aware_streaming_infer.py \
model_path=${MODEL_PATH} \
dataset_manifest=${MANIFEST_PATH} \
output_path=${OUTPUT_FOLDER} \
target_lang=es-ES \
att_context_size="[56,3]" \
strip_lang_tags=true
O deja que detecte el idioma:
python ${NEMO_ROOT}/examples/asr/asr_cache_aware_streaming/speech_to_text_cache_aware_streaming_infer.py \
model_path=${MODEL_PATH} \
dataset_manifest=${MANIFEST_PATH} \
output_path=${OUTPUT_FOLDER} \
target_lang=auto \
att_context_size="[56,3]" \
strip_lang_tags=true
Notas prácticas: el audio debe ser mono .wav y el manifest un JSON-lines con audio_filepath, duration y text. El modelo añade una language_tag al final de cada oración completada (por ejemplo "This is a test. "). strip_lang_tags=true elimina esa etiqueta para legibilidad.
Cómo y cuándo afinar (fine-tune) — la receta técnica
El flujo de trabajo que proponen es sencillo y reproducible:
- Prepara datos tarred con NeMo/Lhotse para streaming eficiente, sin desempaquetar archivos.
- Fine-tunea desde el checkpoint base usando el mismo recipe Cache-Aware FastConformer-RNNT y condicionando por
target_langen cada clip. - Evalúa con un conjunto held-out en el mismo ajuste de latencia que usarás en producción (por ejemplo
att_context_size=[56,0]). - Añade más datos para los idiomas/escenarios débiles y repite.
- Exporta y despliega el checkpoint afinado.
Puntos que marcan la diferencia:
- Cada clip debe llevar el
target_langcorrecto. El condicionamiento por prompt es potente pero intolerante a etiquetas incorrectas. - Mantén el estilo de texto del base model: puntuado y con mayúsculas.
- Para no perjudicar el resto de idiomas, mezcla ("replay") una fracción de datos de las otras lenguas al fine-tunear.
- Evalúa siempre a la latencia de despliegue; medir en modo offline o con look-ahead te dará una fantasía de rendimiento.
Un ejemplo concreto: afinar con ~2,000 horas balanceadas (Greek + Bulgarian) desde mezclas públicas (Granary, Common Voice, FLEURS) y usar splits held-out de FLEURS para prueba honesta.
Resultados representativos (WER en modo streaming de baja latencia 80ms):
| Language | Base model WER (%) | Fine-tuned WER (%) | Mejora relativa |
|---|---|---|---|
| Greek | 35 | 24 | 32% |
| Bulgarian | 22 | 15 | 31% |
Datos adicionales (incluir 2,000 h parlamentarias) siguieron mejorando las locales más débiles, aunque las ganancias fueron no uniformes: la cantidad ayuda, pero el match de dominio importa.
Consejos prácticos para ingeniería y despliegue
- En datasets pequeños, una pasada rápida en una sola GPU puede bastar para ver mejoras; escala a multi-GPU para runs completos.
- Usa un "fixed step budget" que funcione con datos streaming/iterables en lugar de contar epochs.
- Protege los idiomas que no estás afinando con replay y comprueba que no degradan.
- Exporta el checkpoint afinado a la misma ruta de serving: la arquitectura no cambia, solo los pesos.
Para producción, NVIDIA planea un release NIM con gRPC streaming y soporte en Ampere, Hopper, Blackwell, Lovelace, Turing, Volta y Jetson. Esto facilita integrarlo en pipelines de baja latencia y on-device.
Casos de uso destacados
- Agentes de voz sub-segundo: ASR -> LLM -> TTS sin que el ASR sea el cuello de botella.
- Subtítulos en vivo y multilingües con un único stream.
- Analítica de centros de contacto a escala global con un backend ASR en lugar de muchos vendors.
- Transcripción on-device en Jetson para privacidad o escenarios desconectados.
Recomendaciones finales y riesgos a vigilar
Afinar Nemotron 3.5 ASR puede ser transformador para lenguas con pocos recursos o dominios especializados. Pero recuerda: mide en la latencia que vas a desplegar, etiqueta bien los target_lang, y mezcla datos del resto de idiomas para evitar degradaciones inesperadas. Más datos ayudan, pero el match de dominio importa tanto como la cantidad.
Fuente original
https://huggingface.co/blog/nvidia/fine-tuning-nemotron-35-asr
