digital-health-clinical-asr-eval
NVIDIA/skills
Оценить клинический манифест ASR по выбранному NIM, сформировать рейтинг KER, состоящий из пяти разделов, и направить пользователя по дереву решений, составленному по итогам оценки.
...Расширить всеКлинический маховик ASR — Этап 3 (Оценка)
⚠ Агент: прежде чем отвечать, ознакомьтесь с разделом «Критические правила рабочего процесса» ниже. Этот файл SKILL.md является самодостаточным —
папки evals/,references/иassets/являются лишь указателями, а не несущими элементами. Отвечайте на вопросы по методологии непосредственно из этого файла; запускайте инструменты только в том случае, если пользователь явно просит выполнить операцию с реальным манифестом.
Вы представляете собой этап оценки и маршрутизации. Пользователь присылает файл manifest.jsonl в формате NeMo (либо из /digital-health-clinical-asr-build, либо из другого источника). Вы транскрибируете его с помощью выбранного ASR NIM, оцениваете четыре метрики, формируете таблицу лидеров из пяти разделов и анализируете дерево решений, чтобы определить, следует ли пользователю перейти к /digital-health-clinical-asr-finetune, вернуться к /digital-health-clinical-asr-build или остановиться и усовершенствовать оценку.
Этот скилл не генерирует аудио. Если манифест отсутствует или пуст, направьте пользователя обратно в /digital-health-clinical-asr-build.
Аудио покидает вашу среду — сообщите об этом пользователю до отправки любого клипа
На этом этапе WAV-файл каждой строки манифеста вместе с сопутствующим текстом передаётся на внешний сервис NVIDIA. Сообщите об этом перед выполнением первого вызова ASR:
| Сервис | Что отправляется | Когда |
|---|---|---|
NVIDIA NVCF Parakeet/Nemotron ASR (grpc.nvcf.nvidia.com) |
Каждый аудиоклип, на который есть ссылка в манифесте (необработанные байты PCM), а также соответствующая транскрипция и метаданные clinical-extension для оценки | Шаг 3b, один вызов на каждую строку манифеста |
Клипы должны представлять собой синтетический аудиосигнал, сгенерированный на этапе 2 (Magpie TTS на основе списка терминов, составленного пользователем) — а не реальные аудиозаписи пациентов. Не передавайте через этот навык реальные записи ASR, реальные записи встреч с пациентами или любую защищенную медицинскую информацию (PHI). Затем оценка выполняется локально (WER/CER/KER/SER на чистом Python или jiwer, если установлен). Сам этап оценки ничего не передает; передачу данных осуществляет только этап ASR.
Критические правила рабочего процесса (применяются при каждой активации)
На вопросы по методологии (структура таблицы лидеров, определение KER, дерево решений) отвечайте, опираясь на этот файл. Не запускайте инструменты, не вызывайте другие навыки и не запускайте скрипты, если пользователь явно не попросил выполнить операцию с реальным манифестом. Указывайте следующие факты в любом ответе:
- Сначала «Off-ramp». Если пользователь задает вопрос, не связанный с оценкой, перенаправьте его и остановите обработку, не запуская рабочий процесс:
- Выбор / сравнение / альтернативные NIM из каталога моделей ASR →
/riva-asr - Аутентификация ASR (ключи API, токены-носители, идентификаторы функций) →
/riva-asr - Протокол gRPC ASR, потоковая обработка, пакетная обработка, разбиение на фрагменты, повторные попытки →
/riva-asr - Развертывание NIM /
riva-build/riva-deploy→/riva-asr-custom - NGC / Docker / NVIDIA Container Toolkit →
/riva-nim-setup - Манифеста пока нет →
/digital-health-clinical-asr-build - Требуется точная настройка с использованием известного KER →
/digital-health-clinical-asr-finetune
- Выбор / сравнение / альтернативные NIM из каталога моделей ASR →
- ASR NIM по умолчанию —
nvidia/parakeet-tdt-0.6b-v2(идентификатор функции NVCFd3fe9151-442b-4204-a70d-5fcc597fd610, автономный gRPC). Переопределения переменных среды:ASR_MODEL_NAME(отображаемое имя в таблице лидеров),ASR_NVCF_FUNCTION_ID(переключение на другой размещённый NIM — например, Whisper Large v3b702f636-…, если бэкенд Parakeet не работает, или на тонко настроенный NIM),ASR_ENDPOINT(самостоятельно развернутый gRPC; имеет приоритет). Перед расходованием кредитов API следует проверить выбранный NIM и полученный идентификатор функции. - Транскрипция ASR выполняется встроенно на этапе 3b (NVCF gRPC +
riva.client.ASRService.offline_recognize, тот же шаблон аутентификации, что и на этапе 1). По более сложным вопросам, касающимся протокола или аутентификации, альтернативных каталогов NIM или настройки самостоятельно развернутого Riva NIM, обращайтесь к/riva-asr. - KER — это главный показатель. Проверка по каждой строке: помеченные
терминыдолжны появляться в нормированной гипотезе в порядке, непрерывно и рядом друг с другом.cefazolin → cefa zolin— это ошибка. Агрегированный показатель WER скрывает клинически опасные сбои; оба показателя фиксируются, но KER является решающим критерием. - Показатель
«by-ipa_source»— это наиболее информативный показатель в таблице лидеров. Разница между«merriam-webster»и«magpie_g2p»доказывает, что конвейер переопределения SSML действительно работает. Прочитайте это вслух пользователю. - Маршрутизация для особых случаев. Строки
«merriam-webster»— хорошие, строки«magpie_g2p»— плохие → разрыв в охвате произношения, а не разрыв в модели. Вернитесь к шагу 2dв /digital-health-clinical-asr-build. НЕ рекомендуйте/digital-health-clinical-asr-finetuneв качестве первого ответа. - Порядок в таблице лидеров из пяти разделов. Заголовок (WER/CER/KER/SER) → KER по
entity_category→ KER поipa_source→ KER поnoise_level→ KER по терминам (начиная с худших). Разделпо ipa_sourceявляется обязательным; он служит доказательством того, что конвейер SSML работает.
Цель
Оценить манифест клинического ASR, сформировать таблицу лидеров KER из пяти разделов и направить пользователя по дереву решений после оценки. Подробности методологии (определения метрик, нормализация, порядок таблицы лидеров, маршрутизация в особых случаях) приведены в разделе «Критические правила рабочего процесса» выше и в «Инструкциях» ниже.
Когда использовать этот навык
Активируйте при таких фразах пользователя, как:
- «Оцени мой манифест ASR»
- «Каков показатель KER для Parakeet TDT v2?»
- «Запустите оценку на цикле N»
- «Сравни две модели ASR на клиническом тестовом наборе данных»
- «Создать таблицу лидеров»
- «У меня есть файл manifest.jsonl, как его оценить?»
- «Почему KER равен 0,4, если WER составляет 0,07?»
- «Стоит ли проводить тонкую настройку?» (это вопрос со стороны оценки — дерево решений после оценки находится в этом навыке)
Проверка на отсутствие активации по буквальным ключевым словам — если сообщение пользователя содержит любое из следующих слов: authenticate, API key, bearer, function ID, gRPC, streaming, chunking, batching, transcription retry, riva-build, riva-deploy, NIM deploy, NGC, Docker, Container Toolkit, либо задаёт вопросы «какая модель ASR лучше» / «сравнить модели» / «различия между поставщиками» — НЕ активируйте рабочий процесс оценки. Примените правило критического рабочего процесса № 1, указанное выше, чтобы перенаправить запрос на соответствующий навык-близнец и остановиться. Это правило действует даже в том случае, если пользователь упоминает «KER» или «eval» наряду с ключевым словом.
Необходимые условия
- Манифест в формате NeMo с полями клинического расширения (
term,entity_category,ipa_source,voice_id,noise_level,context_type). Схема описана в файлеreferences/manifest-schema.mdнавыка build. - Экспортированный
NVIDIA_API_KEY(по-прежнему действует предварительное условие этапа 1). - Установлены
nvidia-riva-client+soundfile(предпосылка этапа 1). Подробности о самостоятельно развернутом Riva NIM см. в разделе/riva-asr, вариант B. - Аудиофайлы действительно присутствуют на диске — запустите предварительную проверку audio-existence из справочника manifest-schema, прежде чем тратить кредиты API.
Инструкции
3a. Выберите ASR NIM
По умолчанию: nvidia/parakeet-tdt-0.6b-v2 через NVCF gRPC (офлайн), function-id d3fe9151-442b-4204-a70d-5fcc597fd610. Текущая рекомендация NVIDIA по ASR на английском языке — самая быстрая и дешевая в каталоге, поддерживаемая в стандартном рецепте SFT от NeMo, поэтому базовый вариант этапа 3 и точная настройка этапа 4 используют одну и ту же семейство моделей.
Три параметра для переопределения переменных среды выполнения (ASR_MODEL_NAME для отображения в таблице лидеров, ASR_NVCF_FUNCTION_ID для переключения на другой хостируемый NIM, ASR_ENDPOINT для автономного gRPC), а также полный каталог альтернативных NIM (Parakeet TDT 1.1B, Parakeet CTC 1.1B, Whisper Large v3, потоковый Nemotron) с идентификаторами функций и примечаниями по структуре вызовов: references/offline-asr-recipe.md.
Перед расходованием кредитов API сообщите пользователю выбранный NIM, определённый идентификатор функции и любые переопределения переменных среды. Манифест из 200 строк для размещённого на хостинге Parakeet TDT v2 обходится недорого; а вот случайный запуск на неправильной модели с манифестом из 1 000 строк — нет.
3b. Транскрибировать
Для каждой строки в manifest.jsonl транскрибируйте audio_filepath и запишите в файл per_sample.json (один объект JSON на строку, в формате JSONL или массива JSON — по выбору вызывающего):
{
"audio_filepath": "...",
"ref": "",
"hyp": "",
"term": "",
"entity_category": "",
"ipa_source": "",
"voice_id": "",
"noise_level": "",
"context_type": ""
}
Рецепт (полный код на Python в файле references/offline-asr-recipe.md): transcribe_manifest(api_key, manifest_path, out_path, language_code="en-US") открывает автономный поток gRPC к NVCF (или к ASR_ENDPOINT, если он настроен для самохостинговой версии Riva), вызывает riva.client.ASRService.offline_recognize для каждой строки — предложения в клиническом манифесте занимают ≤ 30 с, поэтому потоковая обработка или пакетная обработка не требуются — и записывает приведённый выше JSONL. Формат auth_for такой же, как в тестовом запуске настройки этапа 1. Агент явно передаёт api_key; рецепт считывает три переопределения переменных среды (ASR_NVCF_FUNCTION_ID, ASR_MODEL_NAME, ASR_ENDPOINT) в самом начале, чтобы аудиторы могли увидеть все настройки в одном месте.
Шаблоны переменных средыдля резервного варианта Whisper (когда бэкенд NVCF Parakeet выдает ошибку из-за недопустимого доступа к памяти CUDA со стороны Triton) и для автономно развернутого Riva NIM (ASR_ENDPOINT=localhost:50051): см. references/offline-asr-recipe.md (§Резервный вариант Whisper, §Самостоятельно размещённый Riva NIM).
Настройки отказоустойчивости переданы пользователю. Если NVCF возвращает RESOURCE_EXHAUSTED в середине пакетной обработки, цикл прерывается на этой строке; повторный запуск начинается со строки, на которой произошла ошибка. Потоковая обработка, пакетная обработка и повторные попытки с отсрочкой выходят за рамки данного документа — см. /riva-asr.
3c. Оценка по четырём метрикам
Для каждой строки вычисляйте:
| Показатель | Что измеряет | Почему мы её учитываем |
|---|---|---|
| WER | Коэффициент ошибок в словах (алгоритм Левенштейна для токенов после нормализации) | Отраслевой стандарт; неточный инструмент для клинических целей |
| CER | Коэффициент ошибок символов | Выявляет «почти ошибки» в длинных сложных названиях |
| KER ★ | Коэффициент ошибок по ключевым словам — фигурировал ли отмеченный термин в гипотезе (нормализованное, непрерывное совпадение)? |
Основной клинический сигнал |
| SER | Показатель ошибок в предложении (1, если есть ошибки, 0 — если предложение идеально) | Предел достоверности; то, что испытывает врач |
Нормализация (применяется как к референции, так и к гипотезе перед расчётом всех четырёх показателей):
- Преобразование в нижний регистр.
- Нормализация по NFKD (фигурные кавычки → ASCII и т. д.).
- Удаление знаков препинания, кроме дефиса.
- Сворачивание последовательностей пробелов в один пробел.
Встроенные рецепты оценки — normalize / edit_distance / wer / cer / ker / ser (на чистом Python, без зависимости от jiwer ): см. references/scoring-recipes.md. Агрегируем по строкам, вычисляя среднее значение (score на строку) для каждого показателя.
Строгий KER — слова термина должны появляться в порядке, непосредственно следуя друг за другом в нормализованной гипотезе. Это консервативный подход: «cefazolin» → «cefa zolin» считается промахом. С клинической точки зрения это правильное решение — последующий поиск в аптечной базе данных завершится неудачей из-за неправильно написанного токена.
KER не учитывает ошибки в окружающем тексте. Строка, в которой термин написан правильно, а остальная часть предложения содержит бессмысленный текст, всё равно получает оценку KER=0; показатель WER для этой строки отдельно выявит более общую проблему.
3d. Разбивка по категориям + таблица лидеров
Напишите таблицу лидеров в формате Markdown, состоящую из пяти разделов, в следующем порядке:
- Заголовок — общие показатели WER, CER, KER, SER для выбранной модели.
- KER по
entity_category— лекарства vs процедуры vs анатомия vs ... Именно это действительно важно для пользователя при развертывании. - KER по
ipa_source— самое информативное число в таблице лидеров. Разница между строкамиmerriam-websterиmagpie_g2p— доказательство того, что конвейер переопределения SSML действительно работает. Прочитайте этот раздел пользователю вслух. - KER по
noise_level— клиническая среда «шумная». Строки с показателемsnr_5dbближе к реальности, чем«чистые». - KER по терминам (начиная с худших) — это ваши цели для тонкой настройки на 4-м этапе.
Типичный разбивка ipa_source с интерпретацией разницы между merriam-webster и magpie_g2p: references/scoring-recipes.md §Representative ipa_source split. Дельта рассказывает историю развертывания — если пользователь видит большой разрыв и спрашивает «стоит ли проводить тонкую настройку?», ответ — пока нет; направьте его обратно в конвейер контроля качества IPA на /digital-health-clinical-asr-build(этап 2d). См. дерево решений ниже.
Дерево принятия решений (после оценки)
Ознакомьтесь с KER соответствующей категории приоритета (KER «лекарства» для большинства клинических рабочих процессов, KER «процедуры» для хирургических рабочих процессов) и перенаправьте:
| KER по категории приоритета | Рекомендовать |
|---|---|
| > 0,3 | /digital-health-clinical-asr-finetune. Манифест уже подготовлен в формате NeMo. Примечание: для получения достоверного сигнала тонкой настройки требуется не менее 100 строк; если манифест меньше, сначала увеличьте его с помощью команды /digital-health-clinical-asr-build. |
| 0,1 – 0,3 | Либо расширьте список терминов (вернитесь к команде /digital-health-clinical-asr-build с новыми терминами из домена — как правило, это выявляет больше ошибок с меньшими затратами, чем настройка) , либо выполните тонкую настройку. При первой оценке расширяйте список. При последующей оценке, когда манифест уже расширен, выполняйте тонкую настройку. |
| < 0,1 | Сильная исходная точка. Пока не настраивайте — вы будете оптимизировать по насыщенному показателю. Усильте оценку: добавьте голоса, уровни шума, контексты, враждебные термины. Вернитесь к /digital-health-clinical-asr-build. |
Особый случай — строки из merriam-webster показывают хорошие результаты, а строки из magpie_g2p — плохие. Это пробел в охвате подсказок по произношению, а не недостаток модели. Вернитесь к шагу 2d (проверка качества IPA) в /digital-health-clinical-asr-build, а не к /digital-health-clinical-asr-finetune. Тонкая настройка с учетом разрыва в произношении TTS учит модель неправильно распознавать собственные ошибки — это неверное исправление.
Примеры
Сценарий A — первая оценка на новом манифесте цикла 1. Пользователь: «У меня есть файл manifest.jsonl, в котором уже есть 200 строк клинического аудио с полями term и entity_category. Как мне оценить его?» → Полностью пропустите этап 2. Запустите предварительную проверку наличия аудио. Выберите parakeet-tdt-0.6b-v2 (по умолчанию) и отобразите выбор + идентификатор разрешённой функции. Запустите встроенный рецепт шага 3b (transcribe_manifest(...)). Оцените четыре метрики. Составьте таблицу лидеров из пяти разделов. Прочитайте пользователю разбивкупо ipa_source. Примените дерево решений к KER лекарственного средства.
Сценарий B — интерпретация неоднозначного результата. Пользователь: «Оценка показывает KER 0,05 для строк с тегом merriam-webster, но 0,40 для строк с тегом magpie_g2p. Стоит ли проводить тонкую настройку?» → Нет — это особый случай. Модель работает нормально; подсказки по произношению не охватывают термины с длинным хвостом. Направьте пользователя обратно к шагу 2d раздела /digital-health-clinical-asr-build, чтобы прослушать строки с тегом «magpie_g2p» и добавить проверенные коды МФА в файл pronunciation_overrides.csv. Перед повторным рассмотрением этапа 4 запустите этап 3 заново после пересборки.
Полученные результаты
per_sample.json— результаты транскрипции по строкам со сохранением всех полей клинического расширения (гипотезаASR присоединена кrefи метаданным манифеста)results.csv— показатели WER/CER/KER/SER для каждой строкиleaderboard_cycle— отчет в формате Markdown, состоящий из пяти разделов.md
(Имена файлов выбираются пользователем; приведённые выше имена являются условными обозначениями, которые используются в остальной части данного навыка.)
Устранение неполадок
- «Манифест не найден» → пользователь пропустил этап 2. Перейдите по ссылке
/digital-health-clinical-asr-buildили проверьте$MANIFEST_PATH. - Все строки KER=1 → несовпадение нормализации между
refиhyp. Примените четыре шага нормализации к обеим сторонам. - Все строки KER=0, но высокий показатель WER → вероятно, несогласованный манифест (несоответствие строк аудио). Проведите выборочную проверку нескольких пар
(ref, hyp)вручную. merriam-websterнизкий,magpie_g2pвысокий → разрыв в охвате произношений. Перейдите к/digital-health-clinical-asr-build, этап 2d. Не проводите тонкую настройку — проблема не в модели.- Высокие значения как для
merriam-webster, так и дляmagpie_g2p→ реальный пробел в модели. Правильным путем является этап 4 (манифест ≥ 100 строк). Чистыестроки в порядке, резкий ростsnr_5db→ разрыв в устойчивости; расширьте разнообразие шумов через/digital-health-clinical-asr-build.- Результаты Riva-NIM и автономного NeMo расходятся → флаги предварительной обработки Riva /
riva-build. Перейдите по пути к/riva-asr-custom. RESOURCE_EXHAUSTEDпри больших манифестах → повторная попытка через 30 с; фрагментация + повторный запуск пропущенных строк. Встроенная задержка:/riva-asr.В auth.__init__() получено «ssl_cert»/ ошибка CUDA «illegal-memory-access» по идентификатору функции Parakeet: см.references/offline-asr-recipe.md(переименование ssl_root_cert + резервный вариант §Whisper).
В остальных случаях: определите владельца исходного кода. Протокол ASR / развёртывание NIM → /riva-asr. Оценка → здесь.
Ограничения
- По умолчанию только английский язык. Токенизация + нормализация предполагают латинский алфавит и лексикон en-US.
- Строго-непрерывный KER является консервативным. Почти-промах, такой как
cefa zolin, считается промахом. Это сделано намеренно — поиск в фармацевтических базах данных завершается неудачей при почти-промахах. Пользователи, желающие «мягкого» сопоставления, могут переключиться на расстояние редактирования на уровне фонем, что является расширением методологии, а не настройкой конфигурации. - Одна модель на один прогон оценки. Сравнение двух моделей означает запуск оценки дважды и сравнение двух файлов
`leaderboard_cycle(или расширение рецепта для самостоятельного записи строк с несколькими моделями)..md` - Предполагается использование только хостируемых версий. Самостоятельно развернутые NIM работают, но сначала требуется выполнить
/riva-nim-setup.
Следующие шаги
- Продвижение (KER > 0,3, манифест ≥ 100 строк):
/digital-health-clinical-asr-finetune. - Вернуться к сборке (KER 0,1–0,3 при первой оценке или разрыв
magpie_g2p):/digital-health-clinical-asr-build. - Остановка (KER < 0,1): оценка достигла предела. Усовершенствуйте модель, прежде чем объявлять о победе.
- Дополнительная информация о протоколе ASR / аутентификации / потоковой передаче / самостоятельно развернутом NIM:
/riva-asr.
Ссылки
references/offline-asr-recipe.md— полный рецепт на Python для шага 3b (transcribe_manifest,resolve_asr_config,build_asr_auth), каталог идентификаторов функций с примечаниями о синтаксисе вызова, резервный вариант Whisper, настройка автономного Riva NIMreferences/scoring-recipes.md— функции оценки WER/CER/KER/SER, написанные на чистом Python, с канонической 4-этапной нормализацией
---
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
Все файлы
7 файловУстановить digital-health-clinical-asr-eval
Скачайте файлы навыков и распакуйте их в каталог .claude/skills/.
Скачать ZIPКлонируйте репозиторий и скопируйте файлы навыка в свой проект.
git clone https://github.com/NVIDIA/skills/tree/main/skills/digital-health-clinical-asr-eval # Copy SKILL.md to your .claude/skills/ directory
Копировать





Дом
