返回列表

14th Place Solution for the Bengali.AI Speech Recognition Competition

576. Bengali.AI Speech Recognition | bengaliai-speech

开始: 2023-07-17 结束: 2023-10-17 音视频处理 数据算法赛
作者:neilus(Kaggle MASTER)
竞赛排名:第14名
发布时间:2023年10月18日

感谢组织者和Kaggle工作人员举办本次竞赛,也祝贺所有获奖者!

背景

业务背景:竞赛概述页面
数据背景:数据页面

方法概述

我的方案主要解决两个核心挑战:

挑战:

  1. 需要处理多样化说话者的鲁棒语音识别能力
  2. 转录文本中标点符号的恢复需求

解决方案:

  1. 使用竞赛数据微调 indicwav2vec_v1_bengali 模型
  2. 采用标点恢复工具 xashru/punctuation-restoration

该方案在公共排行榜上获得0.38的分数。

我的工作基于 @ttahara基准笔记本

提交详情

多样化说话者识别:
测试音频数据主要来自YouTube,说话者身份通常未知。为构建通用模型,我在多样化音频数据上进行了训练。


(数据集论文:https://arxiv.org/abs/2305.09688 C.1.1 数据爬取路线图与先决条件)

标点恢复:
根据此讨论,标签是规范化的,意味着标点符号会被保留。
在转录时预测标点很困难,省略会导致词错误率增加。

通过恢复标点可降低词错误率(WER):

  • (标签)你好。你怎么样?
  • (预测)你好 你怎么样
    → WER: 0.5
  • (恢复)你好。你怎么样。
    → WER: 0.25

虽然公共笔记本只在句尾添加句号,但测试数据平均每样本34.42词,而Macro训练/验证集平均为8.42/9.21词。这表明单个音频文件可能包含多个句子,需要在句中位置恢复标点。


(数据集论文:https://arxiv.org/abs/2305.09688 表1:OOD语音数据集统计)

使用模型

  1. Wav2vec2CTC模型
    • 微调Wav2vec2模型 ai4bharat/indicwav2vec_v1_bengali
  2. 语言模型
    • KenLM模型 arijitx/wav2vec2-xls-r-300m-bengali
  3. 标点恢复模型

训练过程

GitHub仓库

使用Transformers微调Wav2vec2CTC时,我根据Yellowking的WER、CER和MOS_PRED指标选择数据集,详见此笔记本。采用两种数据划分:

  1. 简单数据:易于识别的音频样本
    • YKG WER < 0.1
  2. 困难数据:字符内容正确但WER较高的音频样本
    • 0.3 < WER < 1.5
    • CER < 0.15
    • MOS_PRED > 3

第一组数据帮助模型适应各种声音,第二组数据使模型能处理WER较高的音频。

此外,在训练中加入白噪声使排行榜分数略微提升了0.001。

验证方法

我仅使用排行榜分数进行验证。由于训练数据与测试数据之间存在显著的领域偏移,无法依赖本地交叉验证。

推理过程

推理笔记本

相比公共笔记本的改进:

  • 标点恢复(提升-0.023)

    • 使用xashru/punctuation-restoration需要降级到transformers==2.11.0
    • 因此在LM推理后,执行`pip install transformers==2.11.0`并运行命令行标点恢复工具
  • 为KenLM使用unigrams.txt(提升-0.005)

with open(LM_PATH / "unigrams.txt", encoding="utf-8") as f:
    unigram_list = [t.lower() for t in f.read().strip().split("\\n")]

decoder = pyctcdecode.build_ctcdecoder(
    list(sorted_vocab_dict.keys()),
    str(LM_PATH / "5gram.bin"),
    unigram_list,
)
  • beam宽度设为1500(提升-0.002 ~ -0.001)

实验结果

方法 公共榜 提升 私有榜
基准线 0.471 0.564
训练(简单数据) 0.425 -0.046 0.508
Beam宽度1500 0.423 -0.002 0.506
标点恢复 0.400 -0.023 0.488
使用unigrams.txt 0.395 -0.005 0.48
训练(困难数据) 0.380 -0.015 0.458

未成功的方法

  • 命名实体识别(NER)
    • 尝试用NER恢复"-"符号,但对ASR输出句子产生了大量误检测,导致分数下降
  • 自建语言模型
    • 仅使用Macro训练数据,语料规模太小
  • 微调标点模型
    • 同样因训练数据不足未能奏效
  • 降噪器(denoiser)
  • 训练中添加多种噪声
    • 仅白噪声有效,其他噪声类型无帮助

总结

竞赛初期,我尝试添加噪声来适应不同领域,但未能提升分数。这让我意识到除了噪声外还有其他需要解决的挑战。

本次竞赛要求参赛者解决模型泛化能力和标签噪声(标点)处理问题,核心在于确定所需的泛化程度以及如何有效处理标点噪声。

非常感谢能参与这次学习之旅。

同比赛其他方案