孟加拉语语音识别竞赛第二名解决方案
孟加拉语语音识别竞赛第二名解决方案
作者: qdv206 (Kaggle Grandmaster)
发布时间: 2023年10月18日
竞赛排名: 第二名
非常感谢Kaggle和Bengali.AI举办这场有趣的竞赛。在我即将开始语音处理领域的博士研究时,这个竞赛成为我学习的绝佳机会。最终这是一次收获颇丰的经历。
解决方案包含三个组件:
- ASR模型(自动语音识别)
- 语言模型
- 标点符号模型
1. ASR模型
使用 ai4bharat/indicwav2vec_v1_bengali 作为预训练模型。
数据集:
- 语音数据:竞赛数据、Shrutilipi、MADASR、ULCA(ULCA数据大部分链接已失效,仅能下载数千样本)
- 噪声数据:MUSAN的音乐数据和DNS Challenge 2020的噪声数据
- 所有数据均经过归一化处理,并移除了除句号(.)和连字符(-)外的所有标点符号
数据增强:
- 使用
audiomentations 库进行增强,对朗读语音(竞赛数据、MADASR)应用强增强,对自发语音(Shrutilipi、ULCA)应用较轻增强
朗读语音增强示例:
augments = Compose([
TimeStretch(min_rate=0.8, max_rate=2.0, p=0.5, leave_length_unchanged=False),
RoomSimulator(p=0.3),
OneOf([
AddBackgroundNoise(
sounds_path=['/path_to_DNS_Challenge_noise'],
min_snr_in_db=5.0,
max_snr_in_db=30.0,
noise_transform=PolarityInversion(),
p=1.0
),
AddBackgroundNoise(
sounds_path=['/path_to_MUSAN_music'],
min_snr_in_db=5.0,
max_snr_in_db=30.0,
noise_transform=PolarityInversion(),
p=1.0
),
AddGaussianNoise(min_amplitude=0.005, max_amplitude=0.015, p=1.0),
], p=0.7),
Gain(min_gain_in_db=-6, max_gain_in_db=6, p=0.2),
])
- 拼接增强:随机将短样本拼接,使训练集长度分布更接近OOD测试集
- SpecAugment:mask_time_prob = 0.1,mask_feature_prob = 0.05
训练策略:
- 先在全部训练数据上拟合,然后移除训练集中识别错误率(WER)最高的约10%样本
- 不冻结特征编码器
- 使用带预热和重启的余弦学习率调度:
- 第1周期:5个epoch,峰值学习率4e-5
- 第2周期:3个epoch,峰值学习率3e-5
- 第3周期:3个epoch,峰值学习率2e-5
推理过程:
使用 transformers 库中的 AutomaticSpeechRecognitionPipeline 进行分块和步长推理:
text = pipe(w, chunk_length_s=14, stride_length_s=(6, 3))["text"]
2. 语言模型
在多个孟加拉语语料库上训练的6-gram kenlm模型:
3. 标点符号模型
训练令牌分类模型添加以下标点符号:।,?!
- 使用
ai4bharat/IndicBERTv2-MLM-Sam-TLM 作为骨干网络
- 添加LSTM头部
- 在竞赛数据和IndicCorp子集上训练6个epoch,使用余弦调度,学习率3e-5
- 训练时对15%的令牌进行掩码增强
- 集成在IndicCorp三个不同子集上训练的3折模型
- 推理时使用束搜索解码
非常感谢阅读,如有任何问题请随时提出。