这篇继续是开发日志,正在开发一款iOS端的实时双语字幕APP,由于需要用到语音识别,了解了下语音识别任务的现状和主流方案,为后面方案选择做准备。
模块流程
什么是ASR任务
ASR(Automatic Speech Recognition,自动语音识别)任务,指的是将连续的音频信号转换为对应的文本序列的过程。这是一种典型的序列到序列(Sequence-to-Sequence)的转换任务:
| |
从信号处理的角度来看,传统ASR需要解决以下核心问题:
- 声学建模:将音频特征映射到音素或字符
- 语言建模:捕捉词汇之间的概率关系
- 对齐问题:音频帧与输出token之间的对齐
不过,在现代端到端深度学习方案中,这三个问题都被统一在一个神经网络中解决,不再需要独立的声学模型和语言模型。模型通过端到端训练自动学习如何从音频特征直接映射到文本输出。
与降噪任务的区别
在开发iOS双语字幕的过程中,我之前可能接触过降噪任务,这两者有本质区别:
| 维度 | 降噪任务 | ASR任务 |
|---|---|---|
| 输入输出 | 音频 → 音频 | 音频 → 文本 |
| 任务类型 | 信号回归 | 序列到序列 |
| 评估指标 | SNR、PESQ | WER、CER |
| 难点 | 保留语音质量 | 识别准确性 |
| 模型结构 | Encoder | Encoder-Decoder |
简单来说:
- 降噪任务:输入一段有噪声的音频,输出干净的音频(同类转换)
- ASR任务:输入音频,输出文字(跨模态转换)
ASR的难点在于它需要"理解"音频内容并转换为语义符号,而不是简单地处理信号波形。同时,ASR任务的输入和输出也不像降噪任务那样是一一对应的关系,还需要处理对齐问题。
目前主流的实现方案
主流的ASR实现方案主要有三种:CTC、RNN-T和基于Attention的Seq2Seq。
CTC (Connectionist Temporal Classification)
CTC是一种经典的对齐方法,核心思想是不需要显式的对齐标签,而是通过"blank"机制自动学习对齐。
CTC引入了空白符(blank)和折叠机制:
- 重复的字符会被折叠(如 “aaabbb” → “ab”)
- blank符号不产生任何输出
- 通过动态规划计算所有可能路径的概率
Sequence Modeling With CTC 详细原理可参考这篇文章。
训练阶段就是使目标token序列路径的概率最大,而推理阶段就是搜索概率最大的token路径并输出,这里通常有两种方法:
| 方法 | 描述 |
|---|---|
| Greedy Search | 每一步都选择概率最大的token输出 |
| Beam Search | 每一步保留top-N概率的token结果,输出token序列路径概率最大的结果 |
RNN-T (Recurrent Neural Network Transducer)
RNN-T是CTC的扩展,引入了一个额外的预测网络(Prediction Network)来建模输出token之间的依赖关系。
RNN-T由三部分组成:
- 编码器(Encoder):将音频特征转换为声学表征
- 预测网络(Prediction Network):基于已输出的token预测下一个token
- 联合网络(Joint Network):结合Encoder和Prediction的输出,预测下一个token
RNN-T在输出时,不仅会输入当前帧音频数据,还会输入历史输出作为参考
Seq2Seq with Attention
基于Attention机制的序列到序列模型是目前最流行的方案,被广泛用于Whisper、Paraformer等现代ASR系统。
原理
经典结构:
| |
- Encoder:将音频特征编码为高维表征(通常使用Transformer或Conformer)
- Attention:让Decoder在生成每个token时"关注"输入的不同部分
- Decoder:自回归生成输出文本
优缺点
优点:
- 可以建模任意长度序列的依赖关系
- 识别准确率高
- 易于添加语言模型集成
- 适合大规模预训练
缺点:
- 推理延迟较高(需要完整音频或较大chunk)
- 流式识别实现复杂
- 计算资源需求大
流式模型和非流式模型
流式(Streaming)和非流式(Offline)是ASR系统根据实时性要求的两种设计模式。
什么是非流式模型
非流式模型(Offline ASR)需要等待完整音频输入后才能开始识别。
特点:
- 输入:完整的音频文件或长音频段
- 延迟:较高,需要等待音频结束
- 准确率:通常较高,因为可以看到完整的上下文
- 适用场景:视频字幕生成、会议转录、录音文件处理
什么是流式模型
流式模型(Streaming ASR)可以边接收音频输入边输出识别结果,实现实时识别。
特点:
- 输入:连续的音频流(通常是短片段,如30ms一帧)
- 延迟:低,可以做到几百毫秒内输出
- 准确率:通常略低于非流式,因为只有历史和部分未来上下文
- 适用场景:实时语音对话、语音助手、直播字幕
技术实现差异
| 维度 | 流式模型 | 非流式模型 |
|---|---|---|
| 上下文 | 有限上下文(lookahead) | 完整上下文 |
| 延迟 | 低(<500ms) | 高 |
| 准确率 | 略低 | 较高 |
| 模型复杂度 | 较高(需处理分段) | 较低 |
| 内存占用 | 较小 | 较大 |
流式模型通常需要特殊设计,如:
- Chunked Attention:将音频分成小块处理
- CTC Prefix:使用CTC的前缀解码
- Lookahead:只考虑有限的未来帧
自回归解码和非自回归解码
解码方式决定了模型如何生成输出文本。
自回归解码 (Autoregressive Decoding)
自回归解码是目前最主流的方式,特点是逐 token 生成,每个 token 的生成依赖之前所有生成的 token。
| |
特点:
- 优点:生成质量高,可以建模长期依赖
- 缺点:串行生成,推理速度慢(O(n) 复杂度,n为输出长度)
- 典型模型:Transformer Decoder、RNN-T
非自回归解码 (Non-autoregressive Decoding)
非自回归解码是一种并行生成方式,一次性输出整个序列。
| |
特点:
- 优点:并行生成,推理速度快(O(1) 复杂度)
- 缺点:难以建模输出token之间的依赖,生成质量可能较低
- 典型实现:CTC、FastCorrect、Mask-Predict
对比
| 维度 | 自回归解码 | 非自回归解码 |
|---|---|---|
| 生成方式 | 串行,逐token | 并行,一次性输出 |
| 推理速度 | 慢 | 快 |
| 生成质量 | 高 | 略低 |
| 依赖关系 | 建模token间依赖 | 假设条件独立 |
| 典型模型 | RNN-T、Seq2Seq | CTC、FastConformer |
方案选择
OK,前面了解了这么多,都是为了后续实现最小原型产品,选择语音识别方案做准备,目标不是要训练一个SOTA模型,因此这里暂时只是粗浅的了解。
根据需求分析:
- 目标设备:iOS移动端(资源有限)
- 语言支持:多语言
- 实时性:实时输入音频,实时输出文字
选择优先级
- 首先能跑:模型大小和计算量必须在移动端可承受范围内
- 然后多语言:需要支持多种语言识别
- 最后准确率:在功能可用后再优化性能
优先级一:模型能在移动端跑起来
参数量选择
移动端资源有限,模型参数量直接决定了能否运行。这里暂时没有明确的数值界限,实际运行起来再看,后面也可以用量化技术缩小模型体积。
量化技术:INT8量化可将模型体积缩小约4倍,准确率损失通常<5%;INT4可进一步缩小到1/8,但准确率下降更明显。
架构选择
| 架构 | 计算量 | 内存占用 | 移动端适用性 |
|---|---|---|---|
| Transformer Encoder | 中 | 中 | ★★★★☆ |
| Conformer | 中高 | 中 | ★★★★☆ |
| RNN/LSTM | 低 | 低 | ★★★☆☆ |
建议:选择Encoder-only或轻量级的Conformer结构,参数量控制在50M以内。
优先级二:支持多语言
确认模型能在移动端运行后,需要考虑多语言支持能力。
不同模型架构的多语言能力
| 模型架构 | 多语言支持 | 说明 |
|---|---|---|
| 端到端Seq2Seq | ★★★★★ | 训练时使用多语言数据,自然支持多语言 |
| RNN-T | ★★★☆☆ | 可支持,但需要针对性训练多语言版本 |
| CTC | ★★☆☆☆ | 通常针对单一语言,多语言版本较少 |
结论
需要支持多语言时,优先选择端到端Seq2Seq架构,这类模型的预训练版本通常已支持数十到上百种语言。
优先级三:实时性要求
实时字幕要求模型能够在接收音频的同时输出文字。
流式 vs 非流式
| 类型 | 延迟 | 实现难度 | 实时字幕适用性 |
|---|---|---|---|
| 流式模型 | <500ms | 高 | ★★★★★ |
| 非流式模型 | >1s | 低 | ★★☆☆☆ |
折中方案:使用非流式模型时,可通过"分块处理"策略模拟流式效果:
- 将音频切分为固定长度的chunk(如1秒)
- 逐块识别并拼接结果
- 通过缓存历史上下文减少误差
解码方式
| 解码方式 | 延迟 | 实现复杂度 | 实时性 |
|---|---|---|---|
| 非自回归(Greedy) | 低 | 简单 | ★★★★★ |
| 非自回归(Beam Search) | 中 | 中 | ★★★★☆ |
| 自回归 | 高 | 复杂 | ★★☆☆☆ |
建议:实时场景优先选择非自回归解码(Greedy),延迟最低。
总结
核心理念:先完成端到端流程验证,再根据实际体验进行针对性优化。移动端ASR是一个迭代过程,不必追求一步到位。
后续我会记录在iOS端的具体实现过程,各位道友记得点赞追番哦。
