Flashlight/wav2letter 中 VoxPopuli 语音识别模型的联合训练指南
2025-07-07 06:22:32作者:秋泉律Samson
概述
本文将详细介绍如何在 Flashlight/wav2letter 框架中使用 VoxPopuli 数据集进行语音识别模型的联合训练。VoxPopuli 是一个大规模多语言语音语料库,可用于表示学习、半监督学习和模型解释。
模型背景
本教程涉及的模型基于 wav2vec 架构,具体实现参考了相关论文。该模型采用联合训练策略,结合了无监督的 CPC(Contrastive Predictive Coding)损失和有监督的 CTC(Connectionist Temporal Classification)损失。
准备工作
1. 获取预训练模型
提供两种预训练模型:
- 小型 wav2vec 模型(推荐)
- 旧版模型(已弃用)
模型使用 fl::ext::Serializer 序列化保存,包含以下组件:
- 网络配置信息
- 神经网络结构(fl::Sequential)
- 无监督 CPC 损失函数
- 有监督 CTC 损失函数
- 对应的优化器(Adam)
2. 准备数据集
建议使用 Common Voice 数据集,目录结构应如下:
[COMMON_VOICE_DIR]
├──[语言代码]/
├── clips/ # 音频文件
|__ dev.tsv # 开发集
|__ test.tsv # 测试集
|__ train.tsv # 训练集
|__ validated.tsv # 已验证数据
数据预处理
执行以下命令准备数据:
export COMMON_VOICE_DIR=数据集目录路径
cd prepare_data
bash build_cc_data.sh 语言代码
该脚本将生成:
- 训练/开发/测试集的清单文件
- 词典文件
- 标记文件
模型微调
1. 特征提取
微调时需要加载网络但不包括最后一层:
void LoadFeatures(std::shared_ptr<fl::Sequential> net0,
std::shared_ptr<fl::Sequential> net) {
auto modules_0 = net0->modules();
int n_layers = modules_0.size() - 1;
for (int i =0; i< n_layers; i++){
net->add(modules_0[i]);
}
}
2. 启动训练
export COMMON_VOICE_DIR=数据集目录路径
export WAV2LETTERDIR=wav2letter根目录
bash train_lang.sh 检查点目录 语言代码
模型解码
对开发集进行解码:
export COMMON_VOICE_DIR=数据集目录路径
export WAV2LETTERDIR=wav2letter根目录
bash decode_lang.sh 检查点目录 语言代码
性能表现
无语言模型结果
语言 | 微调数据量 | 开发集(CER/WER) | 测试集(CER/WER) |
---|---|---|---|
德语 | 314小时 | 3.83/15.0 | 4.70/17.0 |
西语 | 203小时 | 3.49/10.7 | 4.04/11.9 |
法语 | 364小时 | 4.9/16.9 | 5.89/18.8 |
使用语言模型结果
语言 | 微调数据量 | 开发集(CER/WER) | 测试集(CER/WER) |
---|---|---|---|
德语 | 314小时 | 2.36/6.76 | 2.98/7.82 |
西语 | 203小时 | 3.11/8.93 | 3.60/10.0 |
法语 | 364小时 | 2.73/8.31 | 3.57/9.56 |
自定义预训练
要进行自定义预训练,需要准备:
- 包含所有音频序列的
.lst
文件 - 验证集
- 标记文件
- 有效词典
示例 .lst
文件格式:
ID 音频路径 时长(ms) 任意文本
执行预训练脚本:
sh_voxpopuli/pretrain.sh
技术要点
- 联合训练结合了无监督和有监督学习
- 模型架构包含特征提取网络和分类器
- 微调时建议冻结底层特征提取层
- 可灵活调整监督和无监督损失的比例
引用
如需在学术研究中使用,请引用相关论文。该工作由 Changhan Wang 等人在 2021 年发表,提出了 VoxPopuli 大规模多语言语音语料库。
通过本教程,您可以充分利用 Flashlight/wav2letter 框架和 VoxPopuli 数据集,构建高性能的多语言语音识别系统。