使用 OpenAI 的 Whisper 进行句子挖掘
在网上,我倾向于将自己包装成一个 AI/计算机专家,创建和关注与这些领域相关的内容。然而,我还有其他的兴趣和爱好可以钻研——不幸的是,太多了,无法将大量时间投入到所有这些兴趣中,除了一个。这个“一个”就是语言学习,特别是学习中文,我一直坚持不懈。
这是一条漫长的道路,始于 2018 年底,中间有过长时间的停顿和走错路。最终,在过去几年里,我一直坚持不懈地进行词汇和阅读练习。在这方面,我找到了学习的秘诀,至少对我来说是这样。我绝不是专家,但在我最近的台湾之行中,我的阅读能力表现良好——超出了预期。进一步提高只是时间问题,而不是试图“破解”我的大脑。
台湾的随机稻田。
然而,在听力方面,我比预期的要差。有几次我能完全理解对话。大多数时候我只是大致明白(在适当的时候微笑或大笑),但反应不够快,无法及时回复。与普遍的看法相反,阅读中文比听力更容易。
当然,这仅仅是投入到听力练习中的时间和精力函数。我花在阅读上的时间是听力的一百多倍,所以自然而然地,我的听力更差。一项技能的长期投入时间主要取决于你练习该技能的持续性。我的持续性取决于开始练习该技能的便利程度。
我用于被动学习新词汇的预制卡片组的一些统计数据。
预制卡片组中的一个词汇卡片示例,我用它来被动获取新词汇。我完成了这个卡片组的 60% 多一点。
对于阅读,我使用 Anki 等应用程序,并在零散的空闲时间里进行练习。每天都很容易做到:通常在排队、电梯里或公共交通工具上——诸如此类的时候。此外,我已经建立了足够的词汇基础,可以阅读有趣的内容以娱乐,这也助于保持持续性。除了少数几天,我过去一年每天都使用 Anki 抽认卡。然而,听力练习开始起来需要更多精力。要提高,我需要一种方法,让懒惰的我能够坚持下去。
听力练习方法
我曾尝试过多种阅读和听力方法。语言学习的关键在于找到适合自己的方法。这或许有点自我安慰,但当你在 YouTube 上看到“我用了 X 周流利掌握了 Y 语言”时,同样的方法可能对你有效,也可能无效。你的目标也可能不同:流利程度、是否在意写作和阅读,还是只关注口语和听力、内容类型等等。这高度个人化,需要大量的试错。
我很高兴地说,在阅读和词汇获取方面,我找到了我的方法。对于听力,我仍在探索中。我尝试过和没有尝试过的一些方法包括:
- 带音频的教科书 – 这些在入门阶段很好,但不是真实的例子,内容往往不太吸引人。
- 播客 – 很好,但有趣的内容水平太高,而更简单的播客则不那么有趣,这使得每天坚持下去更难。
- 沉浸式学习 – 这需要更高的水平才能持续进行,但一旦能够做到,将带来惊人的进步。
- 跟读法 – 听句子并重复,同时训练耳朵和舌头。非常重复和无聊。
- 课程 – 像 Pimsleur 这样的课程。有效但昂贵,而且无法根据我关心内容进行定制。
- 辅导 – 使用在线服务,效果很好且相对便宜。然而,我无法每天都这样做。可以与其他方法配合使用。
- 直接与陌生人交谈 – 许多 YouTube 多语言者都做过不少这样的事。说实话,这让我很害怕,但对他们表示敬意。OG 是 Laoshu,但最近像 Ryan Hales 这样的人在 Omegle 和 OmeTv 等应用上练习,也再次流行起来。
- 句子挖掘 – 观看带母语字幕的内容,并找到“n+i”句子。这些句子中除了 i 个单词(通常 i=1)外,你都理解,然后用它们制作带有音频的抽认卡。这些卡片随后通过间隔重复系统进行复习。
句子挖掘是我目前使用的方法。由于它使用字幕,你可以利用任何阅读能力来辅助听力。此外,你可以通过选择你喜欢的内容,将其精确地定制到你的兴趣。例如,在去台湾之前,我观看了台湾 Youtuber 的视频,以了解更多有趣的地点。现在,我即将和女朋友同居,我正在观看烹饪频道来学习术语,这样我们就可以用她的语言一起做饭。在我尝试过的所有方法中,这是我最喜欢的方法。
我通过句子挖掘制作的第一张卡片,手动创建。选自台湾电视剧《妈!别闹了!》
半年前,我看到我最喜欢的 YouTube 频道 Livakivi 使用句子挖掘学习日语取得了惊人的进步,于是我也尝试了句子挖掘。他已经记录了自己四年多来每天学习日语的过程,每天使用句子挖掘创建 20 张新抽认卡,最近总卡片数达到了 20,000 张。结果非常棒,尤其是在他四年多总共只练习了几个小时的口语的情况下,口语流利程度令人印象深刻。
这就是为什么我不专注于口语,除了随机地说一些短语取乐。似乎先建立强大的听力技能有助于之后支持口语。
尽管句子挖掘是一种很有前途的方法,但它也非常耗费人力。对于你要挖掘的每个句子,你需要:
- 在 Anki 中写出完整的句子。
- 突出显示目标词汇。
- 写出目标词汇的读音(如何发音)。
- 写出目标词汇的定义。
- 使用音频捕捉工具录制句子音频。
- 可选:截取内容的屏幕截图。
在中文中,保存读音很重要,因为汉字本身并不总是能表明发音。中文也是一种声调语言,所以我需要注意单词中的声调。
这工作量很大。如果不使用工具,你很容易把更多时间花在创建卡片上,而不是观看和专注于内容和语言上。Livakivi在他的视频中,使用 Migaku 来自动化部分过程。在此之前,他使用了一系列工具来使挖掘工作更容易一些,但他表示,如果没有 Migaku,他很可能在达到 20,000 张卡片之前就已经筋疲力尽了。
请查看 他的视频,了解他挖掘日语内容的过程细节。学习日语和中文之间有很多相似之处,所以尽管目标语言不同,我也学到了很多。
我没有 Livakivi 那种神一般的自律,无法像我一开始那样每天手动创建 20 张卡片,很快我就完全停止了。但正如我所提到的,从台湾回来后,我对自己的听力能力感到失望,并决心重新解决这个问题。
就像我说的,要投入时间变得更好,我需要保持一致性。为了保持一致性,学习必须没有摩擦。它永远不可能像复习词汇卡片那样容易,但我可以尽量让它尽可能顺畅。还有什么比使用✨编程✨更好的方法呢?
我所做的事情
我的目标是编写一个程序,使视频中的句子挖掘尽可能简单。我主要关注 YouTube 视频,但同样的原则也适用于通过 🏴☠️合法手段🏴☠️ 获取的本地视频。要求如下:
- 转换为 Anki,以便我可以在所有设备上复习,尤其是移动设备。这也有助于通过利用我现有的 Anki 习惯(习惯叠加)来保持一致性。
- 降低制作抽认卡的劳动成本,这样我就可以专注于我正在挖掘的内容和语言。
- 程序需要便携。我经常旅行,所以它应该能在我的 CPU 较弱的 Mac 上运行,也能在强大的台式机上运行。移动端也很棒,但目前不考虑。
- 健壮,没有什么比回溯更令人扫兴了。
有点与最后一点矛盾的是,我决定将其作为一项练习,迅速创建一个临时解决方案,然后逐步迭代。我不确定哪些想法会奏效,所以我想避免过早地过度设计一个解决方案,结果却讨厌使用它。
第一次迭代 – 基本的 MVP
第一次迭代是基础的。我开始创建一个脚本,它接受一个 CSV 文件,包含以下字段:
- 一个用 Markdown 粗体标签突出显示目标词汇的句子。
- 每个目标词汇的定义。
- 内容中句子的开始和结束时间浮点值。
CSV 文件示例。第一行是目标 YouTube 视频的 URL,其他行是提取的句子。
此脚本使用 Python 库 `pinyin` 生成所有目标词的读音。然后,它使用 `youtube-dl` 下载视频,并使用 `ffmpeg` 从目标区域提取音频和截图。这些文件随后被格式化为另一个可导入到 Anki 的 CSV 文件。
虽然基础,但这比手动使用屏幕捕获工具创建录音和截图要容易。但是,我仍然受限于复制或书写句子以及提取精确的亚秒级时间戳。
第二次迭代 – Whisper 登场
第二次迭代旨在解决创建句子和时间戳的任务。我坚持使用 ✨AI✨ 来为我转录音频。我使用 youtube-dl
下载音频,然后将其传递给 Whisper JAX,并将输出解析成与我在第一次迭代中手动创建的 CSV 文件相同格式的 CSV 文件——只是定义字段为空。
现在我只需要突出目标词并写下它们的定义;Whisper 会为我处理转录和时间戳。如果某个句子太简单或太难,我可以直接删除该句子行。使用 Vim 突出显示和删除这些内容轻而易举。
这种方法仍然存在一些问题。首先,我发现时间戳不够精确,通常只能精确到秒。其次,有时这些时间戳根本不准确或存在故障性的重复句子。最后,虽然在 GPU 上运行速度飞快,但在我的笔记本 CPU 上运行速度很慢。
第三次迭代 – Whisper,但更慢
目前的迭代使用 whisper.cpp – 一个零依赖、为 CPU 优化且支持有限 GPU 的 Whisper 实现。这使得它在笔记本电脑上更易用,但代价是桌面性能较慢。实际上,这并不重要,因为我可以在脚本运行时做其他事情。此外,我发现时间戳和转录比 JAX 实现更准确。
来自
whisper.cpp
的转录示例,包含肯尼迪总统著名演讲短节的时间戳。
锦上添花的是安装了 Google Translate 的命令行版本 `trans`。它很适合通过切换终端焦点来快速查看单词的含义,而不是使用我的手机词典。Google Translate 对于长句子或细微差别的句子并不可靠,但对于单个单词还不错。如果亲爱的读者知道有命令行英汉词典,请告诉我。
局限性
现在的解决方案比手动工作好得多,但仍然不完美。其余的局限性包括:
- 目前只针对 YouTube 视频,但可以扩展到本地视频。然而,它无法处理像 Netflix 上那样受 DRM 保护的内容。解决方案?🏴️ 🤷
- 有些视频就是不适用于 Whisper。例如,烹饪频道 Xiaoying Cuisine 的许多视频,Whisper 根本无法转录,只是无法打印大部分句子。我尝试过的两种实现都出现了这种情况,所以这可能与模型本身有关。
- 无法流式传输视频,因此较长的内容处理起来需要一段时间。流式传输是可能的,但没有必要,因为我可以在脚本运行时做其他事情。我也可以将视频分块,每次转录一个块。
- 转录不完全准确,尤其是在某些口音下。除非您的水平足以发现错误,否则我不建议使用此方法。这会降低效率,因为我不能完全信任 Whisper,但总的来说,它非常准确,并且比手动转录更快。
- 无法在移动设备上使用。这很棒,但我对移动开发知之甚少。
下一步是重构脚本,因为我现在有了一个好的概念验证。它目前是 Python、二进制文件和 shell 脚本的糟糕大杂烩。我不会添加自动定义生成。中文高度依赖语境,所以单词的含义常常会根据语境而变化——此外还有所有语言中都存在的细微差别和歧义。一如既往,结果因人而异。
结论
尽管我定义了一种有些过度的方法,但我相当懒惰,所以我知道我需要积极主动地减少摩擦,以便真正做事情。这有点矛盾,但事实就是如此。
过去一周使用下来,它确实帮助我保持了持续性。不仅摩擦减少了,使用自己制作的工具也感觉很好。此外,公开撰写这篇文章和我的目标也带来了一些温和的同伴压力,这应该也有助于我保持一致性。我们会拭目以待。
总的来说,在计算机方面,我认为优化工作流程以尽可能减少所需的工作量几乎总是值得的。这就是为什么我如此热衷于将 Linux 用于个人计算,但那是另一篇博客文章的内容了。这只是这种理念的一个例子。
语言学习本身就是一个我可以长篇大论的话题,但那又是另外一个时间了。实际上,我在去台湾之前写了一篇草稿,但它太长了,我没能在离开前完成。这使得很多内容完全过时了,因此它被限制在一个死分支中。不过,总有一天。
我在写这篇博客文章时有几个目标。第一,展示人工智能在语言学习中的一个很酷的用途。第二,希望能激励人们识别并减少自己工作流程中的摩擦。最后,练习撰写短篇内容。
如果你喜欢这篇文章,请考虑在 Twitter 上关注我,或者使用 我的网站 的 RSS Feed 获取未来碎碎念的通知。感谢你阅读到这里,希望你觉得它有用!
致谢及额外资源
我深受 Livakivi 的 Youtube 频道 启发。即使你对语言学习不感兴趣,我也建议你看看。他们涵盖了许多其他主题,如家居装修、绘画、技术,以及一般的学习。他关于语言学习的完整系列可以在这里找到。
发现这篇博客文章有什么问题?请通过电子邮件或 Twitter 告诉我!