实时识别

实时语音识别需要在低延迟的同时保证识别准确率,是语音助手、实时字幕等场景的核心技术。

预计阅读时间:45分钟·难度:中级

实时识别概述

实时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. 1. 采集音频:从麦克风获取音频数据块(如100ms)
  2. 2. VAD检测:判断是否有人说话
  3. 3. 特征提取:计算音频特征
  4. 4. 编码:通过编码器获取隐层表示
  5. 5. 解码:生成文本token
  6. 6. 输出:返回识别结果(中间或最终)
  7. 7. 修正:根据新上下文修正结果

性能优化

延迟优化

  • 减小块大小:更频繁地处理,但增加计算开销
  • 减少上下文:降低准确率换取更低延迟
  • 模型剪枝:使用更小的模型
  • 量化:INT8量化减少计算时间
  • 流水线并行:特征提取和解码并行

稳定性优化

  • 结果缓存:避免重复输出相同结果
  • 平滑策略:延迟不稳定结果的输出
  • 编辑距离限制:限制修正幅度
  • 置信度阈值:只输出高置信度结果

资源优化

  • 模型量化:INT8/INT4量化减少显存
  • 动态批处理:批处理多个请求
  • 端侧部署:利用NPU/DSP加速
  • 状态管理:复用模型状态减少初始化

常见问题

问题:结果频繁变化

解决方法:增加结果稳定策略,延迟不稳定输出,使用置信度过滤。

问题:延迟过高

解决方法:减小块大小,减少上下文窗口,使用更轻量的模型。

问题:资源占用高

解决方法:模型量化,批处理优化,考虑端侧部署。

----