option
MaisonMaison Skill Science des données et ML digital-health-clinical-asr-eval

digital-health-clinical-asr-eval

NVIDIA/skills NVIDIA/skills

Générer un manifeste ASR clinique par rapport à un NIM choisi, établir un classement KER en cinq sections et orienter l'utilisateur via un arbre de décision post-évaluation.

...Développer tout
1
Heure mise à jour 28 septembre 2026

Flywheel ASR clinique — Étape 3 (Évaluation)

⚠ Agent : lisez la section « Règles critiques du flux de travail » ci-dessous avant de répondre. Ce fichier SKILL.md est autonome — les répertoires evals/, references/ et assets/ sont des pointeurs, ils ne contiennent pas de données. Répondez directement aux questions de méthodologie contenues dans ce fichier ; n’invoquez des outils que lorsque l’utilisateur demande explicitement d’exécuter une opération sur un manifeste réel.

Vous représentez l’étape de notation et d’acheminement. L’utilisateur vous transmet un fichier manifest.jsonl au format NeMo (provenant soit de /digital-health-clinical-asr-build, soit d’une autre source). Vous le transcrivez via le NIM ASR choisi, évaluez quatre métriques, générez un classement en cinq sections et consultez l’arbre de décision pour déterminer si l’utilisateur doit passer à /digital-health-clinical-asr-finetune, revenir à /digital-health-clinical-asr-build ou s’arrêter et consolider l’évaluation.

Cette skill ne génère pas de contenu audio. Si le fichier manifest est manquant ou vide, redirigez l’utilisateur vers /digital-health-clinical-asr-build.

Les données audio quittent votre environnement — informez-en l’utilisateur avant l’envoi de tout extrait

Cette étape transmet le fichier WAV de chaque ligne du manifeste ainsi que son texte de référence à un service NVIDIA externe. Signalez-le avant d’effectuer le premier appel ASR :

Service Ce qui est envoyé Quand
NVIDIA NVCF Parakeet/Nemotron ASR (grpc.nvcf.nvidia.com) Chaque extrait audio référencé par le manifeste (octets PCM bruts), ainsi que la transcription de référence et les métadonnées d’extension clinique pour l’évaluation Étape 3b, un appel par ligne du manifeste

Les extraits doivent être des fichiers audio synthétiques générés par l’étape 2 (Magpie TTS à partir d’une liste de termes sélectionnés par l’utilisateur) — et non des enregistrements audio réels de patients. Ne transmettez pas d’enregistrements ASR réels, d’entretiens réels avec des patients ni aucune donnée de santé protégée (PHI) via cette skill. L’évaluation s’effectue ensuite localement (WER/CER/KER/SER en Python pur, ou jiwer s’il est installé). L’étape d’évaluation en elle-même ne transmet rien ; seule l’étape ASR le fait.

Règles essentielles du flux de travail (à appliquer à chaque activation)

Pour les questions de méthodologie (structure du classement, définition du KER, arbre de décision), répondez à partir de ce fichier. N’invoquez pas d’outils, n’appelez pas d’autres compétences et n’exécutez pas de scripts, sauf si l’utilisateur demande explicitement d’effectuer une exécution sur un manifeste réel. Indiquez clairement ces éléments dans toute réponse :

  1. Commencez par la sortie. Si l’utilisateur pose une question ne relevant pas de l’évaluation, redirigez-le et arrêtez le traitement sans exécuter de workflow :
    • Sélection / comparaison / NIM alternatifs du catalogue de modèles ASR → /riva-asr
    • Authentification ASR (clés API, jetons porteurs, identifiants de fonction) → /riva-asr
    • Protocole gRPC ASR, streaming, traitement par lots, découpage en blocs, tentatives de réessai → /riva-asr
    • Déploiement NIM / riva-build / riva-deploy → /riva-asr-custom
    • NGC / Docker / NVIDIA Container Toolkit → /riva-nim-setup
    • Pas encore de manifeste → /digital-health-clinical-asr-build
    • Souhaite effectuer un ajustement fin dès maintenant avec un KER connu → /digital-health-clinical-asr-finetune
  2. Le NIM ASR par défaut est nvidia/parakeet-tdt-0.6b-v2 (ID de fonction NVCF d3fe9151-442b-4204-a70d-5fcc597fd610, gRPC hors ligne). Remplacements par variables d’environnement : ASR_MODEL_NAME (nom d’affichage dans le classement), ASR_NVCF_FUNCTION_ID (permet de basculer vers un autre NIM hébergé — par ex. Whisper Large v3 b702f636-… lorsque le backend Parakeet rencontre des dysfonctionnements, ou un NIM optimisé), ASR_ENDPOINT (gRPC auto-hébergé ; a la priorité). Renvoie le NIM choisi et l’identifiant de fonction résolu avant de dépenser des crédits API.
  3. La transcription ASR est intégrée à l’étape 3b (NVCF gRPC + riva.client.ASRService.offline_recognize, même modèle d’authentification qu’à l’étape 1). Pour toute question plus approfondie concernant le protocole ou l’authentification, les autres catalogues NIM ou la configuration d’un NIM Riva auto-hébergé, consultez /riva-asr.
  4. Le KER est le critère principal. Vérification ligne par ligne : les mots des termes signalés doivent apparaître dans l’ordre, de manière contiguë et adjacente dans l’hypothèse normalisée. « cefazolin » → « cefa zolin » est une erreur. Le WER agrégé masque des échecs cliniquement dangereux ; les deux sont signalés, le KER est le critère déterminant.
  5. La répartition «by-ipa_source » est le chiffre unique le plus informatif du classement. L’écart entre merriam-webster et magpie_g2p prouve que le pipeline de remplacement SSML est réellement efficace. Lisez-le à voix haute à l’utilisateur.
  6. Routage des cas particuliers. Lignes « merriam-webster » bonnes, lignes « magpie_g2p » mauvaises → écart de couverture de la prononciation, et non un écart de modèle. Revenez à /digital-health-clinical-asr-build, étape 2d. Ne recommandez PAS /digital-health-clinical-asr-finetune comme première réponse.
  7. Ordre du classement en cinq sections. Titre (WER/CER/KER/SER) → KER par entity_category → KER par ipa_source → KER par noise_level → KER par terme, du pire au meilleur. La section «par ipa_source » est obligatoire ; elle prouve que le pipeline SSML fonctionne.

Objectif

Évaluer un manifeste de reconnaissance vocale clinique (ASR), générer un classement KER en cinq sections et orienter l’utilisateur via l’arbre de décision post-évaluation. Les détails méthodologiques (définitions des métriques, normalisation, ordre du classement, routage des cas particuliers) se trouvent dans les « Règles critiques du flux de travail » ci-dessus et dans les « Instructions » ci-dessous.

Quand utiliser cette compétence

À activer en réponse à des phrases de l’utilisateur telles que :

  • « Évalue mon manifeste ASR »
  • « Quel est le KER pour Parakeet TDT v2 ? »
  • « Lance l'évaluation sur le cycle N »
  • « Compare deux modèles ASR sur le benchmark clinique »
  • « Génère le classement »
  • « J'ai un fichier manifest.jsonl, comment puis-je l'évaluer ? »
  • « Pourquoi le KER est-il de 0,4 alors que le WER est de 0,07 ? »
  • « Faut-il procéder à un réglage fin ? » (il s’agit d’une question relative à l’évaluation — l’arbre de décision post-évaluation se trouve dans cette compétence)

Vérification de la non-activation des mots-clés littéraux — si le message de l'utilisateur contient l'un des termes suivants : « authenticate », « API key », « bearer », « function ID », « gRPC », « streaming », « chunking », « batching », « transcription retry », « riva-build », « riva-deploy », « NIM deploy », « NGC », Docker, Container Toolkit, ou s’il demande « quel modèle ASR est le meilleur » / « comparer les modèles » / « différences entre les fournisseurs » — NE PAS activer le workflow de notation. Appliquez la règle de workflow critique n° 1 ci-dessus pour rediriger vers la compétence sœur appropriée et arrêter le traitement. Cela s’applique même si l’utilisateur mentionne « KER » ou « eval » en plus du mot-clé.

Prérequis

  • Un manifeste au format NeMo comportant les champs d’extension cliniques (term, entity_category, ipa_source, voice_id, noise_level, context_type). Le schéma est documenté dans le fichier references/manifest-schema.md de la compétence de construction.
  • NVIDIA_API_KEY exportée (le prérequis de l’étape 1 s’applique toujours).
  • nvidia-riva-client + soundfile installés (condition préalable de l’étape 1). Pour plus de détails sur Riva NIM auto-hébergé, consultez /riva-asr Option B.
  • Fichiers audio effectivement présents sur le disque — exécutez le pré-contrôle « audio-existence » à partir du fichier manifest-schema avant de dépenser des crédits API.

Instructions

3a. Choisissez le NIM ASR

Par défaut: nvidia/parakeet-tdt-0.6b-v2 via NVCF gRPC (hors ligne), ID de fonction d3fe9151-442b-4204-a70d-5fcc597fd610. Recommandation actuelle de NVIDIA pour l’ASR en anglais — le modèle le plus rapide et le moins cher du catalogue, pris en charge dans la recette SFT standard de NeMo ; ainsi, la base de référence de l’étape 3 et l’ajustement fin de l’étape 4 utilisent la même famille de modèles.

Trois paramètres de configuration à modifier via des variables d’environnement d’exécution (ASR_MODEL_NAME pour l’affichage du classement, ASR_NVCF_FUNCTION_ID pour basculer vers un NIM hébergé différent, ASR_ENDPOINT pour le gRPC auto-hébergé), ainsi que le catalogue complet des NIM alternatifs (Parakeet TDT 1.1B, Parakeet CTC 1.1B, Whisper Large v3, Nemotron streaming) avec les identifiants de fonction et les remarques sur la structure des appels : references/offline-asr-recipe.md.

Indiquez à l’utilisateur le NIM choisi, l’ID de fonction résolu et toute modification des variables d’environnement avant de dépenser des crédits API. Un manifeste de 200 lignes sur un Parakeet TDT v2 hébergé ne coûte pas cher ; une exécution accidentelle avec le mauvais modèle sur un manifeste de 1 000 lignes, en revanche, coûte cher.

3b. Transcription

Pour chaque ligne du fichier manifest.jsonl, transcrivez le chemin d’accès au fichier audio (audio_filepath) et générez un fichier per_sample.json (un objet JSON par ligne, au format JSONL ou sous forme de tableau JSON — au choix de l’appelant) :

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

Recette (code Python complet dans references/offline-asr-recipe.md) : transcribe_manifest(api_key, manifest_path, out_path, language_code="en-US") ouvre un flux gRPC hors ligne vers NVCF (ou vers ASR_ENDPOINT si configuré pour Riva auto-hébergé), appelle riva.client.ASRService.offline_recognize pour chaque ligne — les phrases d’un manifeste clinique durent ≤ 30 s, donc aucun streaming ni traitement par lots n’est nécessaire — et écrit le JSONL ci-dessus. Même structure auth_for que lors du test de validation de la configuration de l’étape 1. Le harnais de l’agent transmet explicitement l’api_key; la recette lit les trois variables d’environnement de remplacement (ASR_NVCF_FUNCTION_ID, ASR_MODEL_NAME, ASR_ENDPOINT) en haut de la page afin que les auditeurs puissent voir tous les paramètres de réglage au même endroit.

Modèles de variables d’environnement pourla solution de secours Whisper (lorsque le backend NVCF de Parakeet rencontre une erreur liée à un accès mémoire illégal CUDA provenant de Triton) et pour le Riva NIM auto-hébergé (ASR_ENDPOINT=localhost:50051) : voir references/offline-asr-recipe.md (§Rechute vers Whisper, §Riva NIM auto-hébergé).

Les paramètres de résilience sont laissés à la discrétion de l’utilisateur. Si NVCF renvoie RESOURCE_EXHAUSTED en cours de traitement par lots, la boucle s’arrête à cette ligne ; relancez à partir de la ligne où l’échec s’est produit. Le traitement en continu, par lots et les nouvelles tentatives avec délai d’attente ne sont pas pris en charge — voir /riva-asr.

3c. Évaluer quatre métriques

Pour chaque ligne, calculer :

Métrique Ce qu’elle mesure Pourquoi nous la conservons
WER Taux d'erreur sur les mots (algorithme de Levenshtein sur les tokens, après normalisation) Norme du secteur ; outil peu précis pour une utilisation clinique
CER Taux d’erreur de caractères Détecte les quasi-erreurs sur les noms composés longs
KER ★ Taux d’erreur sur les mots-clés — le terme signalé figurait-il dans l’hypothèse (correspondance normalisée et contiguë ) ? Signal clinique principal
SER Taux d’erreur au niveau de la phrase (1 s’il y a une erreur, 0 si la phrase est parfaite) Limite de plausibilité ; ce que le médecin observe

Normalisation (à appliquer à la fois à « ref » et à « hyp » avant les quatre métriques) :

  1. Mise en minuscules.
  2. Normalisation NFKD (guillemets typographiques → ASCII, etc.).
  3. Supprimer la ponctuation à l’exception du trait d’union.
  4. Regrouper les séries d’espaces en un seul espace.

Recettes de notation en ligne — normalize / edit_distance / wer / cer / ker / ser (Python pur, sans dépendance jiwer ) : voir references/scoring-recipes.md. Agrégation sur les lignes en calculant la moyenne (score par ligne) pour chaque métrique.

KER strict — les mots du terme doivent apparaître dans l’ordre, adjacents dans l’hypothèse normalisée. C’est une approche prudente : « cefazolin » → « cefa zolin » est considéré comme une erreur. C’est la bonne décision d’un point de vue clinique — une recherche en pharmacie en aval échouera sur le mot mal orthographié.

Le KER ne pénalise pas les erreurs environnantes. Une ligne où le terme est correct et où le reste de la phrase est incompréhensible obtient tout de même un score KER = 0 ; le WER de cette ligne mettra en évidence le problème plus général séparément.

3d. Répartitions + classement

Rédigez un classement au format Markdown en cinq sections, dans cet ordre:

  1. Titre — WER, CER, KER et SER globaux pour le modèle choisi.
  2. KER par catégorie d’entité — médicament vs procédure vs anatomie vs… C’est ce qui intéresse réellement l’utilisateur en vue d’un déploiement.
  3. KER par source ipa — le chiffre le plus révélateur du classement. L’écart entre les lignes « merriam-webster » et « magpie_g2p » prouve que le pipeline de remplacement SSML fonctionne réellement. Lisez cette section à voix haute à l’utilisateur.
  4. KER par « noise_level » — les environnements cliniques sont bruyants. Les lignes « snr_5db » sont plus proches de la réalité que celles de type « clean ».
  5. KER par terme (du pire au meilleur) — ce sont vos cibles de réglage fin pour la phase 4.

Un découpage ipa_source représentatif avec l’interprétation de l’écart entre « merriam-webster » et « magpie_g2p » : references/scoring-recipes.md §Découpage ipa_source représentatif. Le delta raconte l’histoire du déploiement — si l’utilisateur constate un écart important et demande « faut-il procéder à un ajustement fin ? », la réponse est « pas encore » ; redirigez-le vers le pipeline de contrôle qualité IPA de /digital-health-clinical-asr-build(étape 2d). Voir l’arbre de décision ci-dessous.

Arbre de décision (après évaluation)

Lire le KER de la catégorie de priorité (KER « médicament » pour la plupart des workflows cliniques, KER « procédure » pour les workflows chirurgicaux) et acheminer :

KER par catégorie de priorité Recommander
> 0,3 /digital-health-clinical-asr-finetune. Le manifeste est déjà au format NeMo. Remarque : un minimum de 100 lignes est nécessaire pour obtenir un signal de réglage fin fiable ; si le manifeste est plus petit, augmentez-le d’abord via /digital-health-clinical-asr-build.
0,1 – 0,3 Soit vous élargissez la liste de termes (en retournant sur /digital-health-clinical-asr-build avec de nouveaux termes de domaine — cela fait généralement apparaître plus d’erreurs à moindre coût que le réglage) , soit vous procédez à un réglage fin. Lors d’une première évaluation, élargissez la liste. Lors d’une évaluation ultérieure, une fois que vous avez déjà enrichi le manifeste, procédez au réglage.
< 0,1 Bonne base de référence. Ne procédez pas encore à l’ajustement — vous optimiseriez alors par rapport à une métrique saturée. Poussez l’évaluation plus loin : ajoutez des voix, des niveaux de bruit, des contextes, des termes adversaires. Revenez à /digital-health-clinical-asr-build.

Cas particulier — les lignes « merriam-webster » obtiennent de bons scores, mais celles de « magpie_g2p » sont mauvaises. Il s’agit d’une lacune dans la couverture des indices de prononciation, et non d’une lacune du modèle. Revenez à /digital-health-clinical-asr-build, étape 2d (révision QA de l’API), et non à /digital-health-clinical-asr-finetune. Un réglage fin visant à combler un écart de prononciation TTS apprend au modèle à mal reconnaître ses propres erreurs — ce n’est pas la bonne solution.

Exemples

Scénario A — première évaluation sur un manifeste « cycle-1 » vierge. Utilisateur : « Je dispose d’ un fichier manifest.jsonl contenant déjà 200 lignes d’audio clinique, avec les champs term et entity_category. Comment puis-je l’évaluer ? » → Ignorez complètement l’étape 2. Lancez le contrôle préalable « audio-existence ». Sélectionnez parakeet-tdt-0.6b-v2 (par défaut) et indiquez ce choix ainsi que l’identifiant de la fonction résolue. Exécutez la recette intégrée de l’étape 3b (transcribe_manifest(...)). Évaluez les quatre métriques. Générez le classement en cinq sections. Lisez à l’utilisateur la répartitionpar source IPA. Appliquez l’arbre de décision au KER des médicaments.

Scénario B — interprétation d’un résultat mitigé. Utilisateur : « L’évaluation indique un KER de 0,05 sur les lignes marquées « merriam-webster », mais de 0,40 sur celles marquées « magpie_g2p ». Dois-je affiner le modèle ? » → Non — il s’agit d’un cas particulier. Le modèle est correct ; les indications de prononciation ne couvrent pas les termes de longue traîne. Redirigez l’utilisateur vers l’étape 2d de /digital-health-clinical-asr-build pour qu’il écoute les lignes « magpie_g2p » et ajoute l’IPA vérifiée au fichier pronunciation_overrides.csv. Relancez l’étape 3 après la reconstruction avant de réexaminer l’étape 4.

Fichiers générés

  • per_sample.json — résultats de transcription ligne par ligne avec tous les champs d’extension clinique conservés ( l’hyp ASR est associé à la référence et aux métadonnées du manifeste)
  • results.csv — scores WER/CER/KER/SER par ligne
  • leaderboard_cycle.md — rapport Markdown en cinq sections

(Les noms de fichiers sont choisis par l’utilisateur ; les noms ci-dessus correspondent aux conventions utilisées dans la suite de cette compétence.)

Dépannage

  • « Aucun manifeste trouvé » → l’utilisateur a ignoré l’étape 2. Accédez à /digital-health-clinical-asr-build ou vérifiez $MANIFEST_PATH.
  • Toutes les lignes ont KER=1 → incohérence de normalisation entre ref et hyp. Appliquez les quatre étapes de normalisation aux deux côtés.
  • Toutes les lignes ont KER=0 mais un WER élevé → manifeste probablement mal aligné (incohérence entre les lignes audio). Vérifiez manuellement quelques paires (référence, hypothèse).
  • merriam-webster faible, magpie_g2p élevé → écart de couverture de la prononciation. Accédez à /digital-health-clinical-asr-build, étape 2d. Ne procédez pas à un réglage fin — le modèle n’est pas en cause.
  • Valeurs élevées à la fois pour merriam-webster et magpie_g2p → véritable lacune du modèle. La phase 4 est la bonne voie à suivre (manifeste ≥ 100 lignes).
  • Lignespropres: tout va bien, mais le snr_5db grimpe en flèche → lacune de robustesse ; élargir la diversité du bruit via /digital-health-clinical-asr-build.
  • Les résultats de Riva-NIM et de NeMo hors ligne divergent → prétraitement Riva / indicateurs riva-build. Accédez à /riva-asr-custom.
  • ErreurRESOURCE_EXHAUSTED sur les manifestes volumineux → réessayer après 30 s ; découper et réexécuter les lignes perdues. Délai d’attente intégré : /riva-asr.
  • Auth.__init__() a reçu « ssl_cert » / accès mémoire illégal CUDA sur l’ID de fonction Parakeet: voir references/offline-asr-recipe.md (renommer ssl_root_cert + solution de secours §Whisper).

Autres cas : identifier le propriétaire en amont. Protocole ASR / déploiement NIM → /riva-asr. Notation → ici.

Limitations

  • Anglais uniquement par défaut. La tokenisation et la normalisation supposent l’utilisation de l’alphabet latin et du lexique en-US.
  • Le KER strictement contigu est conservateur. Un « near-miss » comme « cefa zolin » est considéré comme un échec. C’est intentionnel : les recherches en pharmacie échouent en cas de « near-miss ». Les utilisateurs souhaitant une correspondance « souple » peuvent passer à la distance d’édition au niveau des phonèmes, ce qui constitue une extension de la méthodologie et non un simple ajustement de configuration.
  • Un modèle par exécution d’évaluation. Comparer deux modèles implique d’exécuter l’évaluation deux fois et de comparer les deux fichiers `leaderboard_cycle.md ` (ou d’étendre la recette pour écrire vous-même des lignes multi-modèles).
  • On part du principe que les chemins sont exclusivement hébergés. Les NIM auto-hébergés fonctionnent, mais nécessitent au préalable l’exécution de la commande /riva-nim-setup.

Prochaines étapes

  • Avance (KER > 0,3, manifeste ≥ 100 lignes) : /digital-health-clinical-asr-finetune.
  • Retour à la phase de construction (KER compris entre 0,1 et 0,3 lors de la première évaluation, ou écart magpie_g2p ) : /digital-health-clinical-asr-build.
  • Arrêt (KER < 0,1) : l’évaluation est saturée. Renforcez le modèle avant de crier victoire.
  • Pour plus de détails sur le protocole ASR, l’authentification, le streaming et le NIM auto-hébergé : /riva-asr.

Références

  • references/offline-asr-recipe.md — recette Python complète de l’étape 3b (transcribe_manifest, resolve_asr_config, build_asr_auth), catalogue d’identifiants de fonctions avec notes sur la forme des appels, solution de secours Whisper, configuration du NIM Riva auto-hébergé
  • references/scoring-recipes.md — fonctions de notation WER/CER/KER/SER en Python pur avec la normalisation canonique en 4 étapes
Voir sur 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


Installer digital-health-clinical-asr-eval

Téléchargez et décompressez les fichiers de compétences dans votre répertoire .claude/skills/.

Télécharger le ZIP

Clonez le dépôt et copiez les fichiers de compétence dans votre projet.

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

Copier Copier
Configuration rapide: Copiez le dossier de la compétence dans .claude/skills/ Claude détectera et utilisera automatiquement cette compétence
Dépôt NVIDIA/skills

Compétences similaires

web-search
Heure mise à jour 29 juin 2026
webapp-testing
Heure mise à jour 29 juin 2026
lark-base
Heure mise à jour 5 juillet 2026
agentmail
Heure mise à jour 29 juin 2026
OR