返回列表

2nd place solution

576. Bengali.AI Speech Recognition | bengaliai-speech

开始: 2023-07-17 结束: 2023-10-17 音视频处理 数据算法赛
孟加拉语语音识别竞赛第二名解决方案

孟加拉语语音识别竞赛第二名解决方案

作者: 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折模型
  • 推理时使用束搜索解码

非常感谢阅读,如有任何问题请随时提出。

同比赛其他方案