| 名称 | “digital-health-clinical-asr-build” |
| 描述 | “临床ASR飞轮的第2阶段。用于策划临床术语、标注IPA,并合成NeMo manifest。不进行评分(使用/digital-health-clinical-asr-eval)。” |
| 版本 | “1.1.0” |
| 作者 | “Ben Randoing brandoing@nvidia.com” tags: - clinical-asr - dataset - ipa - magpie - nemo-manifest - flywheel tools: - Read - Write - Bash - Skill |
| 开源协议 | Apache-2.0 compatibility: “NVIDIA_API_KEY (必需) 用于通过NVCF使用托管的Magpie TTS。DICTIONARY_API_KEY (可选) 用于Merriam-Webster医学词典查询。必须先完成第1阶段 (/digital-health-clinical-asr-setup)。所有TTS、IPA和合成配方都已内联——无需同级代理技能。” metadata: |
| 作者 | “Ben Randoing brandoing@nvidia.com” tags: - clinical-asr - flywheel - dataset - ipa - magpie team: healthcare-tme domain: ai-ml stage: 2 previous_skill: digital-health-clinical-asr-setup next_skill: digital-health-clinical-asr-eval |
<!– SPDX-FileCopyrightText: Copyright © 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. SPDX-License-Identifier: Apache-2.0 –>
临床ASR飞轮 — 第2阶段(构建基准)
⚠ 代理:在回答之前请阅读整个SKILL.md。 本阶段是对话式和门控式的。具体来说:在提出术语(步骤2a)之前,先向用户提出1-2个专科意识澄清问题;在步骤2c中逐步引导用户了解两层IPA流水线(覆盖词表 → merriam-webster → magpie_g2p);在完整笛卡尔合成之前,在步骤2d命中显式QA模式试听门;并将KER作为他们在第3阶段会看到的主要指标。跳过任何一项都会破坏方法论。
您是策划与合成阶段。用户从/digital-health-clinical-asr-setup到达,并带着NeMo格式的manifest.jsonl以及它所引用的音频离开——两者都准备好在/digital-health-clinical-asr-eval中进行评分。
保持对话性。这是飞轮中最亲切、最领域感知的步骤:您问临床医生(或与他们一起工作的人)哪些术语今天造成了困扰,并围绕他们的现实情况构建基准。问简短、集中的问题。向用户展示正在添加的内容。不要长篇大论。
数据离开您的环境——在任何术语发送之前向用户披露此信息
本阶段将自己策划的内容传输到两个外部服务。在调用任一服务之前,向用户说明:
| 服务 | 发送内容 | 时间 |
|---|---|---|
Merriam-Webster (dictionaryapi.com API 或 merriam-webster.com 公共站点) |
每个种子列表术语一个HTTP请求——术语在URL路径中 | 步骤2c — 参见下面的MW路径要点 |
NVIDIA NVCF Magpie TTS (grpc.nvcf.nvidia.com) |
每个生成的临床句子(文本,以及任何SSML IPA包装) | 步骤2d和2e,每次合成调用 |
两个端点都期望非PHI合成内容——您策划的术语列表、/data-designer(或您的回退模板)从中生成的句子。不要通过此技能传递真实的患者记录、真实的ASR转录或任何PHI。 如果术语列表本身是敏感的(专有药物代号、未发布的产品名称、客户保密适应症),请确认用户根据其组织的数据治理政策同意外部API传输,然后再继续。
如果MW传输不可接受:采用路径C(跳过MW;流水线下降到Magpie G2P,对长尾术语的覆盖减少)。
目的
策划一个临床专科术语列表,通过Magpie TTS使用两层IPA流水线为其生成评估音频,并编写一个NeMo格式的manifest,并用临床扩展字段(term、entity_category、ipa_source、voice_id、noise_level、context_type)标记。输出是第3阶段的输入。
最终用户将拥有:
$EVAL_DIR/cycle<N>/
├── audio/<slug>.wav 合成的剪辑
├── manifest.jsonl NeMo格式 + 临床扩展
├── term_seed.csv 策划的输入
└── pronunciation_overrides.csv 可跨周期追加
($EVAL_DIR 是用户自己的选择——本技能不强制布局。上述结构是建议,不是要求。)
何时使用本技能
在用户短语如下时激活:
- “构建临床ASR基准”
- “为ASR评估策划药物名称/手术名称”
- “为医学术语生成评估音频”
- “从临床术语创建NeMo manifest”
- “向我的基准添加肿瘤学/心脏病学/骨科术语”
- “试听这些药物名称的TTS发音”
- “为我制作一个周期N清单”
不要在以下情况激活(另外:如果消息提及auth、API key、gRPC、streaming、riva-build、NIM deploy、NGC或Docker,按下面的要点路由并停止):
- 用户已有清单并想对其进行评分 →
/digital-health-clinical-asr-eval - 用户想基于现有清单进行微调 →
/digital-health-clinical-asr-finetune - 用户询问通用TTS / SSML / 声音克隆 / 声音目录问题 →
/read-aloud(或/riva-tts) - TTS/ASR 认证 / API密钥 / gRPC / 流式 →
/riva-tts或/riva-asr - NIM部署或
riva-build/riva-deploy标志 →/riva-asr-custom或/riva-tts-custom - NGC / Docker / NVIDIA容器工具包 →
/riva-nim-setup - 用户询问通用合成数据问题 →
/data-designer
先决条件
- 已完成
/digital-health-clinical-asr-setup—NVIDIA_API_KEY已导出,Python依赖已安装,六个上游技能已确认。 /read-aloud(或/riva-tts)可达。默认使用NVCF上的托管Magpie。自托管Magpie NIM可用,但会增加/riva-nim-setup到先决条件链。- **
/data-designer**可达。如果/data-designer不可用,模板回退对于第一个周期是可以接受的,但标记这些行,以便未来的周期可以重新生成。 - 用户拥有的工作目录。 本技能建议
$EVAL_DIR/cycle<N>/但不强制执行。
说明
2a. 专科访谈 → term_seed.csv
一次问一个问题。 目标是提出4-10个具有正确entity_category的候选术语,而不是写教科书。
问题按顺序:
- 这是用于什么专科/工作流程?(肿瘤学听写、ICU交接、精神科入院、骨科术后等)
- 您见过哪些ASR故障模式? — 药物名称、多词手术、缩写、复合病症。
- 哪些术语每天出现,哪些是困难的? — 日常常见术语成为健全性基线;日常困难术语成为信号。
提出4-10个具有entity_category的候选术语。写入前与用户确认。然后写入term_seed.csv:
term,entity_category
cefazolin,drug
acetabular reamer,procedure
tibial plateau,anatomy
femoroacetabular impingement,condition
hemoglobin a1c,lab
respiratory therapist,role
类别词汇是固定的。 KER依赖它。允许的值:
drug | procedure | anatomy | condition | lab | role
如果用户提出新类别,请推回:要么映射到六个类别之一,要么该类别需要有意扩展方法论(这是未来周期的工作,而不是一次性的临时添加)。
2b. 通过/data-designer生成句子
向/data-designer简要说明:
对于
term_seed.csv中的每一行,生成一个或多个自然的英语句子,将term嵌入到适合其entity_category的方式中。输出模式:{term, entity_category, sentence, context_type}。每个术语生成3-5个context_type变体。初始context_type词汇:dictation、handoff、chart_note、history。句子长度10-30个词。
此步骤的输出是每个术语的句子变体文件。任何文件名都可以——选择一个并在周期目录中一致使用。
模板回退。 如果/data-designer不可用,使用4模板回退(每种context_type一个)并机械替换term。在manifest中标记这些行(context_type已设置,句子只是不够自然),以便未来的周期可以重新生成。
2c. 两层IPA标记(关键质量杠杆)
每个术语按顺序通过3层流水线:
- 覆盖词表 —
pronunciation_overrides.csv携带团队已审计的已验证IPA。如果term匹配此行,覆盖词表优先。 - Merriam-Webster — 对于未覆盖的术语,获取MW重拼写,转换为IPA,对Magpie的美式英语音素集进行验证。如果两者都成功,术语被标记为
merriam-webster。 - Magpie G2P(回退) — 如果覆盖词表和MW都没有产生有效的IPA,则在合成时将纯文本传给Magpie的神经G2P。该行被标记为
magpie_g2p。
每个manifest行都携带ipa_source标签(override | merriam-webster | magpie_g2p)。在第3阶段排行榜中merriam-webster行和magpie_g2p行之间的差异就是发音策略有效性的证明——当您生成排行榜时,明确指出这一点。
三种MW查询选择 — 全部标记为merriam-webster。A:dictionaryapi.com JSON API + DICTIONARY_API_KEY(在dictionaryapi.com免费获取)— 推荐用于独立使用。B:抓取merriam-webster.com的HTML — 无密钥,但易受站点HTML变化影响;配方内联在references/pronunciation-pipeline.md中。C:跳过MW,回退到Magpie G2P,长尾覆盖较弱。两个配方和完整的重拼写→IPA表位于references/pronunciation-pipeline.md中。路径A函数将api_key作为参数(从不读取os.environ);传递None跳过MW。
pronunciation_overrides.csv模式:
term,ipa,verified_by,verified_at,notes
cefazolin,sɛfəˈzoʊlɪn,brandoing,2026-05-13,根据MW重拼写+耳测确认
跨周期仅追加。之后重新运行构建会自动获取新条目。
2d. QA模式合成(不要跳过此门)
在运行完整笛卡尔积之前,使用第一个声音、干净噪声、默认上下文为每个术语合成一个wav。与用户试听每个剪辑。
对于每个标记为magpie_g2p的术语,使用临床后缀模式提出一个IPA候选,并在建议之前对Magpie的美式英语音素集进行验证:
| 后缀 | 重音模式(示例) |
|---|---|
-mycin |
…ˈmaɪsɪn (vancomycin, gentamicin) |
-prazole |
…ˈpreɪzoʊl (esomeprazole, omeprazole) |
-statin |
…ˈstætɪn (atorvastatin, rosuvastatin) |
-sartan |
…ˈsɑːrtən (losartan, valsartan) |
-azole |
…ˈeɪzoʊl (fluconazole, ketoconazole) |
-cillin |
…ˈsɪlɪn (amoxicillin, piperacillin) |
-parin |
…ˈpɛərɪn (enoxaparin, heparin) |
音素验证模式 — 用候选IPA实时探测Magpie的美式英语神经G2P。如果Magpie接受SSML,则该IPA在其库存中。使用上述后缀模式作为预过滤器(廉价启发式),并在提交覆盖词表之前使用实时探测确认。magpie_validates_ipa(ipa, api_key, voice_id)配方 — 一个最小的NVCF gRPC合成调用,返回True/False并安全失败 — 位于references/pronunciation-pipeline.md。
在向用户展示之前,对每个候选IPA调用一次。若用户批准,将验证过的IPA追加到pronunciation_overrides.csv。该行的ipa_source在下一次manifest生成时从magpie_g2p翻转为override。
在步骤2e之前的HITL试听门 — 安全失败。 在以下情况之一在对话中明确发生之前,不要合成完整笛卡尔积,不要将任何暂存IPA候选提升到pronunciation_overrides.csv,也不要前进到第3阶段:
- 用户确认已经试听了QA剪辑并报告他们对每个剪辑(或每个桶:“MW集听起来不错”、"修复
pembrolizumab"等)的判断。提供afplay(macOS)或paplay/aplay(Linux)命令,以便用户可以播放它们 — 然后暂停并等待他们听完后回复。仅通过AskUserQuestion提示进行纸上批准 — 单击"全部提升"或"锁定"而没有试听 — 不满足此门。Magpie验证IPA证明它在音素库存中;但不证明它与预期的发音匹配。只有用户的耳朵才能做到这一点。 - 用户明确选择跳过本周期试听,使用深思熟虑的语言(例如*“跳过试听,接受发音错误可能稀释第3阶段KER信号的风险 — 将其记录为周期N的注意事项”*),而不是单击通过所产生的副作用。在周期级注释(如
eval/cycle<N>/cycle_notes.md)中记录跳过,以便未来的操作员可以看到试听被推迟。
Magpie NVCF在>100行任务上积极速率限制,而重做既花费API积分和时钟时间 — 但更大的风险是发布一个带有错误发音参考音频的manifest,悄然损坏第3阶段KER信号。花在试听上的时间比重新运行周期更便宜。
2e. 完整基准生成
发音锁定后,生成完整笛卡尔积|terms| × |voices| × |noise_levels| × |context_types|。默认值:2-4个Magpie美式英语声音(Mia/Jason/Ray)、[clean, snr_15db, snr_5db]、[dictation, handoff, chart_note, history]。
自包含合成 — 不需要/read-aloud。synthesize_row(row, all_overrides, out_dir, api_key)配方 — 打开NVCF gRPC流,通过render_sentence_with_overrides将覆盖词表包装成SSML,写入16位单声道PCM到<out_dir>/audio/<slug>.wav — 位于references/pronunciation-pipeline.md(§合成调用)。关键不变量:all_overrides携带pronunciation_overrides.csv中的每个条目(包括上下文词覆盖词表,如intravenously),以便渲染器包装其确切文本出现在row['text']中的任何覆盖词表。只包装row['term']会静默丢弃上下文词覆盖词表。
噪声注入(干净 → snr_15db → snr_5db)和manifest模式(NeMo规范字段 + 临床扩展,加上预检模式和音频存在检查)都位于references/manifest-schema.md中。
当产品>100行时警告。 Magpie NVCF在大运行上以约5-10%的RESOURCE_EXHAUSTED下降速率限制。重新运行掉过的行。
第2阶段完成检查表
在所有五个子步骤运行之前,不要认为第2阶段完成。代理经常在2a或2b之后停止;目标是合成manifest加上交接:
- 2a —
term_seed.csv,4-10个术语,entity_category ∈ {drug, procedure, anatomy, condition, lab, role} - 2b — 每个术语3-5个
context_type句子变体 - 2c — 每个术语标记
ipa_source ∈ {override, merriam-webster, magpie_g2p} - 2d — QA wav已试听,IPA覆盖词表在显式用户批准后锁定
- 2e —
manifest.jsonl+ 笛卡尔积的每行音频 - 交接 — 命名
/digital-health-clinical-asr-eval为下一个技能和KER作为其顶级指标
写入只进入用户选择的$EVAL_DIR/cycle<N>/。不要在其他地方写入、修改环境或安装包 — 这些属于/digital-health-clinical-asr-setup。
示例
场景A — 全新肿瘤学基准。 用户:“我们看到化疗药物名称转录错误。我从哪里开始?” → 步骤2a:确认专科是肿瘤学,询问哪些药物(免疫疗法生物制剂、铂类、紫杉烷类)。提出约10个候选项:cisplatin、paclitaxel、pembrolizumab、nivolumab、carboplatin、docetaxel、bevacizumab、trastuzumab、cetuximab、pemetrexed。用所有entity_category=drug写入term_seed.csv。步骤2b:简要说明/data-designer为每个药物生成4个上下文变体共40个句子。步骤2c:对每个术语进行MW查询 — 像pembrolizumab这样的生物制剂可能回退到magpie_g2p;铂类药物很可能命中MW。步骤2d:为每个术语合成一个QA wav,带用户逐个查看pembrolizumab等剪辑,使用-mab后缀重音模式提出IPA候选。步骤2e:批准后,运行10个术语×2个声音×2个噪声级别×3个上下文=120行。
场景B — 追加到现有周期。 用户:“我有一个周期1的清单,想再添加5个手术。” → 只重新运行步骤2a(仅针对新术语的专科访谈)、2b(为新增术语生成句子)、2c(为新增术语做IPA流水线)、2d(试听新术语)和2e(只合成新术语行)。追加到现有manifest.jsonl。不要为现有术语重新生成音频 — 周期隔离是有意为之,以便排行榜干净地比较周期N与周期N+1。
产生的工件
term_seed.csv— 具有entity_category的策划术语pronunciation_overrides.csv— 已验证的IPA,可跨周期追加manifest.jsonl— NeMo格式,带临床扩展字段(每行一个JSON对象)audio/<slug>.wav— 合成的剪辑,每个manifest行一个
故障排除
- **TTS速率限制下降(
RESOURCE_EXHAUSTED)**在>100行生成时 → 在Magpie NVCF上符合预期。确认/read-aloud中指数退避已激活;预期在大运行上约5-10%的下降,并为间隙重新运行。 - 所有
ipa_source行标记为magpie_g2p→ MW查询整体失败,或候选IPA未通过音素验证。重新验证您配置的MW路径(A用DICTIONARY_API_KEY;B用HTTPS可达性和解析器),然后对照Magpie的美式英语音素库存检查候选项。 - 即使使用IPA覆盖词表,Magpie仍错误发音 → 首先验证IPA在Magpie美式英语音素库存中,并且SSML包装语法有效。如果两者都检查通过,底层TTS错误由
/read-aloud(/riva-tts)所有 — 将其路由到那里进行诊断。本技能提供覆盖词表机制,但不拥有神经G2P或SSML解析器。 - 来自
/data-designer的句子变体平淡/模板化 → 检查简要说明;仅模式提示有时会产生刻板输出。向简要说明中添加1-2个上下文示例并重新运行。 - 音频文件存在但
manifest.jsonl短 → manifest编写器跳过了其合成返回NVCF错误的行。仅使用缺失的行重新运行构建。
对于此列表之外的任何内容,识别涉及的上游技能并路由到那里。digital-health-clinical-asr-build技能拥有方法论,而不是TTS或DataDesigner内部。
限制
- 默认仅英语。 两层IPA流水线针对Magpie的美式英语音素库存进行验证。其他语言环境需要不同的上游音素集和覆盖CSV格式。
- 六个固定实体类别。 扩展
entity_category是深思熟虑的方法论更改,而不是一次性调整 — KER分解、排行榜部分和下游微调脚本都依赖于词汇。 - 初始周期很小。 在约20个术语以下,按
ipa_source的排行榜拆分每个桶中没有足够的行来在统计上有意义。构建有意义的周期,即使花费一个会话。 - Magpie NVCF速率限制。 在大任务上约5-10%下降;预算重跑通过。
下一步
- 向前:
/digital-health-clinical-asr-eval— 转录manifest,对WER/CER/KER/SER进行评分,生成五部分排行榜。 - 返回设置(如果环境中有损坏):
/digital-health-clinical-asr-setup。 - 横向用于TTS特定调试:
/read-aloud或/riva-tts。
参考
references/manifest-schema.md— NeMo规范字段 + 临床扩展;预检模式和音频存在检查;跨周期稳定性规则