Course 5:语音识别与生成
课程简介
CTC 算法、WaveNet、TTS 等语音技术入门。
一、语音识别基础
语音识别将连续的音频信号转化为文本序列。这是一个典型的序列到序列映射问题,但有其特殊性:
- 输入远长于输出:每秒 16000 个采样点,每个音素约 100ms
- 输入输出无严格对齐
1.1 声学特征提取
原始音频波形不适合直接作为神经网络输入。通常提取声学特征:
- 梅尔频率倒谱系数(MFCC):模拟人耳对不同频率的感知特性
- 梅尔频谱图:在 Mel 尺度上的频谱表示
def extract_mfcc(audio_path, sample_rate=16000):
audio, sr = librosa.load(audio_path, sr=sample_rate)
mfccs = librosa.feature.mfcc(y=audio, sr=sr, n_mfcc=13)
return mfccs.T # (time_steps, 13)
二、CTC 损失函数
2.1 对齐问题
语音识别中输入序列(音频帧)和输出序列(文字)长度不同,且没有一一对应的对齐关系。CTC 解决了这个问题。
2.2 CTC 的核心思想
CTC 引入空白标记(blank token,通常用 ε 表示),允许输出序列中出现重复和空白:
- 输入:音频帧序列 x_1, x_2, ..., x_T
- 输出:字符序列 y_1, y_2, ..., y_U(U < T)
- 路径 π:在每个时间步输出一个字符或 ε
路径到序列的映射 B 去除路径中的连续重复字符和 ε:
B('hhee_ll_llo') = 'hello'
CTC 损失是所有能映射到目标序列的路径的概率之和:
$$P(Y|X) = \sum_{\pi \in B^{-1}(Y)} \prod_{t=1}^{T} P(\pi_t | X)$$
2.3 前向-后向算法
直接枚举所有可能的路径计算量指数级。CTC 使用动态规划(前向-后向算法)高效计算损失。
2.4 CTC 解码
推理时使用波束搜索(Beam Search)寻找最可能的输出序列,而非简单取每个时间步的最优输出。
三、注意力模型在语音中的应用
3.1 基于注意力的语音识别
现代语音识别系统通常使用编码器-解码器架构+注意力:
1. 编码器:多层 BiLSTM 或卷积网络处理音频特征
2. 基于内容的注意力:每次解码时关注输入序列中与当前预测最相关的片段
# 语音识别的编码器-解码器架构
encoder_inputs = layers.Input(shape=(None, n_features))
encoder = layers.Bidirectional(layers.LSTM(256, return_sequences=True))(encoder_inputs)
encoder = layers.Bidirectional(layers.LSTM(256, return_sequences=True))(encoder)
# 注意力层
attention = layers.Attention()([decoder_outputs, encoder])
# 解码
decoder = layers.LSTM(256, return_sequences=True)(attention)
outputs = layers.Dense(vocab_size, activation='softmax')(decoder)
3.2 Listen, Attend and Spell (LAS)
LAS 是经典的端到端语音识别架构:
- Listener:金字塔 BiLSTM 编码器(下采样减少帧率)
- Attention:内容注意力
- Speller:注意力解码器生成文本
四、WaveNet:语音生成
4.1 自回归模型
WaveNet 是一个自回归生成模型,逐采样点生成原始音频波形:
$$P(x | h) = \prod_{t=1}^{T} P(x_t | x_1, ..., x_{t-1}, h)$$
每个新采样点的预测基于之前所有的采样点。
4.2 因果卷积
WaveNet 使用因果卷积(Causal Convolution)保证预测只依赖过去的信息,不能"偷看"未来的信息。
与普通卷积不同,因果卷积在时间维度上不对齐中心,而只对齐左侧。
4.3 扩张卷积(Dilated Convolution)
为了增加感受野而不增加计算量,WaveNet 使用扩张(空洞)卷积。扩张率每层翻倍:1, 2, 4, 8, ...
10 层扩张卷积的感受野 = 2^10 = 1024 个采样点。在没有扩张卷积的情况下,要达到相同的感受野需要 1024 层普通卷积。
4.4 门控激活函数
WaveNet 使用门控激活单元替代标准的 ReLU:
$$z = \tanh(W_{f,k} * x) \odot \sigma(W_{g,k} * x)$$
其中 * 表示卷积,⊙ 表示逐元素乘,sigma 是 Sigmoid 函数。门控结构让模型灵活地控制信息流。
五、TTS:文本到语音
文本到语音(TTS)是语音识别的逆过程——从文本生成语音。
5.1 Tacotron
Tacotron 使用编码器-解码器架构,将文本转换为梅尔频谱图:
1. 编码器:CBHG 模块处理文本嵌入
2. 解码器:带注意力的 RNN 生成频谱帧
3. 后处理网络:细化的频谱预测
5.2 神经网络声码器
生成频谱后,需要声码器将频谱转换为音频波形。WaveNet 可以作为声码器使用——以 Tacotron 生成的频谱为条件,生成高质量的音频波形。
5.3 现代 TTS 系统
- Tacotron 2:Tacotron + WaveNet,端到端 TTS
- FastSpeech:非自回归 TTS,基于 Transformer,速度快
- VITS:变分推理方法,同时建模文本和语音的潜在表示
# 简化的 TTS 流程示例
class Tacotron2(tf.keras.Model):
def __init__(self):
super().__init__()
self.encoder = build_encoder()
self.decoder = build_attention_decoder()
self.postnet = build_postnet()
def call(self, text_inputs):
# 编码文本
encoder_outputs = self.encoder(text_inputs)
# 带注意力的解码生成频谱
mel_outputs = self.decoder(encoder_outputs)
# 后处理精化频谱
mel_outputs_postnet = self.postnet(mel_outputs) + mel_outputs
return mel_outputs, mel_outputs_postnet
六、实践建议
- 小规模语音识别:使用预训练模型(如 Wav2Vec 2.0)加微调
- 语音合成:推荐使用 Tacotron 2 + WaveNet
- 实时应用:CTC 模型通常比注意力模型更快
- 数据增广:SpecAugment(频谱图遮盖)提升泛化能力
延伸阅读
- 📺 B 站播放列表:Deep Learning Specialization — 深度学习专项课程
- 📚 更多学习资源,请访问 deeplearning.ai 官网