第 13 课
← 返回系列列表

Course 5:语音识别与生成

Deep Learning Specialization — 深度学习专项课程

CTC 算法、WaveNet、TTS 等语音技术入门。

Course 5:语音识别与生成

课程简介

CTC 算法、WaveNet、TTS 等语音技术入门。

🎬 本课程视频:Deep Learning Specialization — 深度学习专项课程


一、语音识别基础

语音识别将连续的音频信号转化为文本序列。这是一个典型的序列到序列映射问题,但有其特殊性:
- 输入远长于输出:每秒 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,通常用 ε 表示),允许输出序列中出现重复和空白:

路径到序列的映射 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 系统

# 简化的 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

六、实践建议

  1. 小规模语音识别:使用预训练模型(如 Wav2Vec 2.0)加微调
  2. 语音合成:推荐使用 Tacotron 2 + WaveNet
  3. 实时应用:CTC 模型通常比注意力模型更快
  4. 数据增广:SpecAugment(频谱图遮盖)提升泛化能力

延伸阅读

← Course 5:自然语言处理与注意力机制