针对丹麦语对 Whisper-tiny 进行微调(免费)

社区文章 发布于 2025 年 5 月 26 日

这是我的个人博客的转发内容:https://rasgaard.com/posts/whisper-tiny-danish/

小型模型和开放数据集的价值

我一直很喜欢小巧但功能强大的AI模型。它们轻量级但性能卓越,这让我印象深刻。模型大小的限制在某种程度上与最先进的性能背道而驰,因为我们不断看到规模是成功的主要因素。我想这正是其吸引我的原因。小型模型具有某种“弱者”的特质。此外,我认为对AI系统施加此类限制可以产生更有趣的解决方案。

如果您只是一个计算资源有限的爱好者,想要尝试模型训练而不至于破产可能会很困难。至少对于大型模型来说是这样。但对于小型模型,完全可以在 Google Colab 或 Kaggle 上使用免费资源进行训练,而无需花费一分钱。意识到这一点让我兴奋不已,因为它为爱好者和修补者打开了大门,让他们只需投入时间和精力即可探索这个领域。

模型只是故事的一半。数据也需要易于获取。像亚历山德拉研究所的 CoRal 这样的项目,在收集高质量、所有人可用的数据集方面做得非常出色。这对每个人都大有裨益。拥有开放数据集可以使其接受公众监督,确保其质量,最终带来更好的AI系统。

Whisper-tiny.da:整合各部分

我一直在寻找借口,想更多地尝试 Whisper。tiny 变体的参数量为 40M,这使得它可以在手机上流畅运行,并使用 Transformers.js 在浏览器中执行实时转录。

我想要回答的问题是:“如果使用高质量的丹麦语语音进行训练,我能从 Whisper-tiny 中榨取多少性能?”我想知道它会落在 这个词/字符错误率表 的哪个位置。

幸运的是,大部分艰苦的工作已经由其他人完成并打包得很好。我阅读了一篇教程文章,并将相关代码片段复制到 Kaggle notebook 中。Kaggle 每周提供 30 小时的 GPU 使用时间,这对于这个小型项目来说绰绰有余。后来我发现 CoRal 团队已经为这个目的编写了训练和评估脚本,这使得整个过程变得异常简单。如果我直接使用他们的代码,我就不会经历(痛苦的)调试过程中那些缠绕在一起的特殊标记的经验和教训。

所有部分都准备就绪——流式数据集、数据整理器、训练参数、评估代码——终于到了按下 trainer.train() 的执行按钮,并希望能看到词错误率(WER)下降的时候了。

那它的表现如何呢?

以下是结果:

  • 字符错误率 (CER): 15.93%
  • 词错误率 (WER): 34.30%

这表明它的性能与大小是其 40 倍的模型相似。哇,这太棒了!……对吗?

好吧,我们先不要得意忘形。让我们看看实际的转录效果。

为了尝试,我将使用 uv 启动一个临时的 Jupyter 服务器

> uv run --with ipython --with jupyter --with transformers --with torch 

并将 Jupyter 服务器 URL 复制到 VS Code 中。我发现这是一种为一次性工作创建最小的、临时的测试环境的好方法。

我喜欢在原始数据集(甚至不是测试集)之外的样本上进行测试,以设定实际使用的期望。CoRal 项目还有一个用于训练文本到语音模型的数据集

我最喜欢的 CoRal-TTS 数据集中的样本是配音演员说“Jeg fucking elsker tebirkes[^1]”。

我们首先用 OpenAI 的原始 whisper-tiny 模型进行基准测试。

from transformers import pipeline
audio_link = "https://..."

pipe = pipeline(task="automatic-speech-recognition", 
                model="openai/whisper-tiny")
pipe(audio_link)
>>> {'text': ' Ja, fucking, ells godt, tæt biogis.'}

然后是我们的 CoRal 微调模型 whisper-tiny.da


pipe = pipeline(task="automatic-speech-recognition", 
                model="rasgaard/whisper-tiny.da")
pipe(audio_link)
>>> {'text': 'erforking elsker 10 birkes'}

最后将其与 syvai/hviske2 进行比较

pipe = pipeline(task="automatic-speech-recognition", 
                model="syvai/hviske-v2")
pipe(audio_link)
>>> {'text': 'jeg fucking elsker tebirkes'}

…我们可以看到,离达到最先进的性能还有一段距离。

但这并不是我真正关心的。我关心的是*同类最佳*的性能。尽管显然离任何*良好*甚至*稍微有用*的性能还有很长的路要走,但我认为继续追求这一点非常有趣。

接下来做什么?

我认为有几件事是需要立即采取的下一步措施

  • 更多数据。我很想尝试更多数据训练,看看能否提高跨数据集的泛化能力。我可以直接尝试的数据集是 Mozilla 的 Common Voice。我很快就会着手处理。

  • 我考虑的另一件事是,该模型不生成任何标点符号,并且只使用小写字母。这是由于 CoRal 数据集的收集方式造成的。我曾考虑过进行一些 LLM 处理,并在 CoRal 的文本中插入标点符号和大小写。

  • 最后,我想用这个模型创造一些有用的东西。转录服务非常有用,甚至可以成为一个相当不错的商业案例。无需将音频发送到服务器即可获得良好的转录,这可以实现更多受隐私限制的用例。它还可以直接在手机等低功耗设备上进行转录。

我希望继续这个项目,并将其扩展为一个更大的项目。这是一个有趣的爱好项目,我尝试在 GPU 贫乏并依赖免费/开放可用服务和数据集的限制下工作。

如果您也对小型模型的可能性感到兴奋,请在 LinkedInBluesky 上与我联系!

[^1]: 译为“我他妈的爱吃罂粟籽面包”。罂粟籽面包是丹麦的一种罂粟籽糕点。它在数据集中有转录 ID 206。

社区

注册登录 以评论