语音识别-流式和非流式实现方式
文章目录
- 实现差异
- 非流式识别的实现
- 流式识别的实现
- 总结
实现差异
特性 | 非流式识别实现 | 流式识别实现 |
---|---|---|
模型架构 | 全局上下文模型(如:Transformer,全序列 BERT) | 流式兼容模型(如:RNN-T,Chunk-Based Transformer,流式 CTC) |
注意力机制 | 全局注意力:可关注整个音频序列的任何部分 | Chunk 注意力/单调注意力:只能关注过去和有限未来的音频块 |
解码策略 | 离线解码:完全句子的束搜索(Beam Search),可前向后向优化 | 流式解码:实时束搜索或贪心解码,可能结合右边界检测 |
数据流处理 | 整段输入:处理完整的音频文件或语音段 | Chunk 流输入:将音频切成小块(如:每 100ms)进行增量处理 |
输出方式 | 一次性输出:最终最优结果 | 增量输出:持续输出并修正假设词序列 |
非流式识别的实现
非流式的核心思想是 “纵观全局,优化决策”。
-
特征提取与整段输入:
- 系统首先读取整个音频文件,并提取全局特征(如 FBank,MFCC)
- 整个特征序列(比如一个
[T, D]
的矩阵,T 是时间步,D 是特征维度)被一次性送入声学模型
-
声学模型(关键区别所在):
- 使用可以看到整个序列的模型架构,最典型的是基于全局注意力机制的 Transformer 或 Conformer
- Self-Attention 机制:序列中的任何一个时间步都可以与所有其他时间步(无论是过去还是未来)进行交互和信息聚合。这意味着,识别第 1 秒的一个词时,模型可以参考第 10 秒的上下文信息来消除歧义。这是其高准确率的根本原因
-
解码与优化:
- 使用束搜索(Beam Search)在整个序列上寻找最优的词序列路径
- 由于没有时间压力,可以进行非常复杂的搜索和重评分(Rescoring),例如使用更大的语言模型对束搜索的 N 个最佳结果进行二次优化,选出最终最好的一个
-
输出:
- 整个过程结束后,输出唯一的最佳识别文本
简而言之,非流式实现像一个"闭卷考试",考生可以反复翻阅整本教材后再写下最终答案。
流式识别的实现
流式的核心思想是 “局部决策,快速响应,逐步修正”。其实现的关键在于如何在无法看到未来全部信息的情况下,尽可能做出正确的判断。
-
Chunk 流式特征提取与输入:
- 音频不是一次性输入,而是被分割成小的块进行流水线处理。例如,每 40ms 采集一次音频,但每 100ms(一个 chunk)送一次数据给模型
-
声学模型(为实现流式而做的特殊设计):
- 这是最核心的差异。流式模型必须被设计成因果的(Causal)或半因果的(Semi-Causal)
a. RNN-Transducer (RNN-T):
- 目前流式识别的主流和最佳选择。它由一个编码器(Encoder)、一个预测网络(Predictor)和一个联合网络(Joiner)组成
- 编码器:处理音频输入。可以设计成流式的,例如使用单向 LSTM 或因果卷积 + Chunk 注意力 Transformer,只使用过去和当前 chunk 的信息
- 预测网络:基于已经输出的历史文本来预测下一个词(类似于语言模型),是纯因果的
- 工作机制:编码器吃进一块新音频,联合网络将其与预测网络的输出结合,计算是输出一个新词还是继续等待更多音频(输出
<blank>
)。这个过程循环往复,天然适合流式输出
b. 流式 CTC:
- CTC 模型本身是帧同步的,每输入一帧就可以计算输出,天然适合流式
- 但纯 CTC 的流式识别效果通常不如 RNN-T,因为缺乏显式的语言模型建模。常通过 CTC 前缀束搜索实现流式解码,并结合外部语言模型
c. Chunk-Based Transformer/Conformer:
- 这是为了让强大的 Transformer 模型能用于流式而做的改进
- 核心思想:将全局注意力限制在一个局部窗口内。模型在处理当前 chunk(块)时,只能注意到有限的过去 chunk 和未来的几个 chunk(例如:看过去 400ms,未来 200ms)。这个"有限的未来"被称为右上下文(Right Context) 或 Look-ahead
- 实现:通过 Mask 机制限制注意力范围,实现可控的延迟。Look-ahead 越大,延迟稍高,但准确率会提升
-
流式解码:
- 使用流式束搜索。与离线版不同,它需要定期(例如每读完一个 chunk)就**发射(emit)**已经确定的部分假设结果,而不是等到最后
- 需要判断何时输出一个词是"确定"的。有些策略是当某个词的概率超过阈值,或者在束搜索中保持领先若干 chunk 后,就将其输出
-
增量输出:
- 解码器会持续输出部分结果,例如:
我 -> 我们 -> 我们一 -> 我们一 -> 我们一起
。用户看到的是文本在不断地被修正和补充
- 解码器会持续输出部分结果,例如:
简而言之,流式实现像一个"开卷随堂测验",你只能一边听讲一边翻看刚刚讲过的和老师刚刚写下的少量板书来答题,并且需要不断交出头答案。
总结
实现方面 | 非流式 | 流式 |
---|---|---|
数据输入 | 整本书 | 一页一页地传过来 |
阅读方式 | 可以随意前后翻看整本书 | 只能看刚刚读过的几页和即将要读的下一页(Look-ahead) |
答题方式 | 读完全书后,深思熟虑,写下最终答案 | 每读完一页,就写下当前页的答案,并可能根据后续页的内容修改前一页的答案 |
核心约束 | 无时间约束,追求最高分 | 必须在规定时间内(低延迟)交卷,平衡答题速度和正确率 |