实时识别
实时语音识别需要在低延迟的同时保证识别准确率,是语音助手、实时字幕等场景的核心技术。
实时识别概述
实时ASR(Streaming ASR)要求在用户说话的同时持续输出识别结果,对延迟和稳定性有严格要求。
核心指标
延迟(Latency)
从说话到显示结果的时间。实时系统通常要求延迟 < 500ms,高端系统要求 < 200ms。
准确率
实时识别的WER。需要在延迟和准确率之间平衡。
稳定性
结果变化的频率。不稳定的输出会影响用户体验。
端点检测
准确判断说话开始和结束。影响交互体验。
应用场景
| 场景 | 延迟要求 | 特点 |
|---|---|---|
| 语音助手 | <500ms | 需要VAD和唤醒词 |
| 实时字幕 | <1s | 需要高准确率 |
| 客服系统 | <300ms | 需要打断支持 |
| 会议转录 | <2s | 需要说话人分离 |
| 游戏语音 | <100ms | 极低延迟 |
技术挑战
实时识别面临独特的技术挑战,需要在多个维度进行权衡。
核心挑战
因果性约束
只能使用当前和过去的音频,不能"看到"未来。这与离线识别形成对比,离线可以使用全局上下文。
缓冲区管理
需要平衡延迟和上下文信息。缓冲区越大,上下文越丰富,但延迟越高。
结果修正
随着更多上下文到来,需要修正之前的结果。修正过于频繁会影响用户体验。
资源消耗
需要持续运行模型,对计算资源要求高。移动端部署需要特别优化。
延迟 vs 准确率权衡
这是实时ASR的核心权衡。更长的上下文窗口可以提高准确率,但会增加延迟。实践中需要根据场景选择合适的平衡点。
| 延迟目标 | 准确率 | 适用场景 |
|---|---|---|
| <100ms | 较低 | 游戏语音、实时交互 |
| 100-300ms | 中等 | 语音助手、客服 |
| 300-500ms | 较高 | 实时字幕、会议转录 |
| >500ms | 最高 | 准实时转写 |
解决方案
主流架构
RNN-T(RNN Transducer)
最成熟的流式端到端架构。通过预测网络和编码网络的组合,自然支持流式解码。工业界广泛使用。
Conformer Streaming
将Conformer改造为流式版本。使用分块注意力(Chunk Attention)机制,在保持性能的同时支持流式处理。
Chunk-based处理
将音频分成固定大小的块进行处理。每块独立编码,结合有限的左右上下文。平衡延迟和准确率。
两遍模型
第一遍快速识别,第二遍在句子结束后修正。结合低延迟和高准确率。
架构对比
| 架构 | 延迟 | 准确率 | 实现复杂度 |
|---|---|---|---|
| RNN-T | 低 | 中 | 中 |
| Streaming Conformer | 中 | 高 | 高 |
| Chunk-based | 可调 | 中 | 低 |
| Two-pass | 中 | 高 | 高 |
流式模型
开源模型
WeNet
出门问问开源的生产级语音识别工具包。支持Conformer+Transducer架构,提供完整的流式解决方案。
Sherpa-onnx
支持多种模型架构的流式推理框架。使用ONNX Runtime,支持多平台部署。
FunASR Streaming
阿里达摩院的流式语音识别方案。基于Paraformer的流式版本。
Whisper Streaming
社区实现的Whisper流式版本。虽然不是原生流式,但通过技巧实现准实时效果。
WeNet详解
双流解码
同时支持流式和非流式解码。流式模式提供低延迟,非流式模式提供高准确率。
统一训练
流式和非流式共享编码器,一次训练同时支持两种模式。
生产就绪
提供完整的部署方案,支持X86、ARM等多种平台。
实现要点
关键组件
音频采集
从麦克风或音频流获取音频数据。需要处理采样率转换、声道混合等。
VAD(语音活动检测)
检测是否有人在说话。用于触发识别和判断句子边界。
特征提取
实时提取MFCC或Fbank特征。需要在流式环境下高效运行。
解码器
将编码结果转换为文本。需要支持增量解码和结果修正。
后处理
添加标点、ITN等。需要支持流式处理。
流程示意
- 1. 采集音频:从麦克风获取音频数据块(如100ms)
- 2. VAD检测:判断是否有人说话
- 3. 特征提取:计算音频特征
- 4. 编码:通过编码器获取隐层表示
- 5. 解码:生成文本token
- 6. 输出:返回识别结果(中间或最终)
- 7. 修正:根据新上下文修正结果
性能优化
延迟优化
- • 减小块大小:更频繁地处理,但增加计算开销
- • 减少上下文:降低准确率换取更低延迟
- • 模型剪枝:使用更小的模型
- • 量化:INT8量化减少计算时间
- • 流水线并行:特征提取和解码并行
稳定性优化
- • 结果缓存:避免重复输出相同结果
- • 平滑策略:延迟不稳定结果的输出
- • 编辑距离限制:限制修正幅度
- • 置信度阈值:只输出高置信度结果
资源优化
- • 模型量化:INT8/INT4量化减少显存
- • 动态批处理:批处理多个请求
- • 端侧部署:利用NPU/DSP加速
- • 状态管理:复用模型状态减少初始化
常见问题
问题:结果频繁变化
解决方法:增加结果稳定策略,延迟不稳定输出,使用置信度过滤。
问题:延迟过高
解决方法:减小块大小,减少上下文窗口,使用更轻量的模型。
问题:资源占用高
解决方法:模型量化,批处理优化,考虑端侧部署。