声音 × 文字CS4313 · ASR 与 TTS 入门

Going Deeper

看懂了入门,这里是下一层

不必按顺序读;每篇讲一个点,标注先修。

12 个专题 每篇约 5 分钟 可独立阅读

Part 1 / 4

信号与特征

先把「喂给模型的东西」看得更清楚一点。

TOPIC 01 · 信号与特征

从 FBank 到 MFCC:为什么还要多走一步

先修 · 教程幕 2 读完你能:解释 MFCC 为何要 DCT

幕 2 里你见过 FBank:一组 Mel 滤波器的输出,一帧声音的「体检报告」。但这份报告有个小毛病——相邻的维度长得太像。相邻滤波器彼此重叠,输出自然高度相关。

于是老一辈工程师多走了一步:对 FBank 做一次 DCT(离散余弦变换,Discrete Cosine Transform)。这一步把互相纠缠的维度「拧」成一组彼此独立的倒谱系数。再取前 12–13 维——这就是 MFCC。

为什么当年必须这么做?GMM 时代的声学模型常用对角协方差矩阵,它假设特征各维近似不相关。DCT 恰好负责去相关——不是锦上添花,而是模型能不能用的前提。

那为什么今天的端到端模型又倒回去用 FBank?因为神经网络自己就能学会维度之间的相关性,DCT 那一步反而会丢信息。省下的这一步,是模型能力换来的。

FBank · 24 维 深浅平滑渐变 → 相邻维高度相关 DCT 去相关 MFCC · 前 13 维 各维彼此独立,只留前 13 维
DCT 把一组互相纠缠的维度,拧成彼此独立的系数。

要点:特征的选择跟着模型的能力走——模型越强,特征越「生」。

延伸阅读:课程知识库《02 · 语音信号处理》《05 · 统计语音识别基础》 去实验台第 2 站看一帧声音怎么变特征

TOPIC 02 · 信号与特征

分贝与信噪比:响度的对数世界

先修 · 教程幕 2 先修 · 实验台第 6 站 读完你能:把 dB 换算回能量比

能量翻了十倍,耳朵却只觉得「响了一档」——为什么?答案藏在分贝里。分贝(dB, decibel)常被当成「音量单位」,其实它不是绝对量,而是比值的对数。能量比 10 倍,记 10 dB;比 100 倍,记 20 dB。若说的是幅度:幅度比 10 倍,就是 20 dB。同一个「10 倍」,看你量的是能量还是幅度。

为什么偏要取对数?因为人耳就是这么工作的:我们对响度的感知近似对数。开头那「响了一档」,正是对数感知的日常证据。音高也一样:幕 2 里的 Mel 刻度,正是为了贴合人耳对音高的对数感知才设计的。

有了 dB,就能定义信噪比(SNR, Signal-to-Noise Ratio):信号能量与噪声能量之比,再换算成 dB。0 dB 意味着信号和噪声一样响,听起来已经很挣扎了。实验台第 6 站,你把那句 0.9 秒的「人工智能」录音扔进过噪声——拖的那个滑块,本质上就是在调 SNR。

线性刻度 1 · 10 · 100 全挤在这里 1000 对数刻度 人耳走这条 ×1 ×10 ×100 ×1000 0 dB 10 dB 20 dB 30 dB 等距一步 = 能量 ×10 = +10 dB
同样四个数:线性刻度挤成一团,对数刻度步步等距。

要点:声音世界几乎所有刻度都是对数的,线性直觉在这里会骗人。

延伸阅读:课程知识库《02 · 语音信号处理》 去实验台第 6 站拖一拖那个其实是 SNR 的滑块

Part 2 / 4

识别进阶

从经典的 HMM 到今天的流式识别,ASR 这条线往深处走。

TOPIC 03 · 识别进阶

HMM 三问:概率多大、路径在哪、参数怎么学

先修 · 教程幕 3 读完你能:给 HMM 三问配上算法

想读懂深度学习之前的任何一篇 ASR 文献,你都绕不开三个字母:HMM。隐马尔可夫模型(HMM, Hidden Markov Model)正是那个时代 ASR 的顶梁柱。它把每个发音单元拆成几个状态,状态之间只能单向转移——像一条只准往前走的小隧道。你听到的声学特征,就是每个状态「吐出」的观测。

围绕这个模型有三个经典问题。一问:这段声音出现的概率有多大?前向算法回答。二问:最可能的状态路径是哪条?Viterbi 算法回答。三问:参数怎么从数据里学出来?Baum-Welch 算法回答——它是 EM 算法的一个特例。

其中 Viterbi 最值得多看一眼:它在「时间 × 状态」的网格上找一条最优路径,本质是动态规划。你在 CER 计算器里见过的编辑距离,也是在网格上做动态规划——它们是同一族算法,换了张网格而已。

状态 只能向右(停留)或右上(前进) s₄ s₃ s₂ s₁ t₁ t₂ t₃ t₄ t₅ t₆ t₇ t₈ 时间 →
加粗那条就是 Viterbi 找出的最优路径:只能向右或向右上。

要点:凡是变长对齐问题,动态规划都是那把万能钥匙。

延伸阅读:课程知识库《06–07 · 隐马尔可夫模型 HMM》 去实验台第 4 站看编辑距离的同款网格

TOPIC 04 · 识别进阶

语言模型:从数数到神经网络

先修 · 教程幕 2 读完你能:解释困惑度在量什么

一句话「像不像人话」,机器怎么打分?打这个分的,就是语言模型。最朴素的一种是 n-gram:数一数语料里「前 n−1 个词之后接这个词」出现了多少次。简单、有效,统治了几十年。但它有个死穴:没见过的组合不等于不可能,可计数就是零。得靠各种平滑技巧给零续命。

神经语言模型换了个思路:用连续向量表示词。相似的词在向量空间里彼此靠近,自动共享证据——就算这个组合真没见过,也能借邻居的经验给出合理的估计。

怎么衡量语言模型的好坏?困惑度(perplexity):大致相当于模型每走一步,平均要在几个候选里犹豫。犹豫得越少,困惑度越低,模型越好。

它在 ASR 里怎么用?解码时把语言模型分数和声学分数加权相加,这叫浅融合。幕 2 里说的「像不像人话」,在这里变成了一个可以精确计算的数。

n-gram · 数一数 人工智 → 能 常见 人工只 → 能 计数 0 没见过 ≠ 不可能 → 靠平滑续命 神经 LM · 向量空间 智能 聪明 机灵 苹果 香蕉 相似词彼此靠近,自动共享证据
数数会数到零;向量空间永远找得到邻居。

要点:「像不像人话」是一个可以被精确计算的数。

延伸阅读:课程知识库《08 · 统计语言模型》 回教程幕 2 重温「像不像人话」那一步

TOPIC 05 · 识别进阶

CTC 的数学魔法:blank 与路径求和

先修 · 教程幕 3 先修 · 实验台第 3 站 读完你能:说清 blank 的两件事

实验台第 3 站,你折叠过那句「人工智能」。但有两个问题还悬着:ε 到底管什么用?没人标边界,模型怎么学?这一篇补上这两个「为什么」。先说 blank(记作 ε)。它干两件事:一是允许模型「这一帧先不发字」;二是分隔真正的重复字——没有它,「天天」会被折叠成一个「天」。

更难的问题是:训练时没人告诉模型每个字的边界在哪。CTC 的做法:把所有能折叠成目标文本的路径,概率统统加起来。路径数量是指数级的,硬算不可能;前向-后向算法用动态规划,把这笔账压回多项式时间。

训练好的 CTC 有个有趣的长相:输出是「尖峰」状的。每个字只在一两帧上概率很高,其余帧几乎全是 blank。你在第 3 站折叠的那串序列,正是这种尖峰输出的离散化版本。

弱点也得说清:CTC 假设帧与帧之间条件独立,模型本身几乎没有语言模型能力——所以实践中常要外挂一个语言模型帮它把关。

P(字 | 帧) ε ε ε 你 ε ε ε ε 好 ε ε ε 帧 →
训练后的 CTC 输出呈尖峰状:高柱是字,其余帧几乎全是 blank。

要点:CTC 把「不知道边界」变成「对所有可能边界求和」。

延伸阅读:课程知识库《13 · 端到端语音识别》 去实验台第 3 站亲手玩 CTC 折叠

TOPIC 06 · 识别进阶

RNN-T 与流式识别:边说边出字的工程学

先修 · 教程幕 3 读完你能:讲清时延与精度取舍

直播字幕怎么做到边说边出字,还记得自己刚吐过什么?先看 CTC 缺的那一块。它有天生的健忘症:每一帧的输出彼此独立,前面吐了什么字,后面完全不记得。RNN-T(RNN Transducer)补上了这一块——加一个「预测网络」,让当前的输出依赖已经输出的文本历史。

它的解码:在「时间 × 已输出文本」的二维格点上走一条单调的路径。每一步只有两个选择——要么「再听一帧」(向右走),要么「再吐一个字」(向上走)。

这个设计天然支持流式:不用听完整句话,就能开始出字。手机上的语音输入、直播里的实时字幕,工业界的标配就是它。

但流式有代价。多等几帧(lookahead)再做决定,识别更准,可字幕也就更慢——时延与精度是一对旋钮,工程师每天都在两头拧。

已输出 你好吗 你好 你 (空) t₁ t₂ t₃ t₄ t₅ t₆ → = 再听一帧 ↑ = 再吐一个字(路径永远单调)
RNN-T 解码:每一步,要么向右听,要么向上说。

要点:流式识别的本质,是不断在「现在就说」和「再听一会」之间做决策。

延伸阅读:课程知识库《13 · 端到端语音识别》 回教程幕 3 重温对齐问题的来龙去脉

Part 3 / 4

合成进阶

让机器不只「能说」,还说得快、像你、有感情。

TOPIC 07 · 合成进阶

声码器演化史:从逐点猜到一步画

先修 · 教程幕 4 读完你能:说出四代声码器取舍

一张「声音施工图」,怎么变出一秒一万六千多个点的波形?这正是声码器(vocoder)的活儿——幕 4 讲过,它把施工图变回真实波形。这十年,它经历了一场速度与音质的拉锯战。

传统方法有两路。Griffin-Lim 靠反复迭代去「猜」丢失的相位,听感机器味重;WORLD 一类源-滤波声码器可控性好,但音质有限。

2016 年,WaveNet 改变了局面:自回归地逐采样点生成波形,音质一下子拉开了差距。代价是慢——一秒音频要生成一万六千多次,一个点一个点地挤。

后来 HiFi-GAN 等 GAN 声码器改成并行生成:一次画出整段波形。速度比实时快数百倍,音质还保持住了——这是今天的工业主流。而扩散声码器用多步去噪换更高的音质上限,在速度与质量之间又添了一个旋钮。

传统 · GL / WORLD 猜相位 · 可控但音质有限 2016 前 2016 WaveNet 逐点生成 · 音质飞跃但慢 HiFi-GAN 并行一次生成 · 快数百倍 2020 前后 今天 扩散声码器 多步去噪 · 上限更高
沿时间轴从左看到右:生成方式从「逐点猜」走到「一步画」。

要点:声码器十年,就是把「逐点猜」变成「一步画」的十年。

延伸阅读:课程 TTS 部分讲义(随课发放) 回教程幕 4 看声码器在流水线里的位置

TOPIC 08 · 合成进阶

音色克隆:把「你是谁」压成一个向量

先修 · 教程幕 5 先修 · 语音翻译机 读完你能:解释音色怎么被移植

翻译机凭什么能用你的声音说英文?因为一段录音里其实叠着两层信息:「说了什么」和「谁在说」。说话人嵌入(speaker embedding)专门提取后者:把「这个人听起来什么样」压缩成一个几百维的向量。x-vector 就是这类方法的代表。至于说话内容是什么,反而不重要。

有了这个向量,就能做零样本合成(zero-shot TTS):合成时把参考音频的 embedding 注入声学模型。几秒钟的样本,就能模仿一个人的音色。翻译机里的 X-Voice 拿你的录音做参考、开口说英文,走的正是这条路。

这也回答了幕 5 留下的那个问题——「补全」从哪来。文字没规定音色,TTS 就用 embedding 把音色从参考音频里「借」来补上。

也正因为几秒样本就够克隆一个人的声音,AI 合成语音才需要显式标识、需要本人授权——本站页脚那段声明,不是客套。

参考音频 压缩 speaker embedding 几百维向量 注入 TTS 声学模型 文字管内容 你音色的新句子
内容来自文字,音色来自那个向量。

要点:音色是可以被编码、搬运和移植的信息。

延伸阅读:课程 TTS 部分讲义(随课发放) 去翻译机试试 X-Voice 用你的音色说英文

TOPIC 09 · 合成进阶

韵律建模:让机器学会抑扬顿挫

先修 · 教程幕 4 先修 · 实验台第 5 站 读完你能:说出韵律三个预测器

同一行字,可以读出完全不同的意思。「我没说他偷钱」和「我没说他偷钱」——强调点一换,音高(pitch)曲线就完全不同。韵律承载着句子的另一半意思。

机器怎么学这件事?FastSpeech 2 一类模型的做法很直白:把时长、音高、能量做成三个显式的预测器,逐音素给出数值。幕 4 那张「声音施工图」上,等于多了三条可以单独调的曲线。

更全局的风格和情感呢?常被压成一个全局向量,像旋钮一样拧——拧向欢快,整句都亮起来;拧向低沉,整句都暗下去。实验台第 5 站你拖过的语速、音高滑块,就是这套思路最朴素的形态。

我 没 说 他 偷 钱 音高 ↑ 陈述 · 缓缓下行 疑问 · 尾部上扬 强调「他」· 峰在中间
同一句话,三种读法,三条完全不同的音高曲线。

要点:韵律不是装饰音,它承载着句子的另一半意思。

延伸阅读:课程 TTS 部分讲义(随课发放) 去实验台第 5 站拧一拧语速和音高

Part 4 / 4

前沿一瞥

入门与论文之间的最后一段缓坡:三个正在发生的故事。

TOPIC 10 · 前沿一瞥

Whisper:68 万小时的力量

先修 · 教程幕 2 读完你能:说出 Whisper 稳在哪

嘈杂环境、各地口音,为什么 Whisper 都扛得住?答案不在模型,在数据。2022 年,OpenAI 发布了 Whisper:一个 Transformer 编解码模型,用大约 68 万小时的网络弱标注音频训练。68 万小时是什么概念?传统学术数据集,通常是千小时级。

它是单模型多任务:多语种识别、语音翻译、语言识别、打时间戳——一个模型全包,不用换零件。

有意思的是,它的结构并不新。鲁棒性来自数据的规模与多样性:嘈杂环境、各地口音、领域外的内容,它都比前辈们稳得多。

对你更实际的一点:它的开源生态非常繁荣(faster-whisper 等),几行代码就能跑起来——课程作业就能用。

传统学术数据集 ≈ 千小时 Whisper 68 万小时 10² 10³ 10⁴ 10⁵ 10⁶ 小时 横轴 · 对数刻度
若换成线性刻度,左边这条只剩约半个像素宽。

要点:有时候,数据的广度胜过算法的精巧。

延伸阅读:课程前沿专题讲义(随课发放) 去实验台第 6 站体会「鲁棒」两个字有多难

TOPIC 11 · 前沿一瞥

语音大模型:当 LLM 长出耳朵和嘴

先修 · 教程幕 1 先修 · 教程幕 7 读完你能:讲清语音怎么变 token

要让 LLM 长出耳朵和嘴,第一道坎在哪?语言模型只会读写离散的 token,声音却是连续的波形。关键的一步,是把连续语音离散化成「语音 token」——比如 HuBERT 学出的单元,或神经编解码器的码本。这一步打通之后,语言模型就能像处理文字一样「读写」声音。

于是有了 GPT-4o 式的端到端语音对话:把幕 1 那条三段流水线(ASR→LLM→TTS)压成一个模型。响应延迟从秒级降到约 300 毫秒——接近人类对话的节奏。

端到端还有一个流水线给不了的好处:副语言信息不再丢失。语气、笑声、迟疑,都能一路保留到回答里,而不是在「文字」这一站被扔掉。

代价也真实存在:幻觉、可控性、安全对齐,都还是开放问题。你在幕 1 学的那套分工正在被融合——但先理解分工,恰恰是理解融合的前提。

今天 · 三段流水线 延迟 ≈ 秒级 ASR · 耳朵 LLM · 大脑 TTS · 嘴巴 压成一个模型 明天 · 端到端语音大模型 延迟 ≈ 300 ms 听 想 说
流水线被压成一个模型,语气、笑声、迟疑不再从接缝处漏掉。

要点:今天的流水线,可能是明天的单个模型——你在幕 1 学的分工正在被融合。

延伸阅读:课程前沿专题讲义(随课发放) 回教程幕 7 看流水线的全貌

TOPIC 12 · 前沿一瞥

端到端语音翻译:翻译机的下一站

先修 · 语音翻译机 读完你能:数出级联的三笔代价

你亲手拆过的那台语音翻译机是级联式的:ASR→MT→TTS,三个模块接力。好处明摆着——模块清晰,坏了哪个换哪个。

坏处也在明处。错误逐级累积:上游认错一个字,下游全跟着错。音色和语气挤不过「文字瓶颈」:到了 TTS 那头,早就丢了。延迟是三段之和,一段都省不掉。

端到端语音到语音翻译(S2ST, Speech-to-Speech Translation)走的是另一条路:直接「语音进、语音出」,中间不落成文字。SeamlessM4T 是这一类的代表。说话人的音色与韵律,可以一路保留。

现实的工业界常取折中:级联为主,局部端到端——比如「语音到译文文本」一步到位。两条路线仍在并行发展。

级联 · 文字瓶颈 ASR MT 翻译 TTS 错误往下传 音色、语气在这里丢了 端到端 · S2ST 语音进 → 语音出 · 音色、韵律直通
级联的信息在接缝处滴漏;端到端把语音直接送到语音。

要点:你刚拆解的级联翻译机,正在被端到端路线重新定义——这也是课程往后要讲的内容。

延伸阅读:课程前沿专题讲义(随课发放) 回翻译机把三段接力再拆一遍

读完这层,再往下就是论文和代码了

回教程重看一幕,或去实验台再验证一遍。