前些日子我用了一阵 Typeless。平心而论,它把”口述变文字”这件事做得相当顺滑:中英混说不必切换,标点自动补齐,说完即上屏。但用久了攒下两个疙瘩。其一,我的全部转录历史锁在它的云端,没有一个”统一导出”的按钮;其二,我在文档里把”拍西艾”改回 PCI、把”马乏凯泰”改回玛伐凯泰,改了一次又一次,它一次也没记住。订阅照付,数据归人,个性化无从谈起。
于是起念自己做一个。认真调研了一圈,结论却是:想造的东西,已经有人造好了。
CapsWriter-Offline,GitHub 上六千余星的开源项目,2026 年 5 月还在发新版。按住一个键说话,松开上屏,识别全程在本地——模型文件就在我自己的硬盘上,编码器五百余兆,解码器一点四 G,拔掉网线照常工作。它准的道理值得一说:新一代 Qwen3-ASR 的解码器本身是个 1.7B 的语言模型,一边听声学特征,一边”写它认为通顺的话”,故此标点自带、中英夹杂不乱;配上音素级的热词表,把玛伐凯泰、IVUS 这类专业词灌进去,识别一个准一个。在我这台双显卡的机器上,模型加载四秒,短句几乎瞬出,日常体验已不逊于云端订阅的同类,而语音与文本,寸步不离我的磁盘。
但它仍缺一环:不会从我的修改里学习。
这一环我自己补了,起名 CapsLearn,四百七十行 Python,托 Claude Code 之力两天写成,已开源。机制说穿了不玄:CapsWriter 本就把每句听写连文本带录音按日归档;我改完一段文字,选中终稿按一下 Pause 键,程序拿终稿去归档里做相似度匹配,找到那句原始转写,”机器怎么写的—我怎么改的”就配成一对存进本地。每晚八点,一个定时任务把攒下的配对逐字比对,抠出替换片段。中文没有空格,机器不知词的边界,单看一句只能抠出”马乏→玛伐”这样的碎片;诀窍在于等同一个错误再次出现——两句话上下文各异,唯独术语每次都完整贴着错误,取个交集,上下文自动洗掉,”马乏凯泰→玛伐凯泰”便完整浮出。累计出现两次,自动写进热词表,三秒热重载,下一句生效;只出现一次的,进候选报告等人工过目。上线数日,playStation、Notion,连同”马乏凯泰”这个误写变体,均已自动入表,我未动一根手指。
把这套思路发到原项目的 issue 里,作者回了两条,都在点子上。他说自动化难在”程序无从知道用户何时改完”——确实,所以我干脆不猜,让用户按一下键自己发信号;他说断词边界终究要靠大模型——也对,交集统计啃下的是八成,长尾我认。他另给了一条好建议:医生不妨把处方权限内的药名整表灌入热词,五千词条不过十毫秒延迟。此言在理,已列入计划。
代价也须如实写下。这套方案要一块像样的显卡,集显只能退用小模型;打包的程序带着全局热键和剪贴板操作,杀毒软件容易多看两眼;采集进程静默退出过,我给它加了每小时的保活任务——本地方案的自由,是连同维护责任一起买断的。还有一桩有趣的翻车:热词按发音模糊匹配,”列线图”入表之后,我说”路线图”竟被它劫持了去。灵敏度与特异度此消彼长,做诊断的人对这架跷跷板不会陌生。
最后交代一句边界,免生误会:这套回路自始至终没有动过模型一个参数。热词表之于模型,如同老花镜之于眼睛——镜片不改变眼球,却让字迹清晰;真要改造眼球,那是另一场手术(微调),而手术所需的语料,每一次听写都在替我悄悄积攒。
数据在谁的磁盘上,个性化就归谁。
代码在此:github.com/Deepmindlearning/capslearn,MIT 协议。医学之外的行当,换一张词表同样适用。