576. Bengali.AI Speech Recognition | bengaliai-speech
感谢组织者和Kaggle工作人员举办本次竞赛,也祝贺所有获奖者!
我的方案主要解决两个核心挑战:
挑战:
解决方案:
indicwav2vec_v1_bengali 模型该方案在公共排行榜上获得0.38的分数。
多样化说话者识别:
测试音频数据主要来自YouTube,说话者身份通常未知。为构建通用模型,我在多样化音频数据上进行了训练。

(数据集论文:https://arxiv.org/abs/2305.09688 C.1.1 数据爬取路线图与先决条件)
标点恢复:
根据此讨论,标签是规范化的,意味着标点符号会被保留。
在转录时预测标点很困难,省略会导致词错误率增加。
通过恢复标点可降低词错误率(WER):
虽然公共笔记本只在句尾添加句号,但测试数据平均每样本34.42词,而Macro训练/验证集平均为8.42/9.21词。这表明单个音频文件可能包含多个句子,需要在句中位置恢复标点。

(数据集论文:https://arxiv.org/abs/2305.09688 表1:OOD语音数据集统计)
ai4bharat/indicwav2vec_v1_bengaliarijitx/wav2vec2-xls-r-300m-bengali使用Transformers微调Wav2vec2CTC时,我根据Yellowking的WER、CER和MOS_PRED指标选择数据集,详见此笔记本。采用两种数据划分:
第一组数据帮助模型适应各种声音,第二组数据使模型能处理WER较高的音频。
此外,在训练中加入白噪声使排行榜分数略微提升了0.001。
我仅使用排行榜分数进行验证。由于训练数据与测试数据之间存在显著的领域偏移,无法依赖本地交叉验证。
相比公共笔记本的改进:
标点恢复(提升-0.023)
为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,
)
| 方法 | 公共榜 | 提升 | 私有榜 |
|---|---|---|---|
| 基准线 | 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 |
竞赛初期,我尝试添加噪声来适应不同领域,但未能提升分数。这让我意识到除了噪声外还有其他需要解决的挑战。
本次竞赛要求参赛者解决模型泛化能力和标签噪声(标点)处理问题,核心在于确定所需的泛化程度以及如何有效处理标点噪声。
非常感谢能参与这次学习之旅。