临床ASR飞轮 — 第一阶段(设置)
智能体:此文件是完整的第一阶段流程。 不要寻找安装脚本或隐藏配置——没有。四个部分(出站数据披露、三个编号检查、同级交接)均为必读。函数ID、环境变量约定和冒烟测试门控都内嵌在后面——请根据本文实际内容回答。
第一阶段的目标:证明用户可以使用其当前持有的NVIDIA_API_KEY访问NVIDIA托管的语音栈。一旦一个临床句子成功通过Magpie TTS → Parakeet/Nemotron ASR往返,用户即可进入/digital-health-clinical-asr-build。
四阶段飞轮用于降低临床实体(药物、手术、解剖、病情、化验、角色)的KER(关键词错误率)。WER平均值会掩盖临床上有害的失败;KER是第三阶段的衡量指标。
本技能没有脚本安装器——不是install.sh、setup.py或任何隐藏文件。第一阶段就是三个步骤:验证密钥、安装Python依赖、运行冒烟测试。任何超出第一阶段的内容由兄弟技能组合。
出站数据流——在任何文本或音频发送前声明
两个外部端点会接收数据。用户必须根据组织的数据治理策略确认。在你的回复中逐字渲染下表:
| 服务 | 发送内容 | 时间 | 托管方 |
|---|---|---|---|
NVIDIA NVCF (grpc.nvcf.nvidia.com) |
合成的临床句子(文本)和需要转写的WAV(音频) | 每次TTS/ASR调用 | NVIDIA,受build.nvidia.com条款约束 |
Merriam-Webster (dictionaryapi.com 或 merriam-webster.com) |
个体临床术语 | 第二阶段IPA标注 | Merriam-Webster,受其条款约束 |
数据是合成的,不要输入真实患者数据或PHI。任一外部端点均可关闭:
- 跳过Merriam-Webster:不设置
DICTIONARY_API_KEY,回退到Magpie G2P。 - 跳过NVCF:会导致本工作流无法适用(需要自托管方案)。
目的
让新环境做好进入第二阶段的准备:密钥存在、依赖可导入、托管栈有响应。并说明下一步技能。
何时使用
激活场景:“搭建临床ASR飞轮”、“初始化临床ASR评估”、“准备运行飞轮”。不要用于已有清单计分或环境搭建需要进入build阶段。
先决条件
NVIDIA_API_KEY(必需)- Python ≥ 3.10
nvidia-riva-client,pandas,soundfile,requestsDICTIONARY_API_KEY(可选)jiwer(可选)- 阶段4所需环境延迟到后续阶段
说明
本技能执行只读环境检查,不做系统修改。
1a. 验证NVIDIA_API_KEY(仅长度,永不回显值)
test -n "$NVIDIA_API_KEY" && echo "NVIDIA_API_KEY len=${#NVIDIA_API_KEY}"
长度为70+正常,不要打印密钥。可将export加入shell rc。
1b. 安装Python依赖
python3 -m venv .venv && source .venv/bin/activate && pip install nvidia-riva-client pandas soundfile requests
1c. 冒烟测试托管NVCF栈
密钥处理规则: 通过显式函数参数传入,永不echo/print/记录密钥值,不读取env。
import wave, tempfile, riva.client
NVCF_HOST = "grpc.nvcf.nvidia.com:443"
MAGPIE_FUNCTION_ID = "877104f7-e885-42b9-8de8-f6e4c6303969"
PARAKEET_FUNCTION_ID = "d3fe9151-442b-4204-a70d-5fcc597fd610"
def auth_for(function_id, api_key):
return riva.client.Auth(use_ssl=True, uri=NVCF_HOST, metadata_args=[["function-id", function_id], ["authorization", f"Bearer {api_key}"]])
def smoke_test(api_key):
# TTS
tts = riva.client.SpeechSynthesisService(auth_for(MAGPIE_FUNCTION_ID, api_key))
pcm = b"".join(c.audio for c in tts.synthesize_online(text="The patient was prescribed cefazolin.", voice_name="Magpie-Multilingual.EN-US.Mia", language_code="en-US", sample_rate_hz=16000))
with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f:
with wave.open(f, "wb") as w:
w.setnchannels(1); w.setsampwidth(2); w.setframerate(16000); w.writeframes(pcm)
wav_path = f.name
# ASR
asr = riva.client.ASRService(auth_for(PARAKEET_FUNCTION_ID, api_key))
with open(wav_path, "rb") as f:
audio_bytes = f.read()
config = riva.client.RecognitionConfig(encoding=riva.client.AudioEncoding.LINEAR_PCM, sample_rate_hertz=16000, language_code="en-US", max_alternatives=1, enable_automatic_punctuation=True)
response = asr.offline_recognize(audio_bytes, config)
transcript = response.results[0].alternatives[0].transcript if response.results else ""
print(f"TTS: The patient was prescribed cefazolin.")
print(f"ASR: {transcript}")
return transcript
运行冒烟测试不能延迟。如果转录匹配,进入第二阶段。失败按错误代码排查。
1d.(可选)验证Merriam-Webster
路径A检查DICTIONARY_API_KEY;路径B检查站点可达性。
示例
- 新用户环境:先展示披露表,再依次执行1a→1b→1c;成功后引导至
/digital-health-clinical-asr-build。 - 老用户环境:只做1a和1c。
产物
导出的NVIDIA_API_KEY、激活的venv和包含riva-client等依赖、一次成功的TTS→ASR往返。
故障排除
len=0:未导出。401:密钥错误/过期。function not found:函数ID过期,去build.nvidia.com更新。- 其他常见错误包括参数变更、依赖未安装、NVCF侧故障等,均对应处理。
限制
仅环境就绪范围;假定Magpie英语;仅合成数据;假定托管NVCF。
下一步
成功时必须指引用户到/digital-health-clinical-asr-build,并点名KER为第三阶段主要指标。
参考
见references/dependency-ownership.md。