自动识别老是猜错:锁定你的语言
听写老是落在错误的语言上?自动识别在双语语音上的抖动是设计使然。锁定一次你的语言,它就一直锁着。
如果你用不止一门语言口述,你一定见过这种失败。你用罗马尼亚语说了一句话,转写回来的却是拼读上被搅烂的英语 — 都是真词,没一个是你的。或者它在句子中间翻车:前半句是对的语言,后半句变成了模型认定你切换过去的某种东西。又或者,我个人最爱的那种 — 混合字母表大杂烩 — 拉丁字母里撒着几个西里尔字母,像是模型在逐个字母地两头下注。
这不是针对某一款产品的抱怨。这是自动语言识别可以预料的失败模式,包括 Keebye 那个针对英语调优的默认引擎。它专挑说带口音英语的人,以及任何一天里来回切换语言的人。一个 Slack 用波兰语、提交信息用英语的双语开发者,给自动识别的正是它最不擅长处理的那种混合信号。
抱怨的后半截更安静,却同样真实:当语言设置确实存在时,它往往被埋得很深。三层菜单往下,藏在一个引擎选择器后面,越过一个名字里压根没提语言的开关。如果你一天要切换二十次语言,一个埋起来的设置在功能上等于没有设置。
我想解释这种抖动为什么会发生 — 用我自己产品的战地故事,因为 Keebye 在有这个修法之前,就有过这个问题 — 然后再展示一个真正的解决方案长什么样。
自动识别为什么会抖动(以及它为什么不完全算 bug)
这是诚实的机制。现代语音模型会在解码过程中悄悄做语言识别。模型听着,在内部形成一个关于自己听到的是哪门语言的猜测,然后照着那个猜测解码。当音频干净、没有口音、单一语言时,这套做法好到你根本不会想起它。
现在喂给它真实的语音。一种口音会把元音推向另一门语言的音位。一句话里含着三个英语外来词 — 每一次技术对话都会。背景里有个小孩,或者你在用笔记本的麦克风。这些都会让模型内部的语言猜测更没把握,而一个低置信度的猜测可能在帧与帧之间翻转。它一翻转,解码就跟着翻转,于是你就得到一段在念头中途换了语言的转写。
关键的部分是:在大多数工具里,没有任何东西为那个猜测下锚。模型自己决定,悄无声息地,按每次话语决定,而你没有覆盖的余地。这不是某一个应用的 bug — 这就是安静的自动识别本身。一个模型在替你做一个你无法纠正的判断。
我对这件事了解得很深,因为 Keebye 的默认引擎正好有这个性质。Parakeet,我们针对英语调优的默认模型,在解码层忽略任何语言提示 — 你没法告诉它你接下来要说什么。在清晰的英语上它非常出色,这也是它成为默认的原因。在不清晰的音频上,它会和这个品类里的其他一切一样在语言之间抖动。我先把这件事说给你听,是因为只有当你接受问题住在架构里、而不是住在某个竞品的马虎里时,那个修法才讲得通。
锁定一门语言到底做了什么?
修法就是别再让模型猜。Keebye 提供了第二个端侧引擎 — NVIDIA 的 Canary 1B v2,量化到 int8 — 它精确覆盖 25 种语言:保加利亚语、克罗地亚语、捷克语、丹麦语、荷兰语、英语、爱沙尼亚语、芬兰语、法语、德语、希腊语、匈牙利语、意大利语、拉脱维亚语、立陶宛语、马耳他语、波兰语、葡萄牙语、罗马尼亚语、斯洛伐克语、斯洛文尼亚语、西班牙语、瑞典语、俄语和乌克兰语。和默认引擎不同,Canary 接受语言指令,并且照办。
Keebye 把这一点暴露成一个锁定:一个显式的语言设置,在每次话语时传给 Canary 引擎。锁定罗马尼亚语,解码器就使用罗马尼亚语,而不是自己做一次自动的语言选择。识别仍然可能出错,尤其是在外来词和嘈杂音频周围,但语言的选择不再是一个无人核对的猜测。
这个设置是按每次听写实时读取的。改掉它,下一次按住说话就使用新语言,不需要重启应用。这件事比听起来更重要:一个语言控制项,只有在切换它不打断工作时才有用得多。
而且因为 Canary 和 Keebye 里的其他一切一样在端侧运行,这个锁定不会让你付出隐私上的代价。这个模型约 1.3 GB,下载一次;之后你的罗马尼亚语、你的波兰语、你的乌克兰语都不会离开这台机器。(我们为什么认为本地多语言听写重要,本身是另一篇文章 — 给开发者的听写不该只有英语。这一篇是它实操上的续集:那篇为这些语言辩护,这篇讲怎么让它们真正好用。)
两次点击,而不是三层菜单
一个你够不着的锁定,就是一个你不会用的锁定,所以这个开关放在托盘里。Keebye 的菜单栏图标有一个 “Dictation Language” 菜单,里面是一份精选的 11 种语言短名单 — 英语、罗马尼亚语、法语、德语、西班牙语、意大利语、葡萄牙语、荷兰语、波兰语、俄语、乌克兰语。从任何应用里两次点击:点托盘,点语言。你不用打开 Settings,也不用离开当时正在工作的窗口。
完整的 25 种语言名单放在 Settings 里,供短名单之外的语言使用。但这份短名单覆盖了大多数双语工作的日常现实:你在用一门语言写给团队,用另一门写给客户或 AI 智能体,而你需要这次切换的成本为零。
还有一个值得知道的选项,因为它彻底改变了某些人使用锁定的方式:一个译为英语的开关。说你的语言,落在光标处的是英语 — 同一个引擎,同样的端侧执行。如果你的内心独白跑在罗马尼亚语上,而你的输出需要是英语(提交信息、给编程智能体的提示词、写给国际团队的回复),这就把你原本在脑子里做的那道翻译工序折叠掉了。我用它的次数比我预想的多。
这个锁定的代价
25 种语言就是 25 种语言。 云端听写工具列出的远不止这些,因为把音频送到一个大型服务端模型,是增加语言最便宜的办法。这就是端侧真实的取舍:一个装得进你 Mac 的模型,覆盖的世界少于一个填满数据中心的模型。如果你的语言不在这 25 种里,Keebye 的多语言引擎今天覆盖不了你,我宁愿这么说,也不愿往上凑。
锁定就是锁定。 这是确定性的另一面,我想把话说明白:如果你锁定了罗马尼亚语然后说英语,Keebye 会忠实地把你的英语误解码成罗马尼亚语,直到你切换为止。引擎做的正是你告诉它的事。自动识别全部的吸引力就在于你永远不必想这件事 — 而锁定是用那份便利换取可预测性。以我的经验这笔交易值得,因为一个你控制不了的错误猜测,比一个你两次点击就能改掉的错误设置更糟。但它是一笔交易,不是免费的午餐。
托盘短名单是 11 种语言,不是 25 种。 如果你日常的那一对里包含比如芬兰语或希腊语,那其中一边你就得走 Settings。精选意味着总有人的语言没进快捷菜单。
这让那个抱怨落在了哪里
品类层面的抱怨 — “我的听写老是出成错误的语言” — 其实是对无声决定的抱怨。模型猜了,猜错了,而你没有办法告诉它别的。每一个保留了猜测的修法(更好的识别、更长的音频窗口、置信度阈值)都只是让这种失败变得更罕见、更古怪。真正终结这个抱怨的修法,是把决定权还给用户。
如果你正在用另一款工具经历这一切,我们的比较页面对每款工具的适用场景都很诚实 — Keebye vs Superwhisper 和 Keebye vs Wispr Flow 都在其他议题之外谈到了语言这个问题。要亲自试试这个锁定,就在下方开始你的免费试用,把本文开头那句罗马尼亚语或波兰语重放一遍,看看那些抖动里有多少来自一个无人核对的猜测,而不是你的口音。
锁定你真正在用的那门语言
开始免费试用,把一条曾被自动识别搅烂的母语回复重放一遍。
Start free trialEarly access: we'll email you the moment the macOS build is ready — your 14 days start when you first sign in from the app.
继续阅读
用你自己的语言口述代码评审
代码是英语的,你的评审意见不必也是。怎样用 25 种语言之一在端侧口述评审意见,以及为什么锁定语言这件事很关键。
给并行智能体口述提示词,一条任务线一条地喂
同时跑两三个编程智能体,写提示词本身就变成了瓶颈。一套语音工作流,让你不用离开手上这条任务线也能喂饱其他几条。
用声音驱动 Claude Code:并行任务线式的构建
AI 编程智能体让打字变成了瓶颈。这是一套实用的工作流:在 macOS 上跨并行的智能体任务线口述提示词、评审和纠偏。