我用了很多年在线语音识别。把录音传上去,等一会儿,拿到文字,再自己改。这套流程替我省过不少时间,我也早就习惯了。
后来处理工作材料,我得先考虑录音能不能离开自己的电脑。有些内容不能交给外部在线服务,工具再方便,也得先过这一关。
我想要的其实没有变:把一段录音变成文字,听不清的地方回放一下,改好以后导出 Word。只是这一次,我希望整个过程留在本机。
于是,我开始让 Codex 帮我做自己的转写软件。我没有开发经验,哪种模型合适、窗口该用什么做,都不知道。我先把自己每天会怎么用它说清楚。
第一版,我只提了四件事
录音能拖进去。说话的人能分开。名字能改。最后能导出 TXT 或 Word。
会议纪要先不用做。我要的是一份可以检查的转写稿,后面的整理可以再交给别的工具。这四件事听起来很普通,但我已经知道,有其中一件不顺手,软件就很难留在我的日常工作里。
第一轮选的是 Windows 桌面软件。中文识别试了 Paraformer,中英混合试了 Whisper,区分说话人的部分用了 pyannote,窗口用 PySide6,Word 导出也找了现成组件。
这些名字当时主要是 Codex 在解释。我关心的,是把文件放进去以后能不能看见进度,等完以后能不能拿到一份稿子。AI 把组件接起来,我拿真正要用的录音去试。
试过几次以后,新的要求就冒出来了。
我得有一个停止按钮。有时候模型选错了,有时候只是想先看已经识别出的那一部分,不能只能干等着。说话人数最好先自动判断,我知道实际人数的时候,也要能自己选。转写结束后,上面那块选文件、选模型的准备区应该缩小,把屏幕让给正文。
这些都不是我开始时能列出的完整设计。打开软件用起来,才知道哪块占地方,哪个动作少了一个按钮。
“改一个名字”,其实是两件事
人物分开以后,稿子上会出现“说话人1”“说话人2”。它知道几段声音可能来自同一个人,却不会自动知道这个人叫什么。我仍然要对着录音确认,再填上名字。
后来我发现,改名字还得分两种情况。
如果整篇里的“说话人1”已经确认就是同一个人,我想把这个编号统一改成他的名字。但如果模型只是把某一段归错了,我在这一行改作者,就只应该改这一行。
原来把这两件事混在了一起。我想纠正一段话,软件却可能把全文的标签一并改掉。看起来都叫“改名”,实际会动到不同的内容,得拆成两个清楚的操作。
播放器也一样。拖动播放位置,下面的文字得跟着走;点一段话的时间,录音得从那里开始。我不想一边听,一边在几万字的稿子里找自己听到了哪一段。
同一个人说得久,文字要能分段。错词要能全文替换。校对完的稿子导出成 Word,段落和我刚才改过的名字都得在。不能屏幕上已经改好了,交出去的文件又回到老样子。
我不会写这些功能,但哪种结果会耽误我的事,我很清楚。
人数看着对,内容却缺了一大截
真正改变我做这个软件的,是一次长录音。
那段录音有一个多小时,几个人轮流说话。程序跑完了,有文档,也分出了人物。乍看,软件把流程走完了。继续看稿子,我却发现前面、后面都有大片空白,有些地方意思也明显不对。
我当时给 Codex 的反馈很直接:人数和说话基本上没有错,内容却差很多,漏得也多。我要它先把模型这件事修好,不要一直给我解释为什么可能出错。
回到原录音核对,空白处确实有人在说话。我们又用另一条识别路线试了几段,那些声音也能识别出来。不是录音里没有内容,是这次程序没把内容交出来。
开发记录里留下了当时的对比:一段约 71 分钟的多人录音,原来的 GPU 路线只出了大约 7,647 字,时间轴上最长一处空白有 312 秒。
五分多钟。对着录音,这个数字就不再是一个技术指标。那一带明明有说话声,稿子却没有对应的文字。
那时我还有一个很自然的想法:既然装了显卡,跑在 GPU 上总该更好一些。结果这一次,显卡在工作、程序在往下走,都没有替我保证稿子完整。
最后先退回 CPU,把漏掉的东西找回来
Codex 顺着那几段空白去查,才发现问题出在当时 Paraformer 的 GPU 量化推理路线。它处理一段段长短不一的语音时出了错,接着却把错误当成了静音或噪声。换句话说,识别失败了,软件收到的结果却像是那一段根本没有人在说话。
界面没有明确告诉我这一段失败了。它继续处理下一段,最后给了我一份看起来已经完成的文档。
同样的片段换到 CPU 路线后,能稳定得到文字。那次修复就先用了 CPU INT8,而没有继续追着 GPU 利用率往上走。
完整重跑那段录音,记录里是约 125.8 秒,336 个语音区间里有 334 个出了正文,总共大约 19,800 字。和之前相比,多出来的已经是一万多字。
这只是当时同一段录音、两条处理路线的对比,不是我所有录音都能有这个速度,也不代表每个字都对。我仍然需要回听名字、数字和重要的表述。但至少,那些成片的空白不能再被一个“完成”状态遮过去。
后来加了一道完整性检查:先看检测出有声音的区间,实际有多少得到了文字。如果比例低得离谱,软件要报错,不能悄悄保存一份残缺成品。当时设下的一个门槛是 70%。这个比例检查的是有没有漏掉大量语音,不是识别准确率。
我想要的提示也很具体:哪里没拿到文字,为什么停下,已经处理好的部分有没有保存。出了问题,我还得知道从哪里接着来。
软件还要住得进我的电脑里
模型下载下来以后,磁盘也开始变成一个问题。我的 C 盘空间有限,我让 Codex 把这个项目的工作区和模型搬到 D 盘,录音工程、结果和日志也有自己的地方。
这件事看上去不像开发核心功能,却直接关系到软件能不能继续用。不能为了本地处理录音,最后把系统盘塞满。
显存也得安排顺序。先识别文字,再做人物区分,必要时释放前一个模型占着的资源。后面那一步出了问题,前面已经识别出的文字还得保住。停止处理,也应该留下已经做完的部分。
原录音要保留。要调音量、做降噪,就另外处理一份临时副本。我回头要检查一句话,或者想换个模型再试,还得有同一份原始录音可用。
工程自动保存、能打开历史结果、能继续改名字和文字,这些东西后来逐渐加进来。最初那四个要求,最后牵出了不少我原先没想到的工作。
我还是得把稿子听一遍
软件后来有了“知微见著”这个名字,转写成为其中的一部分,翻译、文本整理等工具也继续往里面接。
不过,回到录音这件事,我最在意的还是那份稿子。文件能打开,文字能继续改,人物标签可以校正,重要的内容有原录音可以核对。
我不会因为它在本地跑,就觉得它一定正确。人物编号重新生成时可能变,识别也会听错。名字、数字,以及一句话到底是什么意思,都还得有人看。
开始用 AI 写软件以后,我没有一下子学会模型推理,也没有变成程序员。我只是把过去用工具时忍下来的那些不方便,一件件提了出来。
少一个停止按钮,我就让它加。改一个人名动到了整篇,我就让它拆开。程序说完成,录音却漏了五分钟,我就回到原文找原因。
到了这一步,我终于有了一份能在自己电脑上整理、校对、保存和导出的工作稿。它不必把所有事情一次做完,但交到我手上的那一部分,要让我知道发生了什么,也留得下我已经做过的修改。

