8.2 语音识别:SenseVoiceSmall
麦克风就位后,接下来让 DORA 节点调用 SenseVoiceSmall 语音识别模型,把音频转为文字。
SenseVoiceSmall 是阿里达摩院开源的轻量语音识别模型,支持中文、英文、粤语、日语、韩语。通过 sherpa-onnx 运行时以 ONNX 格式运行,纯 CPU、免 PyTorch。
学习目标
学完本节,你将能够:
- 安装 sherpa-onnx 并下载 SenseVoice 模型
- 写一个 Python 节点加载 ASR 模型,对音频做语音识别
- 将识别结果发送到数据流中
前置要求
- 完成 8.1 麦克风与音频流,能采集麦克风音频
安装 sherpa-onnx
sherpa-onnx 是一个跨平台、纯 CPU 的语音推理库,无需安装 PyTorch 或 CUDA。
下载 SenseVoice 模型
如果 GitHub 下载慢,可使用 ModelScope 镜像:
需安装 git-lfs。模型约 40MB。
ASR 识别节点
新建 asr_node.py:
代码详解
用 sherpa-onnx 的 OfflineRecognizer 加载 SenseVoice 模型。use_itn=True 启用逆文本正则化(将数字文字转为阿拉伯数字等)。
累积音频片段到缓冲区。每次收到 audio 输入,追加到 audio_buffer。
当累积音频超过 1 秒(16kHz × 1s = 16000 样本),触发识别。这个阈值可以调整:越小响应越快,但准确率可能下降。
sherpa-onnx 的识别流程:创建流 → 输入波形 → 解码 → 获取结果。
保留最后 0.5 秒音频,用于和下一段拼接,避免说话中途切词。
数据流配置
dataflow.yml:
动手练习
stream.result 除了 text 属性外,还有 sentences 列表(每个 Sentence 包含 text、start、end 时间戳)。修改 asr_node.py,打印每句话的时间戳。
参考答案
常见问题 FAQ
sherpa_onnx 导入失败
确认安装了 sherpa-onnx:uv pip install sherpa-onnx。如果仍失败,可能需要安装 onnxruntime。
- 麦克风是否正常工作?
- 音频采样率是否为 16000?
- 说话声音是否足够大?
- 尝试调大
len(audio_buffer) >= 16000的阈值(如 32000)。
小结
- sherpa-onnx 是纯 CPU 的语音推理库,无需 PyTorch。
- SenseVoiceSmall 支持中英日韩粤等多语言识别。
- 累积音频到缓冲区(≥1 秒),触发识别,保留尾部用于拼接。
- 识别结果通过
text输出发送。