opción
HogarHogar Skill Ciencia de datos y aprendizaje automático digital-health-clinical-asr-eval

digital-health-clinical-asr-eval

NVIDIA/skills NVIDIA/skills

Calificar un manifiesto clínico de ASR en función de un NIM seleccionado, elaborar una tabla de clasificación KER de cinco secciones y guiar al usuario a través de un árbol de decisión posterior a la evaluación.

...Expandir todo
1
Tiempo actualizado 28 de septiembre de 2026

Flywheel clínico de ASR — Fase 3 (Evaluación)

⚠ Agente: lee la sección «Reglas críticas del flujo de trabajo» que aparece a continuación antes de responder. Este archivo SKILL.md es autónomo: las carpetas evals/, references/ y assets/ son meros enlaces, no contienen datos. Responde directamente a las preguntas sobre metodología de este archivo; solo invoca herramientas cuando el usuario solicite explícitamente que se ejecute con un manifiesto real.

Te encuentras en la etapa de puntuación y enrutamiento. El usuario llega con un archivo manifest.jsonl en formato NeMo (ya sea procedente de /digital-health-clinical-asr-build o importado desde otro lugar). Lo transcribes mediante el NIM de ASR elegido, evalúas cuatro métricas, generas una tabla de clasificación de cinco secciones y consultas el árbol de decisión para determinar si el usuario debe avanzar a /digital-health-clinical-asr-finetune, volver a /digital-health-clinical-asr-build o detenerse y consolidar la evaluación.

Esta skill no genera audio. Si el manifiesto falta o está vacío, redirige al usuario a /digital-health-clinical-asr-build.

El audio sale de tu entorno; informa de ello al usuario antes de enviar cualquier clip

En esta etapa se transmite el archivo WAV de cada fila del manifiesto, junto con su texto de referencia, a un servicio externo de NVIDIA. Indícalo antes de realizar la primera llamada ASR:

Servicio Lo que se envía Cuándo
NVIDIA NVCF Parakeet/Nemotron ASR (grpc.nvcf.nvidia.com) Cada clip de audio al que hace referencia el manifiesto (bytes PCM sin procesar), junto con la transcripción de referencia y los metadatos de extensión clínica para la puntuación Paso 3b, una llamada por cada fila del manifiesto

Los clips deben ser audio sintético generado en la Etapa 2 (Magpie TTS sobre una lista de términos seleccionada por el usuario), no audio real de pacientes. No se deben enviar a través de esta skill grabaciones reales de ASR, interacciones reales con pacientes ni ningún dato de salud protegido (PHI). A continuación, la puntuación se ejecuta localmente (WER/CER/KER/SER en Python puro, o jiwer si está instalado). El paso de puntuación en sí mismo no transmite nada; solo lo hace el paso de ASR.

Reglas críticas del flujo de trabajo (aplicables en cada activación)

Para preguntas sobre la metodología (estructura de la tabla de clasificación, definición de KER, árbol de decisión), responde a partir de este archivo. No utilices herramientas, no llames a otras habilidades ni ejecutes scripts a menos que el usuario solicite explícitamente que se ejecute con un manifiesto real. Menciona estos datos en cualquier respuesta:

  1. Salida prioritaria. Si el usuario pregunta sobre algo ajeno a la puntuación, redirígelo y detén el proceso sin ejecutar ningún flujo de trabajo:
    • Selección/comparación del catálogo de modelos ASR / NIM alternativos → /riva-asr
    • Autenticación ASR (claves API, tokens de portador, ID de funciones) → /riva-asr
    • Protocolo gRPC de ASR, streaming, procesamiento por lotes, fragmentación, reintentos → /riva-asr
    • Implementación de NIM / riva-build / riva-deploy → /riva-asr-custom
    • NGC / Docker / NVIDIA Container Toolkit → /riva-nim-setup
    • Aún no hay manifiesto → /digital-health-clinical-asr-build
    • Quiere realizar un ajuste fino ahora con un KER conocido → /digital-health-clinical-asr-finetune
  2. El NIM predeterminado de ASR es nvidia/parakeet-tdt-0.6b-v2 (ID de función NVCF d3fe9151-442b-4204-a70d-5fcc597fd610, gRPC sin conexión). Anulaciones mediante variables de entorno: ASR_MODEL_NAME (nombre que se muestra en la tabla de clasificación), ASR_NVCF_FUNCTION_ID (cambiar a un NIM alojado diferente —por ejemplo, Whisper Large v3 b702f636-… cuando el backend de Parakeet presente fallos, o un NIM ajustado), ASR_ENDPOINT (gRPC autohospedado; tiene prioridad). Reenvía el NIM elegido y el identificador de función resuelto antes de gastar créditos de la API.
  3. La transcripción de ASR se integra en el paso 3b (NVCF gRPC + riva.client.ASRService.offline_recognize, mismo patrón de autenticación que en la etapa 1). Para cuestiones más detalladas sobre el protocolo o la autenticación, catálogos NIM alternativos o la configuración de un NIM de Riva autohospedado, consulta /riva-asr.
  4. El KER es el indicador principal. Comprobación por fila: las palabras marcadas deben aparecer en orden, contiguas y adyacentes en la hipótesis normalizada. «cefazolin» → «cefa zolin» es un error. El WER agregado oculta fallos clínicamente peligrosos; ambos se notifican, pero el KER es el filtro decisivo.
  5. La división«by-ipa_source» es la cifra individual más informativa de la tabla de clasificación. La diferencia entre «merriam-webster» y «magpie_g2p» demuestra que el proceso de anulación de SSML está funcionando de verdad. Léelo en voz alta al usuario.
  6. Enrutamiento de casos especiales. Las filas de «merriam-webster» son buenas, las de «magpie_g2p» son malas → diferencia en la cobertura de la pronunciación, no una diferencia entre modelos. Vuelve a /digital-health-clinical-asr-build, paso 2d. NO recomiendes /digital-health-clinical-asr-finetune como primera respuesta.
  7. Orden de la tabla de clasificación de cinco secciones. Encabezado (WER/CER/KER/SER) → KER por «entity_category» → KER por «ipa_source» → KER por «noise_level» → KER por término, de peor a mejor. La sección«by-ipa_source» es obligatoria; es la prueba de que el proceso de SSML funciona.

Objetivo

Puntuar un manifiesto de ASR clínico, generar una tabla de clasificación KER de cinco secciones y dirigir al usuario a través del árbol de decisión posterior a la evaluación. Los detalles de la metodología (definiciones de métricas, normalización, orden de la tabla de clasificación, enrutamiento de casos especiales) se encuentran en las «Reglas críticas del flujo de trabajo» más arriba y en las «Instrucciones» más abajo.

Cuándo utilizar esta habilidad

Actívala ante frases del usuario como:

  • «Puntuar mi manifiesto de ASR»
  • «¿Cuál es el KER de Parakeet TDT v2?»
  • «Ejecuta la evaluación en el ciclo N»
  • «Compara dos modelos de ASR en el benchmark clínico»
  • «Genera la tabla de clasificación»
  • «Tengo un archivo manifest.jsonl, ¿cómo lo evalúo?»
  • «¿Por qué el KER es 0,4 si el WER es 0,07?»
  • «¿Deberíamos realizar un ajuste fino?» (esta es la pregunta relacionada con la evaluación; el árbol de decisión posterior a la evaluación se encuentra en esta habilidad)

Comprobación de no activación de palabras clave literales: si el mensaje del usuario contiene alguna de las siguientes palabras: «authenticate», «API key», «bearer», «function ID», «gRPC», «streaming», «chunking», «batching», «transcription retry», «riva-build», «riva-deploy», «NIM deploy», «NGC», Docker o Container Toolkit, o si pregunta «¿qué modelo ASR es el mejor?», «comparar modelos» o «diferencias entre proveedores», NO se activará el flujo de trabajo de puntuación. Aplica la regla de flujo de trabajo crítica n.º 1 anterior para redirigir al skill hermano adecuado y detener el proceso. Esto se aplica incluso si el usuario menciona «KER» o «eval» junto con la palabra clave.

Requisitos previos

  • Un manifiesto en formato NeMo con los campos de extensión clínicos (term, entity_category, ipa_source, voice_id, noise_level, context_type). El esquema está documentado en el archivo references/manifest-schema.md de la habilidad de compilación.
  • NVIDIA_API_KEY exportada (el requisito previo de la etapa 1 sigue siendo válido).
  • nvidia-riva-client + soundfile instalados (requisito previo de la etapa 1). Para obtener detalles sobre Riva NIM autohospedado, consulta /riva-asr Opción B.
  • Archivos de audio realmente presentes en el disco: ejecute la comprobación previa «audio-existence» de la referencia «manifest-schema» antes de gastar créditos de la API.

Instrucciones

3a. Elige el NIM de ASR

Por defecto: nvidia/parakeet-tdt-0.6b-v2 a través de NVCF gRPC (sin conexión), ID de función d3fe9151-442b-4204-a70d-5fcc597fd610. Recomendación actual de NVIDIA para ASR en inglés: es el más rápido y económico del catálogo, y es compatible con la receta SFT predeterminada de NeMo, por lo que la línea base de la Etapa 3 y el ajuste fino de la Etapa 4 utilizan la misma familia de modelos.

Tres controles para anular variables de entorno en tiempo de ejecución (ASR_MODEL_NAME para la visualización en la tabla de clasificación, ASR_NVCF_FUNCTION_ID para cambiar a un NIM alojado diferente, ASR_ENDPOINT para gRPC autohospedado), además del catálogo completo de NIM alternativos (Parakeet TDT 1.1B, Parakeet CTC 1.1B, Whisper Large v3, Nemotron streaming) con los ID de función y notas sobre el formato de las llamadas: references/offline-asr-recipe.md.

Indica al usuario el NIM elegido, el identificador de función resuelto y cualquier sustitución de variables de entorno antes de gastar créditos de la API. Un manifiesto de 200 filas en un Parakeet TDT v2 alojado es barato; una ejecución accidental con el modelo equivocado en un manifiesto de 1.000 filas no lo es.

3b. Transcribir

Para cada fila de manifest.jsonl, transcribe audio_filepath y escribe per_sample.json (un objeto JSON por fila, JSONL o una matriz JSON —a elección del usuario—):

{
  "audio_filepath": "...",
  "ref": "",
  "hyp": "",
  "term": "",
  "entity_category": "",
  "ipa_source": "",
  "voice_id": "",
  "noise_level": "",
  "context_type": ""
}

Receta (código completo en Python en references/offline-asr-recipe.md): transcribe_manifest(api_key, manifest_path, out_path, language_code="en-US") abre un flujo gRPC sin conexión hacia NVCF (o hacia ASR_ENDPOINT si se ha configurado para Riva autohospedado), llama a riva.client.ASRService.offline_recognize por fila —las frases de un manifiesto clínico duran ≤ 30 s, por lo que no se necesita streaming ni procesamiento por lotes— y escribe el JSONL anterior. La misma estructura de auth_for que en la prueba de funcionamiento de la configuración de la Etapa 1. El harness del agente pasa la clave «api_key» de forma explícita; la receta lee las tres variables de entorno sobrescritas (ASR_NVCF_FUNCTION_ID, ASR_MODEL_NAME, ASR_ENDPOINT) al principio, para que los auditores vean los parámetros de configuración en un solo lugar.

Patrones de variables de entorno parael plan de contingencia de Whisper (cuando el backend NVCF de Parakeet falla debido a un acceso ilegal a la memoria de CUDA desde Triton) y para el Riva NIM autohospedado (ASR_ENDPOINT=localhost:50051): véase references/offline-asr-recipe.md (§Recurso alternativo de Whisper, §Riva NIM autohospedado).

Los parámetros de resiliencia se dejan a criterio del usuario. Si NVCF devuelve RESOURCE_EXHAUSTED en mitad de un lote, el bucle se detiene en esa fila; se vuelve a ejecutar a partir de la fila en la que se produjo el fallo. El streaming, el procesamiento por lotes y los reintentos con retroceso quedan fuera del alcance de este documento; véase /riva-asr.

3c. Calificar cuatro métricas

Para cada fila, calcular:

Métrica Qué mide Por qué la mantenemos
WER Índice de error de palabras (Levenshtein sobre tokens, tras la normalización) Estándar del sector; herramienta poco precisa para fines clínicos
CER Tasa de error de caracteres Detecta errores casi imperceptibles en nombres compuestos largos
KER ★ Tasa de error de palabras clave: ¿apareció el término marcado en la hipótesis (coincidencia normalizada y contigua )? Señal clínica principal
SER Tasa de error de la frase (1 si hay algún error, 0 si es perfecta) Límite de plausibilidad; lo que experimenta el médico

Normalización (aplicar tanto a «ref» como a «hyp» antes de las cuatro métricas):

  1. Minúsculas.
  2. Normalización NFKD (comillas tipográficas → ASCII, etc.).
  3. Eliminar la puntuación, excepto el guión.
  4. Reducir las secuencias de espacios en blanco a un solo espacio.

Recetas de puntuación en línea: normalizar / edit_distance / wer / cer / ker / ser (Python puro, sin dependencia de jiwer ): véase references/scoring-recipes.md. Agregar por filas calculando la media (puntuación por fila) para cada métrica.

KER estricto: las palabras del término deben aparecer en orden, adyacentes en la hipótesis normalizada. Esto es conservador: «cefazolin» → «cefa zolin» cuenta como un error. Es la decisión correcta desde el punto de vista clínico: una consulta posterior en la farmacia fallará debido al token mal escrito.

El KER no penaliza los errores circundantes. Una fila en la que el término sea correcto y el resto de la frase sea basura sigue obteniendo una puntuación KER = 0; el WER de esa fila pondrá de manifiesto el problema más amplio por separado.

3d. Desgloses + tabla de clasificación

Escribe una tabla de clasificación en Markdown con cinco secciones, en este orden:

  1. Título: WER, CER, KER y SER generales del modelo elegido.
  2. KER por «entity_category »: fármaco frente a procedimiento frente a anatomía frente a... Esto es lo que realmente le importa al usuario a la hora de la implementación.
  3. KER por ipa_source: la cifra más informativa de la tabla de clasificación. La diferencia entre las filas de Merriam-Webster y magpie_g2p es la prueba de que el proceso de anulación de SSML está funcionando de verdad. Lee esta sección en voz alta al usuario.
  4. KER por «noise_level »: los entornos clínicos son ruidosos. Las filas «snr_5db» se acercan más a la realidad que las «clean».
  5. KER por término (de peor a mejor): estos son tus objetivos de ajuste fino de la Etapa 4.

Una división representativa de ipa_source con la interpretación de la diferencia entre Merriam-Webster y magpie_g2p: references/scoring-recipes.md §División representativa de ipa_source. El delta refleja la situación de la implementación: si el usuario observa una gran diferencia y pregunta «¿deberíamos realizar un ajuste fino?», la respuesta es «todavía no»; redirígelo al proceso de control de calidad de IPA de /digital-health-clinical-asr-build(Etapa 2d). Consulta el árbol de decisión a continuación.

Árbol de decisión (tras la evaluación)

Lee el KER de la categoría de prioridad (KER de fármaco para la mayoría de los flujos de trabajo clínicos, KER de procedimiento para los flujos de trabajo quirúrgicos) y redirige:

KER según la categoría de prioridad Recomendar
> 0,3 /digital-health-clinical-asr-finetune. El manifiesto ya está preparado para el formato NeMo. Nota: se necesitan al menos 100 filas para obtener una señal de ajuste fino fiable; si el manifiesto es más pequeño, amplíalo primero mediante /digital-health-clinical-asr-build.
0,1 – 0,3 Amplía la lista de términos (vuelve a /digital-health-clinical-asr-build con nuevos términos del dominio —por lo general, esto revela más errores de forma más económica que el ajuste—) o realiza un ajuste fino. En una primera evaluación, amplía la lista. En una evaluación posterior, cuando ya hayas ampliado el manifiesto, realiza el ajuste.
< 0,1 Base de referencia sólida. No realices el ajuste todavía: estarías optimizando en función de una métrica saturada. Exige más a la evaluación: añade voces, niveles de ruido, contextos y términos adversarios. Vuelve a /digital-health-clinical-asr-build.

Caso especial: las filas de «merriam-webster» obtienen buena puntuación, pero las de «magpie_g2p» son malas. Se trata de una laguna en la cobertura de las pistas de pronunciación, no de una laguna del modelo. Vuelve a /digital-health-clinical-asr-build, paso 2d (revisión de control de calidad del AFI), no a /digital-health-clinical-asr-finetune. El ajuste fino sobre una brecha de pronunciación del TTS enseña al modelo a reconocer erróneamente sus propios errores: es una solución equivocada.

Ejemplos

Escenario A: primera evaluación en un manifiesto nuevo del ciclo 1. Usuario: «Tengo un archivo manifest.jsonl con 200 filas de audio clínico, con los campos «term» y «entity_category ». ¿Cómo lo evalúo?» → Omite la etapa 2 por completo. Ejecuta la comprobación previa de existencia de audio. Selecciona parakeet-tdt-0.6b-v2 (por defecto) y muestra la elección junto con el identificador de función resuelto. Ejecuta la receta integrada del paso 3b (transcribe_manifest(...)). Califica las cuatro métricas. Genera la tabla de clasificación de cinco secciones. Lee al usuario la divisiónpor «ipa_source ». Aplica el árbol de decisión al KER de medicamentos.

Escenario B: interpretación de un resultado mixto. Usuario: «La evaluación muestra un KER de 0,05 en las filas etiquetadas como merriam-webster, pero de 0,40 en las etiquetadas como magpie_g2p. ¿Debería realizar un ajuste fino?» → No — se trata de un caso especial. El modelo funciona bien; las pistas de pronunciación no cubren los términos de cola larga. Redirige al usuario al paso 2d de /digital-health-clinical-asr-build para que revise las filas «magpie_g2p» y añada el IPA verificado al archivo pronunciation_overrides.csv. Vuelve a ejecutar la etapa 3 tras la reconstrucción antes de reconsiderar la etapa 4.

Archivos generados

  • per_sample.json: resultados de transcripción por fila con todos los campos de extensión clínica conservados (el hip de ASR unido a la referencia y los metadatos del manifiesto)
  • results.csv: puntuaciones de WER/CER/KER/SER por fila
  • leaderboard_cycle.md: informe en Markdown de cinco secciones

(Los nombres de los archivos los elige el usuario; los nombres anteriores son convenciones que se dan por supuestas en el resto de esta skill).

Solución de problemas

  • «No se ha encontrado ningún manifiesto» → el usuario se ha saltado la Etapa 2. Dirígete a /digital-health-clinical-asr-build o confirma $MANIFEST_PATH.
  • Todas las filas tienen KER=1 → discrepancia de normalización entre ref e hyp. Aplica los cuatro pasos de normalización a ambos lados.
  • Todas las filas tienen KER=0 pero el WER es alto → probablemente el manifiesto esté desalineado (desajuste entre filas de audio). Comprueba manualmente algunos pares (ref, hyp).
  • merriam-webster bajo, magpie_g2p alto → diferencia en la cobertura de la pronunciación. Dirígete a /digital-health-clinical-asr-build, paso 2d. No realices un ajuste fino: el modelo no es el problema.
  • Tanto «merriam-webster» como «magpie_g2p» altos → deficiencia real del modelo. La etapa 4 es la ruta correcta (manifiesto ≥ 100 filas).
  • Las filaslimpias están bien, pero el snr_5db se dispara → brecha de robustez; ampliar la diversidad del ruido a través de /digital-health-clinical-asr-build.
  • Los resultados de Riva-NIM y NeMo offline divergen → preprocesamiento de Riva / indicadores de riva-build. Accede a /riva-asr-custom.
  • RESOURCE_EXHAUSTED en manifiestos grandes → reintentar tras 30 s; dividir en segmentos y volver a ejecutar las filas descartadas. Retraso integrado: /riva-asr.
  • Auth.__init__() recibió «ssl_cert» / acceso ilegal a la memoria de CUDA en el ID de función de Parakeet: véase references/offline-asr-recipe.md (cambio de nombre de ssl_root_cert + §solución alternativa Whisper).

Cualquier otra cosa: identifica al propietario del origen. Protocolo ASR / implementación de NIM → /riva-asr. Puntuación → aquí.

Limitaciones

  • Solo inglés por defecto. La tokenización y la normalización asumen el alfabeto latino y el léxico en-US.
  • El KER estrictamente contiguo es conservador. Un resultado «casi erróneo» como «cefa zolin» cuenta como un error. Esto es intencionado: las búsquedas farmacéuticas fallan ante resultados «casi erróneos». Los usuarios que deseen una coincidencia «suave» pueden cambiar a la distancia de edición a nivel de fonema, lo cual es una extensión de la metodología, no un ajuste de configuración.
  • Un modelo por ejecución de evaluación. Comparar dos modelos implica ejecutar la evaluación dos veces y comparar los dos archivos `leaderboard_cycle.md ` (o ampliar la receta para escribir tú mismo filas con varios modelos).
  • Se asumen rutas únicamente en entorno alojado. Los NIM autohospedados funcionan, pero requieren ejecutar primero /riva-nim-setup.

Próximos pasos

  • Avanzar (KER > 0,3, manifiesto ≥ 100 filas): /digital-health-clinical-asr-finetune.
  • Volver a la fase de desarrollo (KER entre 0,1 y 0,3 en la primera evaluación, o diferencia con magpie_g2p ): /digital-health-clinical-asr-build.
  • Detener (KER < 0,1): la evaluación está saturada. Refuérzala antes de darla por concluida.
  • Informaciónadicional sobre el protocolo ASR, la autenticación, el streaming y el NIM autohospedado: /riva-asr.

Referencias

  • references/offline-asr-recipe.md — receta completa en Python del paso 3b (transcribe_manifest, resolve_asr_config, build_asr_auth), catálogo de ID de funciones con notas sobre la estructura de las llamadas, recurso de reserva de Whisper, configuración del NIM de Riva autohospedado
  • references/scoring-recipes.md — Funciones de puntuación WER/CER/KER/SER en Python puro con la normalización canónica de 4 pasos
Ver en GitHub
---
name: digital-health-clinical-asr-eval
description: Score a clinical ASR manifest against a chosen NIM, produce a five-section KER leaderboard, and route the user via a post-eval decision tree.
license: Apache-2.0
---

<!--
SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
SPDX-License-Identifier: Apache-2.0
-->

# Clinical ASR Flywheel — Stage 3 (Eval)

> **⚠ Agent: read the Critical Workflow Rules section below before answering.** This SKILL.md is self-contained — `evals/`, `references/`, and `assets/` are pointers, not load-bearing. Answer methodology questions from this file directly; only invoke tools when the user explicitly asks to execute against a real manifest.

You are the **score-and-route** stage. The user arrives with a NeMo-format `manifest.jsonl` (either from `/digital-health-clinical-asr-build` or carried in from elsewhere). You transcribe it via the chosen ASR NIM, score four metrics, produce a five-section leaderboard, and read the decision tree to decide whether the user should advance to `/digital-health-clinical-asr-finetune`, loop back to `/digital-health-clinical-asr-build`, or stop and harden the eval.

**This skill does not generate audio.** If the manifest is missing or empty, send the user back to `/digital-health-clinical-asr-build`.

## Audio leaves your environment — disclose this to the user before any clip is sent

This stage transmits each manifest row's WAV file plus its reference text to an external NVIDIA service. Surface this before invoking the first ASR call:

| Service | What gets sent | When |
|---|---|---|
| **NVIDIA NVCF Parakeet/Nemotron ASR** (`grpc.nvcf.nvidia.com`) | Every audio clip referenced by the manifest (raw PCM bytes), plus the reference transcript and the clinical-extension metadata for scoring | Step 3b, one call per manifest row |

The clips should be **synthetic audio generated by Stage 2** (Magpie TTS over a user-curated term list) — not real patient audio. **Do not pass real ASR recordings, real patient encounters, or any PHI through this skill.** Scoring then runs locally (pure-Python WER/CER/KER/SER, or `jiwer` if installed). The scoring step itself does not transmit anything; only the ASR step does.

## Critical workflow rules (apply on every activation)

For methodology questions (leaderboard structure, KER definition, decision tree), answer from this file. Don't invoke tools, call other skills, or run scripts unless the user explicitly asks to execute against a real manifest. Surface these facts in any response:

1. **Off-ramp first.** If the user is asking about something outside scoring, route and stop without running any workflow:
   - ASR model-catalog selection / comparison / alternative NIMs → `/riva-asr`
   - ASR auth (API keys, bearer tokens, function IDs) → `/riva-asr`
   - ASR gRPC protocol, streaming, batching, chunking, retries → `/riva-asr`
   - NIM deploy / `riva-build` / `riva-deploy` → `/riva-asr-custom`
   - NGC / Docker / NVIDIA Container Toolkit → `/riva-nim-setup`
   - No manifest yet → `/digital-health-clinical-asr-build`
   - Wants to fine-tune now with a known KER → `/digital-health-clinical-asr-finetune`
2. **Default ASR NIM is `nvidia/parakeet-tdt-0.6b-v2`** (NVCF function-id `d3fe9151-442b-4204-a70d-5fcc597fd610`, offline gRPC). Env-var overrides: `ASR_MODEL_NAME` (leaderboard display name), `ASR_NVCF_FUNCTION_ID` (swap to a different hosted NIM — e.g. Whisper Large v3 `b702f636-…` while the Parakeet backend is faulting, or a fine-tuned NIM), `ASR_ENDPOINT` (self-hosted gRPC; takes precedence). Echo the chosen NIM **and the resolved function-id** back before spending API credits.
3. **ASR transcription is inlined in Step 3b** (NVCF gRPC + `riva.client.ASRService.offline_recognize`, same auth pattern as Stage 1). For deeper protocol/auth questions, alternative NIM catalogs, or self-hosted Riva NIM configuration, defer to `/riva-asr`.
4. **KER is the headline.** Per-row check: the flagged `term` words must appear *in order, contiguous, adjacent* in the normalized hypothesis. `cefazolin → cefa zolin` is a miss. Aggregate WER hides clinically dangerous failures; both are reported, KER is the gate.
5. **The by-`ipa_source` split is the most informative single number** in the leaderboard. The `merriam-webster` vs `magpie_g2p` delta proves the SSML override pipeline is doing real work. Read it aloud to the user.
6. **Special-case routing.** `merriam-webster` rows good, `magpie_g2p` rows bad → pronunciation-coverage gap, **not** a model gap. Route back to `/digital-health-clinical-asr-build` Step 2d. **Do NOT recommend `/digital-health-clinical-asr-finetune`** as a first response.
7. **Five-section leaderboard order.** Headline (WER/CER/KER/SER) → KER by `entity_category` → KER by `ipa_source` → KER by `noise_level` → Per-term KER worst-first. The by-`ipa_source` section is mandatory; it is the proof the SSML pipeline works.

## Purpose

Score a clinical-ASR manifest, produce a five-section KER leaderboard, and route the user via the post-eval decision tree. Methodology details (metric definitions, normalization, leaderboard order, special-case routing) live in Critical Workflow Rules above and Instructions below.

## When to use this skill

Activate on user phrases like:

- "Score my ASR manifest"
- "What's the KER on Parakeet TDT v2?"
- "Run the eval on cycle-N"
- "Compare two ASR models on the clinical benchmark"
- "Generate the leaderboard"
- "I have a manifest.jsonl, how do I score it?"
- "Why is KER 0.4 when WER is 0.07?"
- "Should we fine-tune?" *(this is the eval-side question — the post-eval decision tree lives in this skill)*

**Literal-keyword non-activation check** — if the user's message contains any of `authenticate`, `API key`, `bearer`, `function ID`, `gRPC`, `streaming`, `chunking`, `batching`, `transcription retry`, `riva-build`, `riva-deploy`, `NIM deploy`, `NGC`, `Docker`, `Container Toolkit`, or asks "which ASR model is best" / "compare models" / "vendor differences" — **do NOT activate** the scoring workflow. Apply Critical Workflow Rule #1 above to route to the right sibling skill and stop. This applies even if the user mentions "KER" or "eval" alongside the keyword.

## Prerequisites

- **A NeMo-format manifest** with the clinical extension fields (`term`, `entity_category`, `ipa_source`, `voice_id`, `noise_level`, `context_type`). The schema is documented in the build skill's `references/manifest-schema.md`.
- **`NVIDIA_API_KEY`** exported (Stage 1 prerequisite still applies).
- **`nvidia-riva-client` + `soundfile`** installed (Stage 1 prerequisite). For self-hosted Riva NIM details, see `/riva-asr` Option B.
- **Audio files actually present on disk** — run the audio-existence pre-flight from the manifest-schema reference before spending API credits.

## Instructions

### 3a. Pick the ASR NIM

**Default**: `nvidia/parakeet-tdt-0.6b-v2` via NVCF gRPC (offline), function-id `d3fe9151-442b-4204-a70d-5fcc597fd610`. NVIDIA's current English ASR recommendation — fastest/cheapest in the catalog, and supported in NeMo's stock SFT recipe so the Stage 3 baseline and a Stage 4 fine-tune ride the same model family.

Three runtime env-var override knobs (`ASR_MODEL_NAME` for leaderboard display, `ASR_NVCF_FUNCTION_ID` to swap to a different hosted NIM, `ASR_ENDPOINT` for self-hosted gRPC) plus the full alternate-NIM catalog (Parakeet TDT 1.1B, Parakeet CTC 1.1B, Whisper Large v3, Nemotron streaming) with function IDs and call-shape notes: `references/offline-asr-recipe.md`.

Echo the chosen NIM, the resolved function-id, and any env-var overrides to the user **before** spending API credits. A 200-row manifest on hosted Parakeet TDT v2 is cheap; an accidental run against the wrong model on a 1,000-row manifest is not.

### 3b. Transcribe

For each row in `manifest.jsonl`, transcribe `audio_filepath` and write `per_sample.json` (one JSON object per row, JSONL or a JSON array — caller's choice):

```json
{
  "audio_filepath": "...",
  "ref": "<row.text>",
  "hyp": "<asr output>",
  "term": "<row.term>",
  "entity_category": "<row.entity_category>",
  "ipa_source": "<row.ipa_source>",
  "voice_id": "<row.voice_id>",
  "noise_level": "<row.noise_level>",
  "context_type": "<row.context_type>"
}
```

**Recipe** (full Python in `references/offline-asr-recipe.md`): `transcribe_manifest(api_key, manifest_path, out_path, language_code="en-US")` opens an offline gRPC stream to NVCF (or to `ASR_ENDPOINT` if set for self-hosted Riva), calls `riva.client.ASRService.offline_recognize` per row — sentences in a clinical manifest are ≤ 30 s so no streaming/batching needed — and writes the JSONL above. Same `auth_for` shape as the Stage 1 setup smoke test. The agent harness passes `api_key` explicitly; the recipe reads the three env-var overrides (`ASR_NVCF_FUNCTION_ID`, `ASR_MODEL_NAME`, `ASR_ENDPOINT`) at the top so auditors see the knobs in one place.

**Whisper fallback** (when Parakeet's NVCF backend faults with `CUDA illegal-memory-access` from Triton) and **self-hosted Riva NIM** (`ASR_ENDPOINT=localhost:50051`) env-var patterns: see `references/offline-asr-recipe.md` (§Whisper fallback, §Self-hosted Riva NIM).

**Resilience knobs deferred to the user.** If NVCF returns `RESOURCE_EXHAUSTED` mid-batch, the loop raises on that row; re-run from the failing row. Streaming/batching/retry-with-backoff are out of scope — see `/riva-asr`.

### 3c. Score four metrics

For every row, compute:

| Metric | What it measures | Why we keep it |
|---|---|---|
| **WER** | Word error rate (Levenshtein on tokens, after normalization) | Industry standard; blunt instrument for clinical |
| **CER** | Character error rate | Catches near-misses on long compound names |
| **KER** ★ | Keyword error rate — did the flagged `term` appear in the hypothesis (normalized, **contiguous** match)? | **Headline clinical signal** |
| **SER** | Sentence error rate (1 if any wrong, 0 if perfect) | Sanity bound; what the doctor experiences |

**Normalization (apply to both `ref` and `hyp` before all four metrics):**

1. Lowercase.
2. NFKD-normalize (smart quotes → ASCII, etc.).
3. Strip punctuation **except hyphen**.
4. Collapse whitespace runs to a single space.

**Inline scoring recipes** — `normalize` / `edit_distance` / `wer` / `cer` / `ker` / `ser` (pure-Python, no `jiwer` dependency): see `references/scoring-recipes.md`. Aggregate across rows by taking `mean(per-row score)` for each metric.

**Strict KER** — term words must appear *in order, adjacent* in the normalized hypothesis. This is conservative: `cefazolin → cefa zolin` counts as a miss. That's the right call clinically — a downstream pharmacy lookup will fail on the misspelled token.

KER does **not** punish surrounding errors. A row where the term is correct and the rest of the sentence is garbage still scores KER=0; the WER on that row will surface the broader problem separately.

### 3d. Breakdowns + leaderboard

Write a five-section markdown leaderboard, **in this order**:

1. **Headline** — overall WER, CER, KER, SER for the chosen model.
2. **KER by `entity_category`** — drug vs procedure vs anatomy vs ... This is what the user actually cares about for deployment.
3. **KER by `ipa_source`** — **the most informative single number in the leaderboard.** The delta between `merriam-webster` and `magpie_g2p` rows is the proof the SSML override pipeline is doing real work. *Read this section aloud to the user.*
4. **KER by `noise_level`** — clinical environments are loud. `snr_5db` rows are closer to reality than `clean`.
5. **Per-term KER** (worst first) — these are your Stage 4 fine-tune targets.

A representative `ipa_source` split with the merriam-webster vs magpie_g2p delta interpretation: `references/scoring-recipes.md` §Representative ipa_source split. The delta tells the deployment story — if the user sees a wide gap and asks "should we fine-tune?", the answer is *not yet*; route them back to `/digital-health-clinical-asr-build`'s IPA QA pipeline (Stage 2d). See the decision tree below.

## Decision tree (after eval)

Read the **priority-category KER** (drug KER for most clinical workflows, procedure KER for surgical workflows) and route:

| KER on priority category | Recommend |
|---|---|
| **> 0.3** | `/digital-health-clinical-asr-finetune`. Manifest is already NeMo-format-ready. Note: rows ≥ 100 is the minimum for a believable fine-tune signal; if the manifest is smaller, grow it first via `/digital-health-clinical-asr-build`. |
| **0.1 – 0.3** | Either expand the term list (back to `/digital-health-clinical-asr-build` with new domain terms — usually surfaces more failures cheaper than tuning) **or** fine-tune. On a *first* eval, expand. On a *later* eval where you've already grown the manifest, tune. |
| **< 0.1** | Strong baseline. Don't tune yet — you'd be optimizing against a saturated metric. Push the eval harder: add voices, noise levels, contexts, adversarial terms. Loop back to `/digital-health-clinical-asr-build`. |

**Special case — `merriam-webster` rows score well but `magpie_g2p` rows are bad.** That's a pronunciation-hint coverage gap, **not a model gap**. Route back to `/digital-health-clinical-asr-build` Step 2d (IPA QA review), not to `/digital-health-clinical-asr-finetune`. Fine-tuning over a TTS-pronunciation gap teaches the model to mis-recognize the model's own mistakes — the wrong fix.

## Examples

**Scenario A — first eval on a fresh cycle-1 manifest.** User: *"I have `manifest.jsonl` with 200 clinical audio rows already, with `term` and `entity_category` fields. How do I score it?"* → Skip Stage 2 entirely. Run the audio-existence pre-flight. Pick `parakeet-tdt-0.6b-v2` (default) and echo the choice + resolved function-id. Run the inlined Step 3b recipe (`transcribe_manifest(...)`). Score the four metrics. Produce the five-section leaderboard. Read the by-`ipa_source` split to the user. Apply the decision tree against drug KER.

**Scenario B — interpreting a mixed result.** User: *"Eval shows KER 0.05 on rows tagged `merriam-webster` but 0.40 on rows tagged `magpie_g2p`. Should I fine-tune?"* → No — this is the special case. The model is fine; the pronunciation hints aren't covering the long-tail terms. Route the user back to `/digital-health-clinical-asr-build` Step 2d to audition the `magpie_g2p` rows and append verified IPA to `pronunciation_overrides.csv`. Re-run Stage 3 after the rebuild before reconsidering Stage 4.

## Artifacts produced

- `per_sample.json` — per-row transcription results with all clinical-extension fields preserved (the ASR `hyp` joined to the manifest's `ref` and metadata)
- `results.csv` — per-row WER/CER/KER/SER scores
- `leaderboard_cycle<N>.md` — five-section markdown report

(File names are user-chosen; the names above are conventions the rest of this skill assumes.)

## Troubleshooting

- **"No manifest found"** → user skipped Stage 2. Route to `/digital-health-clinical-asr-build` or confirm `$MANIFEST_PATH`.
- **All rows KER=1** → normalization mismatch between `ref` and `hyp`. Apply the four normalization steps to both sides.
- **All rows KER=0 but WER high** → likely misaligned manifest (audio row mismatch). Spot-check a few `(ref, hyp)` pairs by hand.
- **`merriam-webster` low, `magpie_g2p` high** → pronunciation-coverage gap. Route to `/digital-health-clinical-asr-build` Step 2d. **Don't fine-tune** — model isn't the problem.
- **Both `merriam-webster` and `magpie_g2p` high** → real model gap. Stage 4 is the right route (manifest ≥ 100 rows).
- **`clean` rows fine, `snr_5db` balloons** → robustness gap; expand noise diversity via `/digital-health-clinical-asr-build`.
- **Riva-NIM and offline NeMo results diverge** → Riva preprocessing / `riva-build` flags. Route to `/riva-asr-custom`.
- **`RESOURCE_EXHAUSTED` on large manifests** → retry after 30 s; slice + re-run dropped rows. Built-in backoff: `/riva-asr`.
- **`Auth.__init__() got 'ssl_cert'`** / **CUDA illegal-memory-access on Parakeet function ID**: see `references/offline-asr-recipe.md` (ssl_root_cert rename + §Whisper fallback).

Anything else: identify the upstream owner. ASR protocol / NIM deploy → `/riva-asr`. Scoring → here.

## Limitations

- **English-only by default.** Tokenization + normalization assume Latin script and en-US lexicon.
- **Strict-contiguous KER is conservative.** A near-miss like `cefa zolin` counts as a miss. That's intentional — pharmacy lookups fail on near-misses. Users wanting "soft" matching can switch to phoneme-level edit distance, which is a methodology extension, not a config tweak.
- **One model per eval run.** Comparing two models means running the eval twice and diffing the two `leaderboard_cycle<N>.md` files (or extending the recipe to write multi-model rows yourself).
- **Hosted-only paths assumed.** Self-hosted NIMs work but require `/riva-nim-setup` first.

## Next steps

- **Forward (KER > 0.3, manifest ≥ 100 rows):** `/digital-health-clinical-asr-finetune`.
- **Back to build (KER 0.1–0.3 on first eval, or `magpie_g2p` gap):** `/digital-health-clinical-asr-build`.
- **Stop (KER < 0.1):** the eval is saturated. Harden it before declaring victory.
- **Lateral** for ASR protocol / auth / streaming / self-hosted NIM details: `/riva-asr`.

## References

- [`references/offline-asr-recipe.md`](references/offline-asr-recipe.md) — full Step 3b Python recipe (`transcribe_manifest`, `resolve_asr_config`, `build_asr_auth`), function-ID catalog with call-shape notes, Whisper fallback, self-hosted Riva NIM setup
- [`references/scoring-recipes.md`](references/scoring-recipes.md) — pure-Python WER/CER/KER/SER scoring functions with the canonical 4-step normalization


Instalar digital-health-clinical-asr-eval

Descarga y descomprime los archivos de habilidades en tu directorio .claude/skills/.

Descargar ZIP

Clona el repositorio y copia los archivos de la habilidad a tu proyecto.

git clone https://github.com/NVIDIA/skills/tree/main/skills/digital-health-clinical-asr-eval # Copy SKILL.md to your .claude/skills/ directory

Copiar Copiar
Configuración rápida: Copia la carpeta de la habilidad en .claude/skills/ Claude detectará y utilizará automáticamente la habilidad
Repositorio NVIDIA/skills

Habilidades relacionadas

web-search
Tiempo actualizado 29 de junio de 2026
webapp-testing
Tiempo actualizado 29 de junio de 2026
lark-base
Tiempo actualizado 5 de julio de 2026
agentmail
Tiempo actualizado 29 de junio de 2026
OR