<!-- SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. SPDX-License-Identifier: Apache-2.0 -->
Flywheel ASR Clinique — Stage 3 (Évaluation)
⚠ Agent : consultez la section Règles de Flux de Travail Critique ci-dessous avant de répondre. Ce SKILL.md est autonome —
evals/,references/, etassets/sont des pointeurs, non des éléments structurants. Répondez aux questions de méthodologie directement à partir de ce fichier ; n'invoquez les outils que si l'utilisateur demande explicitement une exécution contre un manifest réel.
Vous êtes l'étape score-et-routage. L'utilisateur arrive avec un manifest au format NeMo manifest.jsonl (soit depuis /digital-health-clinical-asr-build, soit apporté d'ailleurs). Vous le transcrivez via le NIM ASR choisi, évaluez quatre métriques, produisez un leaderboard à cinq sections, et consultez l'arbre de décision pour déterminer si l'utilisateur doit avancer vers /digital-health-clinical-asr-finetune, revenir à /digital-health-clinical-asr-build, ou arrêter et consolider l'évaluation.
Cette skill ne génère pas d'audio. Si le manifest est manquant ou vide, renvoyez l'utilisateur à /digital-health-clinical-asr-build.
L'audio quitte votre environnement — divulguez-le à l'utilisateur avant tout envoi de clip
Cette étape transmet le fichier WAV de chaque ligne du manifest ainsi que son texte de référence à un service NVIDIA externe. Rendez cela explicite avant d'invoquer le premier appel ASR :
| Service | Contenu envoyé | Quand |
|---|---|---|
NVIDIA NVCF Parakeet/Nemotron ASR (grpc.nvcf.nvidia.com) |
Chaque clip audio référencé par le manifest (octets PCM bruts), plus la transcription de référence et les métadonnées d'extension clinique pour l'évaluation | Étape 3b, un appel par ligne de manifest |
Les clips doivent être audio synthétique généré par Stage 2 (Magpie TTS sur une liste de termes sélectionnée par l'utilisateur) — pas audio patient réel. N'envoyez pas d'enregistrements ASR réels, d'encounters patients réels, ou toute PHI via cette skill. L'évaluation s'exécute ensuite localement (WER/CER/KER/SER pur Python, ou jiwer si installé). L'étape d'évaluation elle-même ne transmet rien ; seule l'étape ASR le fait.
Règles de Flux de Travail Critique (s'appliquent à chaque activation)
Pour les questions de méthodologie (structure du leaderboard, définition de KER, arbre de décision), répondez à partir de ce fichier. N'invoquez pas les outils, n'appelez pas d'autres skills, ne lancez pas de scripts à moins que l'utilisateur demande explicitement une exécution contre un manifest réel. Surfacez ces faits dans toute réponse :
- D'abord les sorties. Si l'utilisateur pose une question en dehors de l'évaluation, routez et arrêtez sans lancer de workflow :
- Sélection / comparaison / NIMs alternatifs du catalogue de modèles ASR →
/riva-asr - Auth ASR (clés API, bearer tokens, IDs de fonction) →
/riva-asr - Protocole gRPC ASR, streaming, batching, chunking, retries →
/riva-asr - Déploiement NIM /
riva-build/riva-deploy→/riva-asr-custom - NGC / Docker / NVIDIA Container Toolkit →
/riva-nim-setup - Pas encore de manifest →
/digital-health-clinical-asr-build - Souhaite fine-tuner maintenant avec un KER connu →
/digital-health-clinical-asr-finetune
- Sélection / comparaison / NIMs alternatifs du catalogue de modèles ASR →
- Le NIM ASR par défaut est
nvidia/parakeet-tdt-0.6b-v2(ID de fonction NVCFd3fe9151-442b-4204-a70d-5fcc597fd610, gRPC hors ligne). Surcharges par variable d'environnement :ASR_MODEL_NAME(nom d'affichage du leaderboard),ASR_NVCF_FUNCTION_ID(basculer vers un NIM hébergé différent — par exemple Whisper Large v3b702f636-…lors d'une panne du backend Parakeet, ou un NIM fine-tuné),ASR_ENDPOINT(gRPC auto-hébergé ; a priorité). Rappelez le NIM choisi et l'ID de fonction résolu avant de dépenser les crédits API. - La transcription ASR est intégrée à l'Étape 3b (gRPC NVCF +
riva.client.ASRService.offline_recognize, même modèle d'auth que Stage 1). Pour des questions plus approfondies de protocole/auth, des catalogues NIM alternatifs, ou la configuration auto-hébergée de Riva NIM, renvoyez à/riva-asr. - KER est le titre. Vérification par ligne : les mots
termmarqués doivent apparaître dans l'ordre, contigus, adjacents dans l'hypothèse normalisée.cefazolin → cefa zolinest un échec. L'agrégation WER masque les défaillances cliniquement dangereuses ; les deux sont rapportés, KER est la porte. - La division par
ipa_sourceest le chiffre unique le plus informatif du leaderboard. Le deltamerriam-webstervsmagpie_g2pprouve que le pipeline SSML override fonctionne réellement. Lisez-le à voix haute à l'utilisateur. - Routage de cas spéciaux. Les lignes
merriam-websterbonnes, les lignesmagpie_g2pmauvaises → écart de couverture de prononciation, pas une lacune du modèle. Routez vers/digital-health-clinical-asr-buildÉtape 2d. Ne recommandez PAS/digital-health-clinical-asr-finetunecomme première réponse. - Ordre du leaderboard à cinq sections. Titre (WER/CER/KER/SER) → KER par
entity_category→ KER paripa_source→ KER parnoise_level→ KER par terme (pire d'abord). La section paripa_sourceest obligatoire ; c'est la preuve que le pipeline SSML fonctionne.
Objectif
Évaluer un manifest ASR clinique, produire un leaderboard KER à cinq sections, et router l'utilisateur via l'arbre de décision post-évaluation. Les détails de méthodologie (définitions des métriques, normalisation, ordre du leaderboard, routage de cas spéciaux) se trouvent dans les Règles de Flux de Travail Critique ci-dessus et les Instructions ci-dessous.
Quand utiliser cette skill
Activez sur des phrases utilisateur comme :
- « Évaluez mon manifest ASR »
- « Quel est le KER sur Parakeet TDT v2 ? »
- « Lancez l'évaluation sur le cycle-N »
- « Comparez deux modèles ASR sur le benchmark clinique »
- « Générez le leaderboard »
- « J'ai un manifest.jsonl, comment l'évaluer ? »
- « Pourquoi KER est 0,4 quand WER est 0,07 ? »
- « Devrions-nous fine-tuner ? » (c'est la question du côté évaluation — l'arbre de décision post-évaluation se trouve dans cette skill)
Vérification de non-activation par mot-clé littéral — si le message de l'utilisateur contient l'un de ces termes : authentifier, clé API, bearer, ID de fonction, gRPC, streaming, chunking, batching, transcription retry, riva-build, riva-deploy, déploiement NIM, NGC, Docker, Container Toolkit, ou demande « quel modèle ASR est le meilleur » / « comparez des modèles » / « différences de vendeurs » — N'activez PAS le workflow d'évaluation. Appliquez la Règle de Flux de Travail Critique #1 ci-dessus pour router vers la skill sœur appropriée et arrêtez. Ceci s'applique même si l'utilisateur mentionne « KER » ou « évaluation » aux côtés du mot-clé.
Prérequis
- Un manifest au format NeMo avec les champs d'extension clinique (
term,entity_category,ipa_source,voice_id,noise_level,context_type). Le schéma est documenté dans le fichierreferences/manifest-schema.mdde la skill de build. NVIDIA_API_KEYexportée (prérequis Stage 1 toujours applicable).nvidia-riva-client+soundfileinstallés (prérequis Stage 1). Pour les détails des NIMs Riva auto-hébergés, voir/riva-asrOption B.- Fichiers audio réellement présents sur disque — lancez le pré-vol d'existence audio du manifest depuis la référence manifest-schema avant de dépenser les crédits API.
Instructions
3a. Choisir le NIM ASR
Par défaut : nvidia/parakeet-tdt-0.6b-v2 via gRPC NVCF (hors ligne), ID de fonction d3fe9151-442b-4204-a70d-5fcc597fd610. Recommandation ASR anglais actuelle de NVIDIA — la plus rapide/bon marché du catalogue, et supportée dans la recette SFT standard de NeMo, donc la baseline Stage 3 et un fine-tune Stage 4 utilisent la même famille de modèles.
Trois boutons de surcharge de variables d'environnement (ASR_MODEL_NAME pour l'affichage du leaderboard, ASR_NVCF_FUNCTION_ID pour basculer vers un NIM hébergé différent, ASR_ENDPOINT pour gRPC auto-hébergé) plus le catalogue complet de NIMs alternatifs (Parakeet TDT 1.1B, Parakeet CTC 1.1B, Whisper Large v3, Nemotron streaming) avec IDs de fonction et notes de forme d'appel : references/offline-asr-recipe.md.
Rappelez le NIM choisi, l'ID de fonction résolu, et les surcharges de variables d'environnement à l'utilisateur avant de dépenser les crédits API. Un manifest de 200 lignes sur Parakeet TDT v2 hébergé est bon marché ; une exécution accidentelle contre le mauvais modèle sur un manifest de 1 000 lignes ne l'est pas.
3b. Transcrire
Pour chaque ligne de manifest.jsonl, transcrivez audio_filepath et écrivez per_sample.json (un objet JSON par ligne, JSONL ou un tableau JSON — choix de l'appelant) :
{
"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>"
}
Recette (Python complète 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 défini pour Riva auto-hébergé), appelle riva.client.ASRService.offline_recognize par ligne — les phrases dans un manifest clinique sont ≤ 30 s donc pas de streaming/batching nécessaire — et écrit le JSONL ci-dessus. Même forme auth_for que la configuration de smoke test Stage 1. Le harnais agent transmet api_key explicitement ; la recette lit les trois surcharges de variables d'environnement (ASR_NVCF_FUNCTION_ID, ASR_MODEL_NAME, ASR_ENDPOINT) au sommet pour que les auditeurs voient les boutons en un seul endroit.
Fallback Whisper (quand le backend NVCF de Parakeet fonctionne mal avec CUDA illegal-memory-access depuis Triton) et Riva NIM auto-hébergé (ASR_ENDPOINT=localhost:50051) motifs de variables d'environnement : voir references/offline-asr-recipe.md (§Whisper fallback, §Self-hosted Riva NIM).
Boutons de résilience déférés à l'utilisateur. Si NVCF retourne RESOURCE_EXHAUSTED en milieu de batch, la boucle lève une exception sur cette ligne ; relancez à partir de la ligne défaillante. Le streaming/batching/retry-with-backoff sont hors périmètre — voir /riva-asr.
3c. Évaluer quatre métriques
Pour chaque ligne, calculez :
| Métrique | Ce qu'elle mesure | Pourquoi on la garde |
|---|---|---|
| WER | Word error rate (Levenshtein sur les jetons, après normalisation) | Standard industriel ; instrument imprecis pour le clinique |
| CER | Character error rate | Détecte les quasi-erreurs sur les longs noms composés |
| KER ★ | Keyword error rate — le term marqué a-t-il apparaître dans l'hypothèse (normalisée, match contigu) ? |
Signal clinique de titre |
| SER | Sentence error rate (1 si mauvais, 0 si parfait) | Borne raisonnable ; ce qu'expérimente le médecin |
Normalisation (appliquez-la à ref et hyp avant toutes les quatre métriques) :
- Minuscules.
- Normalisation NFKD (guillemets intelligents → ASCII, etc.).
- Supprimez la ponctuation sauf trait d'union.
- Réduisez les suites d'espaces à un seul espace.
Recettes d'évaluation intégrées — normalize / edit_distance / wer / cer / ker / ser (pur Python, pas de dépendance jiwer) : voir references/scoring-recipes.md. Agrégez les lignes en prenant mean(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 conservateur : cefazolin → cefa zolin compte comme un échec. C'est le bon choix cliniquement — une recherche de pharmacie en aval échouera sur le jeton mal orthographié.
KER n'influre pas les erreurs environnantes. Une ligne où le terme est correct et le reste de la phrase est un bazar score toujours KER=0 ; le WER sur cette ligne surfacera le problème plus large séparément.
3d. Ventilations + leaderboard
Écrivez un leaderboard markdown à cinq sections, dans cet ordre :
- Titre — WER, CER, KER, SER globaux pour le modèle choisi.
- KER par
entity_category— médicament vs procédure vs anatomie vs ... C'est ce qui compte réellement à l'utilisateur pour le déploiement. - KER par
ipa_source— le chiffre unique le plus informatif du leaderboard. Le delta entre les lignesmerriam-websteretmagpie_g2pest la preuve que le pipeline SSML override fonctionne réellement. Lisez cette section à voix haute à l'utilisateur. - KER par
noise_level— les environnements cliniques sont bruyants. Les lignessnr_5dbsont plus proches de la réalité queclean. - KER par terme (pire d'abord) — ce sont vos cibles de fine-tune Stage 4.
Un exemple représentatif de division ipa_source avec l'interprétation du delta merriam-webster vs magpie_g2p : references/scoring-recipes.md §Representative ipa_source split. Le delta raconte l'histoire du déploiement — si l'utilisateur voit un écart large et demande « devrions-nous fine-tuner ? », la réponse est pas encore ; routez-le vers le pipeline d'assurance qualité IPA de /digital-health-clinical-asr-build's (Stage 2d). Consultez l'arbre de décision ci-dessous.
Arbre de décision (après évaluation)
Lisez le KER de catégorie prioritaire (KER de médicament pour la plupart des workflows cliniques, KER de procédure pour les workflows chirurgicaux) et routez :
| KER sur catégorie prioritaire | Recommandation |
|---|---|
| > 0,3 | /digital-health-clinical-asr-finetune. Le manifest est déjà prêt au format NeMo. Remarque : lignes ≥ 100 est le minimum pour un signal de fine-tune crédible ; si le manifest est plus petit, développez-le d'abord via /digital-health-clinical-asr-build. |
| 0,1 – 0,3 | Soit étendez la liste de termes (retour à /digital-health-clinical-asr-build avec les nouveaux termes de domaine — généralement surface plus de défaillances moins chère que le tuning) ou fine-tuner. Sur une première évaluation, étendez. Sur une évaluation ultérieure où vous avez déjà développé le manifest, tuner. |
| < 0,1 | Baseline forte. Ne tuner pas encore — vous optimiseriez contre une métrique saturée. Poussez l'évaluation plus loin : ajoutez des voix, des niveaux de bruit, des contextes, des termes adversaires. Revenir à /digital-health-clinical-asr-build. |
Cas spécial — les lignes merriam-webster marchent bien mais les lignes magpie_g2p sont mauvaises. C'est un écart de couverture d'indices de prononciation, pas une lacune du modèle. Routez vers /digital-health-clinical-asr-build Étape 2d (examen d'assurance qualité IPA), pas vers /digital-health-clinical-asr-finetune. Le fine-tuning sur un écart de prononciation TTS enseigne au modèle à mal reconnaître ses propres erreurs — la mauvaise correction.
Exemples
Scénario A — première évaluation sur un manifest de cycle-1 frais. Utilisateur : « J'ai manifest.jsonl avec 200 lignes audio clinique déjà, avec les champs term et entity_category. Comment l'évaluer ? » → Ignorez entièrement Stage 2. Lancez le pré-vol d'existence audio. Choisissez parakeet-tdt-0.6b-v2 (par défaut) et rappelez le choix + ID de fonction résolu. Lancez la recette d'étape 3b intégrée (transcribe_manifest(...)). Évaluez les quatre métriques. Produisez le leaderboard à cinq sections. Lisez la division par ipa_source à l'utilisateur. Appliquez l'arbre de décision contre le KER de médicament.
Scénario B — interprétation d'un résultat mixte. Utilisateur : « L'évaluation montre KER 0,05 sur les lignes tagguées merriam-webster mais 0,40 sur les lignes tagguées magpie_g2p. Devrions-nous fine-tuner ? » → Non — c'est le cas spécial. Le modèle va bien ; les indices de prononciation ne couvrent pas les termes de longue traîne. Routez l'utilisateur vers /digital-health-clinical-asr-build Étape 2d pour auditionner les lignes magpie_g2p et ajouter l'IPA vérifiée à pronunciation_overrides.csv. Relancez Stage 3 après la reconstruction avant de reconsidérer Stage 4.
Artefacts produits
per_sample.json— résultats de transcription par ligne avec tous les champs d'extension clinique préservés (l'ASRhypjoint aurefet aux métadonnées du manifest)results.csv— scores WER/CER/KER/SER par ligneleaderboard_cycle<N>.md— rapport markdown à cinq sections
(Les noms de fichiers sont choisis par l'utilisateur ; les noms ci-dessus sont les conventions que le reste de cette skill suppose.)
Dépannage
- « Aucun manifest trouvé » → l'utilisateur a ignoré Stage 2. Routez vers
/digital-health-clinical-asr-buildou confirmez$MANIFEST_PATH. - Toutes les lignes KER=1 → décalage de normalisation entre
refethyp. Appliquez les quatre étapes de normalisation aux deux côtés. - Toutes les lignes KER=0 mais WER élevé → probablement manifest mal aligné (décalage de ligne audio). Vérifiez quelques paires
(ref, hyp)à la main. merriam-websterbas,magpie_g2pélevé → écart de couverture de prononciation. Routez vers/digital-health-clinical-asr-buildÉtape 2d. Ne pas fine-tuner — le modèle n'est pas le problème.merriam-websteretmagpie_g2ptous les deux élevés → vraie lacune du modèle. Stage 4 est la bonne route (manifest ≥ 100 lignes).- Lignes
cleanbonnes,snr_5dbexplose → lacune de robustesse ; élargissez la diversité du bruit via/digital-health-clinical-asr-build. - Résultats Riva-NIM et NeMo hors ligne divergent → prétraitement Riva / drapeaux
riva-build. Routez vers/riva-asr-custom. RESOURCE_EXHAUSTEDsur les grands manifests → relancez après 30 s ; découpez + relancez les lignes abandonnées. Backoff intégré :/riva-asr.Auth.__init__() got 'ssl_cert'/ CUDA illegal-memory-access sur ID de fonction Parakeet : voirreferences/offline-asr-recipe.md(renommage ssl_root_cert + §Whisper fallback).
Tout le reste : identifiez le propriétaire en amont. Protocole ASR / déploiement NIM → /riva-asr. Évaluation → ici.
Limitations
- Anglais uniquement par défaut. La tokenization + normalisation supposent un script latin et un lexique en-US.
- KER strict-contigu est conservateur. Une quasi-erreur comme
cefa zolincompte comme un échec. C'est intentionnel — les recherches en pharmacie échouent sur les quasi-erreurs. Les utilisateurs voulant une correspondance « douce » peuvent basculer vers la distance d'édition au niveau des phonèmes, ce qui est une extension de méthodologie, pas un ajustement de config. - Un modèle par évaluation. La comparaison de deux modèles signifie lancer l'évaluation deux fois et diff les deux fichiers
leaderboard_cycle<N>.md(ou étendre la recette pour écrire des lignes multi-modèles vous-même). - Chemins hébergés uniquement supposés. Les NIMs auto-hébergés fonctionnent mais nécessitent d'abord
/riva-nim-setup.
Étapes suivantes
- Avancer (KER > 0,3, manifest ≥ 100 lignes) :
/digital-health-clinical-asr-finetune. - Revenir à la construction (KER 0,1–0,3 sur première évaluation, ou écart
magpie_g2p) :/digital-health-clinical-asr-build. - Arrêter (KER < 0,1) : l'évaluation est saturée. Consolidez-la avant de déclarer la victoire.
- Latéral pour les détails du protocole ASR / auth / streaming / 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'ID de fonction avec notes de forme d'appel, fallback Whisper, configuration auto-hébergée de Riva NIMreferences/scoring-recipes.md— fonctions d'évaluation WER/CER/KER/SER pur Python avec la normalisation canonique à 4 étapes