用设备端 Whisper 实现本地、私密的语音输入
为什么 MadoHub 在你机器上跑语音识别而不是调云端 API,这对隐私和成本意味着什么,以及如何用好听写。
MadoHub 坐在你代码库旁边。当你向它听写时,你常常在描述你当前正在看的东西——一段 stack trace、一个变量名、一段配置文件片段,有时是一个你从 .env 文件里读出来向 Agent 解释的秘密。那是你默认不想交给第三方语音 API 的音频。所以 MadoHub 里的语音输入不调一个。它在本地、与应用其余部分同一进程里运行 whisper.cpp。
这篇关于为什么那个决定要紧,以及如何用好 MadoHub 里的听写,详细到你能据此行动。
MadoHub 如何处理
没有音频离开机器
没有流式上传、没有 API key、没有发向某个语音转文字供应商的请求。捕获的音频由一个存在你磁盘上的本地 Whisper 模型转写。整个功能里唯一的网络调用是一次性的模型下载;那之后,录音和转写都在机器离线时发生。
那有两个值得点名的直接后果:
- 关于你说了什么(以及你说时屏幕上是什么)的任何东西都不会被传到任何地方。 对一个为坐在你工作代码库里而生的工具,那不是锦上添花——它是语音输入对任何敏感东西可用的原因。
- 没有按分钟或按请求的成本。 一旦一个模型下载好了,转写免费且不计量——它是本地计算,不是一次计费 API 调用。
离线工作
因为模型在磁盘上、转写器在进程内运行,只要模型文件已在,语音输入在没有任何网络连接下工作。MadoHub 在它打开麦克风之前先检查这一点:如果所选模型没下载,它把你送到 Settings → Voice Input 并提示下载,而不是对着静音录音、只在转写时才失败。
短发音补零、噪音过滤
Whisper 的编码器在 30 秒块上训练,多一点几秒上下文时表现更好。非常短的发音——一两个词——能触发一个已知 Whisper 失败模式,解码器把同一句话循环一遍又一遍。MadoHub 通过在转写前给短录音补一小段静音来防这一点,给解码器足够空间找到一次连贯的单 pass。
安静或歧义音频仍可能产出垃圾,所以 MadoHub 用两个阈值在它们变成文字之前丢掉看起来像静音或低置信度噪音的段落。结果是安静段落不会变成你 prompt 里的幻觉转写。
一次加载、复用、按需卸载
Whisper 模型懒加载:在第一次转写请求之前不从磁盘读任何东西。一旦加载,它常驻内存并跨调用复用——对默认 small 模型,那是大约 500 MB,只要语音输入在用就留在 RAM。如果你在 Settings → Voice Input 里切换模型大小,MadoHub 丢掉旧模型而不是让一个陈旧缓冲徘徊,并在下一次转写时加载新选的模型。
实用指引
- 在你需要之前下载模型。 在模型就位之前语音输入不会开麦克风。在 Settings → Voice Input 提前选一个,免得第一次听写卡在下载上。
- 选一个适合你机器的模型大小。 默认
small模型是准确度和占用的好平衡(常驻约 500 MB)。更大的模型更准但更重;更小的更轻但不够准。在 Settings → Voice Input 切换,更改在下一次转写生效。 - 自然地说,别一个词一个词蹦。 因为 Whisper 处理 30 秒块比处理零点几秒更好,正常句子比孤立关键字转写更可靠。如果你一个词一个词听写,预期偶尔出现重复瑕疵。
- 用它描述屏幕上的东西。 听写在描述一段 stack trace、走查一个 bug、或看着代码叙述一个计划时最闪亮——恰恰是你宁愿不把音频交给云端 API 的场景。
- 想离线就离线。 模型下载好之后,转写在网络完全关闭下工作。如果你在做敏感的东西,那是一个有意义的属性,不是奇趣。
这些没有一件是奇技淫巧——吸引力在于从麦克风到文字的整条路径短、本地、可检视,那正是当你听写的东西可能是关于不该离开你笔记本的代码的描述时你所想要的。