06|ASR 整体架构:Encoder、Decoder、Predictor、Joiner 与 Logits1. 核心概念上一章解决了一个根本问题:ASR 是把长度较长的声学序列转换成长度较短的文本序列,而且输入和输出之间存在未知的时间对齐关系。这一章进一步回答:这个转换在模型内部到底是怎么完成的?现代 ASR 的整体结构可以抽象成:Speech │ ▼ Acoustic Features │ ▼ Acoustic Encoder │ ▼ Acoustic Representation │ ▼ Encoder Output │ ├───────────────┐ │ │ ▼ ▼ Decoder Predictor │ │ └───────┬───────┘ ▼ Joiner │ ▼ Logits │ ▼ Vocabulary Tokens但这个图不能直接套到所有模型上。例如:CTC:通常是Encoder → Projection → LogitsRNN-T:Encoder + Predictor → Joiner → LogitsAttention Encoder-Decoder:Encoder + Decoder → Vocabulary Projection → Logits因此:“ASR 整体架构”不是一个固定网络,而是一组具有共同数据流的架构范式。其中最稳定的主线是:语音 ↓ Encoder ↓ 声学表示 ↓ 某种 Sequence Transduction / Prediction ↓ Vocabulary logits ↓ Token理解这条主线之后,Conformer、Zipformer、Whisper、CTC、RNN-T 就不再是互相割裂的知识点。2. 为什么需要这样的架构2.1 为什么不能直接 Waveform → Token理论上当然可以建立一个:waveform ↓ neural network ↓ token但模型必须同时解决几个不同层次的问题:第一层是:从复杂的声学信号中提取稳定的语音信息。第二层是:建模长时间范围内的上下文。第三层是:将声学时间轴转换成文本 token 轴。第四层是:根据当前已有信息判断应该输出哪个 vocabulary token。把这些问题全部压成一个简单分类层,不利于模型结构设计,也不利于控制计算复杂度和推理方式。因此现代 ASR 通常会把功能拆开:Encoder → 负责把语音变成高层声学表示 Prediction / Decoder → 负责建模输出序列上下文 Joiner / Projection → 负责把表示映射到 vocabulary logits并不是说这些模块之间完全独立,而是:不同模块承担不同的建模职责。2.2 为什么 Encoder 是 ASR 的核心基础语音输入是连续时间信号,原始 waveform 包含大量与最终文字无关的信息,例如:声学频谱结构;音高;能量;说话人特征;环境噪声;麦克风特性;混响。模型真正需要的是:与语言内容高度相关、同时又尽量具有说话人和环境不变性的时序表示。所以 Encoder 的目标不是简单地“提取特征”,而是:把低层声学观测逐步转换成适合序列识别的高层表示。这就是 Acoustic Representation 的来源。3. 原理与底层机制3.1 从输入 Tensor 到 Encoder Output考虑一个常见的 ASR 输入。经过 Fbank 之后:X∈RB×T×F X \in \mathbb{R}^{B \times T \times F}X∈RB×T×F其中:BBB:batch size;TTT:声学时间步;FFF:feature dimension,例如 80。例如:[B, 1000, 80]经过 subsampling 后可能变成:[B, 250, 256]再经过 Encoder:[B, 250, 512]于是:H∈RB×T′×D H \in \mathbb{R}^{B \times T' \times D}H∈RB×T′×D这里的HHH就是 Encoder 输出。其中:T′T'T′:subsampling 后的时间长度;DDD:hidden dimension。注意:Encoder Output 仍然是一个序列。它并没有直接变成一句话。例如:Encoder Output h1 h2 h3 h4 ... h250每个hth_tht都是一个高维向量。3.2 Hidden State 到底是什么在实际工程和面试中,“Hidden State”这个词很容易泛化使用。最准确的理解是:Hidden State 是模型内部用于表示当前序列状态的信息向量。对于 RNN:ht=f(xt,ht−1) h_t=f(x_t,h_{t-1})ht=f(xt,ht−1)这里的hth_tht是一个真正具有递归状态意义的 hidden state。而对于 Transformer / Conformer,情况有所不同。例如:x1 x2 x3 ... xT ↓ ↓ ↓ Transformer ↓ ↓ ↓ h1 h2 h3 ... hT这里的hth_tht通常更准确地叫:hidden representation / contextual representation而不是传统 RNN 意义上的“递归状态”。所以面试时最好区分:场景Hidden State 含义RNN/LSTM随时间递归传递的状态Transformer每个位置经过多层网络后的隐藏表示Conformer融合 attention / convolution 上下文后的隐藏表示RNN-T Predictor输出历史对应的内部序列状态因此:“hidden state”是一个统称,具体语义取决于架构。3.3 Acoustic Representation 是什么Acoustic Representation 可以理解为:模型对输入语音形成的高层、可用于识别的时序表示。例如 Encoder 输入:[B, T, 80]经过若干层:[B, T', 512]这些 512 维向量不再是简单的 Fbank。一个 Encoder representation 通常同时包含:当前局部声学信息;邻近帧上下文;更长范围的语音上下文;发音相关信息;对后续 token 预测有用的信息。例如 Conformer 中,一个位置的表示会受到:multi-head self-attention;convolution module;feed-forward layers;等组件影响。所以可以把:ht h_tht理解为:模型在时间位置ttt对当前语音上下文形成的内部语义/声学表示。它不一定已经是某个具体 token。3.4 Context 为什么重要ASR 中的 Context 不是单独一种 Tensor,而是一种信息概念。假设模型当前正在识别某一段声音。如果只看:xt x_txt可能无法确定它对应什么发音。但如果看整个上下文:x1:T x_{1:T}x1:T模型就可以根据前后声音判断。所以 Encoder 输出的:ht h_tht本质上可以看作:ht=f(x1:T) h_t=f(x_{1:T})ht=f(x1:T)或者在有限感受野模型中:ht=f(xt−k:t+k) h_t=f(x_{t-k:t+k})ht=f(xt−k:t+k)具体范围取决于模型。这也是为什么:Context 是 Encoder Representation 与原始 Acoustic Feature 最重要的区别之一。Fbank 更接近:“这一小段声音长什么样”而 contextual representation 更接近:“结合前后上下文,这一小段声音意味着什么”3.5 Encoder 的真正作用:不是分类,而是 Representation Transformation一个很容易出现的错误理解是:Encoder 就是在预测 token。实际上,Encoder 更多是在做:X→H X\rightarrow HX→H也就是:Acoustic Input ↓ Feature Transformation ↓ Contextual Representation它的输出:H=(h1,…,hT′) H=(h_1,\dots,h_{T'})H=(h1,…,hT′)仍然位于 acoustic time axis 上。真正把:H转成:Vocabulary logits的是后面的预测 / 映射模块。因此可以把整个流程分成:Encoder: X → H Prediction: 历史输出 → P Fusion / Projection: H + P → Z Vocabulary: Z → logits这就是为什么理解 Encoder 和 Decoder/Joiner 的职责边界非常重要。3.6 Decoder 是什么在 ASR 中,“Decoder”这个词存在一个很大的语义问题:Decoder 可以指模型架构里的 neural decoder,也可以指最终推理阶段的 search decoder。两者必须区分。Neural Decoder它是模型的一部分,例如 Whisper 的 Transformer Decoder。主要任务是:根据已经生成的 token 历史以及 encoder representation,计算下一个 token 的概率分布。Search Decoder例如:beam search;greedy search;CTC prefix beam search;RNN-T beam search。它的任务是:根据模型输出的概率分布寻找最终 token sequence。所以:Neural Decoder与:Beam Search Decoder不是同一个概念。面试时这是非常值得主动澄清的一点。3.7 Attention-based Decoder 的工作过程以 Whisper / Transformer Encoder-Decoder 为例:Speech ↓ Encoder ↓ H start ↓ Decoder ↓ P(y1 | H) ↓ y1 ↓ Decoder ↓ P(y2 | y1, H) ↓ y2 ↓ ...它是自回归的。第uuu个 token:yu∼P(yu∣yu,H) y_u\sim P(y_u|y_{u},H)yu∼P(yu∣yu,H)