用 Typeoff 口述代码思路:从原始想法到结构化 Markdown
我用语音口述写完了上周所有的 PR 描述和 Bug 复盘——一份给开发者的 Typeoff 实战工作流利益相关声明:本人 Typeoff 个人用户,使用约一个月。本文非官方稿件、无任何商业合作。Typeoff 功能描述以官方文档为准。文中提到的 Cursor、Claude Code、Wispr Flow 等均为公开可查的产品。写在前面开发者写文档时经常会遇到一个尴尬的问题:代码逻辑已经在脑子里想清楚了,但要写成文档,得重新组织一遍。比如修一个保存失败的问题。脑子里的原始判断可能是这样的:用户编辑文章以后点保存,偶尔返回 409。应该是本地版本和服务端最新版本冲突。需要先拉最新数据,再让用户决定合并还是覆盖,最后重新提交。这段话作为工作讨论是够用的,但不适合作为技术记录——因为它缺少背景、复现路径、根因分析、处理方案和验证清单。而要把它扩展成正式的技术文档,你需要做的事其实和想清楚无关。它无关思考,只关乎把已经在脑子里的东西,一个字一个字敲出来。这是我用 Typeoff 之后的最大体感:开发者的写作瓶颈,从来不是想不清楚,是写下来的启动成本太高。这篇文章想分享一个我用了一个月的实战工作流——口述初稿 AI 整理 开发者补充技术细节——以及它在 PR 描述、Bug 复盘、接口变更说明等几个典型场景里的具体用法。一、为什么开发者最该用语音输入先讲清楚一件事——这篇文章不是来劝你用语音输入代替键盘。代码本身要用键盘写,这是不可妥协的。但写代码周边的所有文字——PR 描述、Bug 复盘、接口文档、技术决策记录、Slack 沟通——其实非常适合用语音口述。原因有三个:1. 这些内容本来就更接近对话,不是写作你写 PR 描述时,本质上是在向同事解释我做了什么、为什么这么做。这是一种口语化的解释,而不是论文式的写作。键盘输入会逼你把这种解释格式化,反而失去原本的清晰度。2. 开发者的思考速度,远快于打字速度普通人打字 60 WPM 左右,说话 130-150 WPM。这中间是 2-3 倍的差距。当你在描述一个复杂的技术问题时,这个差距会变成实际的认知负担——你的手永远在追你的脑子。3. AI 真正让语音输入可用了过去的语音输入会给你一坨嗯那个就是的口语垃圾。但 AI 介入后,能自动:去掉填充词识别自我修正(说错改口它能听懂)自动加标点和分段把第一第二第三变成有序列表把创建订单识别成createOrder这一切让开发者口述技术内容第一次变成了一件不需要后期清理的事。二、三步走的工作流我现在写技术文档的固定流程是这样的:Step 1 · 口述原始判断,不追求格式按住快捷键(Typeoff 默认是 Fn 键),开始说话。不用预先组织,想到哪说到哪。比如还是那个保存失败的案例,我会这样口述:保存文章的时候偶发 409,应该是版本冲突。等等,补充一下,这个是后端按乐观锁实现的,版本号每次保存都会自增。客户端如果用了旧的版本号去提交,后端会拒绝。处理思路是保存前先拉一次最新版本,如果有冲突,弹个对话框让用户选择是合并还是覆盖。覆盖要二次确认,因为有可能丢失别人的修改。验证主要看三个:正常保存的流程不被破坏、冲突提示要明确、合并后内容不丢。这段话我口述大概 30 秒,Typeoff 直接输出干净的文本——没有嗯那个,标点齐全,它甚至理解了我中间那句等等,补充一下是自我修正,自动把它整合进了上下文。这是 Typeoff 的一个叫 Self-Correction Aware(自我纠错感知)的特性,大致是 ASR 之后加了一层 LLM 后处理,识别语义层面的修正意图。这个特性让我可以先说,再想——而不是想好,再说——这才是真正的语音输入的状态。Step 2 · 让 AI 整理成 Markdown 大纲口述结束后,我会把这段文字丢给 AI(Cursor、Claude、ChatGPT 都行),给一个简单提示词:把以下口述内容整理成 Markdown 格式的技术文档大纲,包含:背景、初步判断、处理方案、验证清单。保留所有技术细节,不要添加我没说过的内容。AI 会返回大致这样的结构:## 背景 编辑文章后偶发保存失败,接口返回 409 conflict。 ## 初步判断 后端采用乐观锁实现,版本号每次保存自增。 客户端提交的版本号落后于服务端最新版本,触发并发冲突。 ## 处理方案 - 保存前检查最新版本号 - 检测到冲突时拉取服务端数据 - 弹出合并 / 覆盖选择对话框 - 覆盖操作需要二次确认(防止误丢他人修改) - 用户确认后重新提交 ## 验证清单 - 正常保存流程不被破坏 - 版本冲突时提示明确 - 合并后内容不丢失 - 覆盖操作有二次确认弹窗注意这一步的关键约束:保留所有技术细节,不要添加我没说过的内容。这条约束很重要——AI 有时候会自作主张加一些它认为应该有的内容,但那些内容你没有验证过,贸然写进文档反而是污染。Step 3 · 开发者补充技术细节AI 给的是骨架,真正的技术内容还是要你来填。这一步通常包括:关键代码片段(用键盘写,这个不能省)边界条件(比如:网络断了怎么办?用户已经合并到一半再次冲突怎么办?)测试结果(具体测试用例的执行情况)影响范围(这个改动影响哪些接口、哪些页面)完整的 PR 描述可能会变成这样:## 背景 编辑文章后偶发保存失败,接口返回 409 conflict。 issue: #1234 首次报告时间:2026-06-15 ## 复现步骤 1. 用户 A 打开文章 X 进入编辑态 2. 用户 B 同时打开文章 X 进行编辑并保存 3. 用户 A 点击保存 → 触发 409 ## 初步判断 后端采用乐观锁实现,articles.version 每次保存自增。 客户端提交的 version 落后于服务端最新版本,触发并发冲突。 关键代码位置: - 后端校验:app/services/article.py:save_article - 客户端提交:src/api/article.ts:updateArticle ## 处理方案 \\\typescript async function saveArticle(article: Article) { try { return await api.updateArticle(article); } catch (err) { if (err.code 409) { const latest await api.fetchLatest(article.id); const resolved await showConflictDialog(article, latest); if (resolved.action overwrite) { await confirmDestructiveAction(); // 二次确认 } return await api.updateArticle(resolved.merged); } throw err; } } \\\ ## 验证清单 - [x] 正常保存流程不被破坏 - [x] 版本冲突时弹窗提示明确 - [x] 合并后内容不丢失(测试 3 种合并场景) - [x] 覆盖操作有二次确认弹窗 - [x] 二次确认取消后保留原内容 - [ ] 弱网环境下的行为(待补充测试) ## 影响范围 - 文章编辑页(/article/:id/edit) - 文章草稿自动保存(/article/:id/draft) - 移动端 H5 编辑(下个版本同步处理)整个过程从口述到完整 PR 描述,大概 5-8 分钟。而传统流程,从一个完整的 PR 描述写完,平均要 20-30 分钟——因为你的手要追你的脑子,中间会被打断好几次。三、5 个适合用这套工作流的场景讲完通用流程,讲几个具体场景。这些都是我自己每周高频在用的。场景 1 · PR 描述最直接也最高频的场景。PR 描述写得好不好,直接影响 reviewer 的效率。但很多人写得敷衍——不是不重视,是写一个完整的 PR 描述要打太多字。口述工作流让我能在 5 分钟内写出之前需要 20 分钟的 PR 描述。我现在固定有个口述模板:这个 PR 是为了解决 [问题]。问题表现是 [现象]。我的判断是 [根因]。处理方案分这几步 [步骤]。验证我做了 [验证]。可能影响的地方是 [影响范围]。按这个口述,加上后续补代码片段,PR 描述就完整了。场景 2 · Bug 复盘事故复盘是开发者最讨厌写又必须写的东西。口述的力量在这里特别大,因为复盘需要的是叙事感——什么时候发现、怎么定位、怎么解决——而叙事最适合口述。我的固定结构:## 时间线 - HH:MM 发现现象 - HH:MM 初步定位 - HH:MM 确认根因 - HH:MM 修复上线 - HH:MM 验证完成 ## 根因 (口述说清楚) ## 影响 (口述说清楚) ## 修复方案 (口述 代码片段) ## 改进项 - 短期(本周内) - 长期(下个迭代)时间线那部分我会边查日志/Slack 历史边口述,效率比打字高得多——因为眼睛在屏幕上找东西,嘴可以同时输出。场景 3 · 接口变更说明这种文档对准确性要求极高,但同时又需要解释为什么这么改。我的工作流:先用键盘列出所有变更点(接口名、字段名、新增/删除),然后用口述补充为什么和前后端配合点。## 变更接口 - POST /api/articles - 新增 version 字段(required) - PUT /api/articles/:id - 新增 version 字段(required) - 新增 GET /api/articles/:id/latest - 获取最新版本号 ## 字段说明 | 字段 | 类型 | 说明 | | --- | --- | --- | | version | number | 文章版本号,客户端提交时必填,后端校验 | ## 为什么改 (这里用口述,讲清楚乐观锁的设计意图、为什么不用悲观锁、对前端开发的影响) ## 迁移建议 (口述代码片段)场景 4 · 代码逻辑讲解(知识库 / 团队文档)写技术博客或者内部知识库时,最难的不是懂,是讲清楚。我有个习惯:对着代码先口述讲一遍——就像我在给一个新同事讲解一样——然后让 AI 帮我把这段口述整理成结构化文章,最后再回到 IDE 把准确的代码片段补回去。这套工作流有个隐藏好处:口述时,你会本能地补充为什么。打字时人容易直接陈述事实(我们用了 Redis 做分布式锁),口述时会自然加上动机(我们用 Redis 做分布式锁,是因为乐观锁在这个高并发场景下重试率太高)。这种为什么才是技术文档真正有价值的部分。场景 5 · 会议后的技术决策记录技术评审、架构会议结束后,经常需要记一份决策文档:讨论了什么、决定了什么、放弃了什么。我的工作流:会议刚结束(记忆最鲜活)的时候,立刻找个安静的角落用 Typeoff 的 Voice Notes 长录音模式,对着自己把会议要点复述 3-5 分钟。Voice Notes 会自动生成带标题和摘要的笔记。然后回到电脑前,把这份草稿整理成正式的决策记录(ADR,Architecture Decision Record):# ADR-007: 订单服务的并发控制方案选型 ## 背景 (口述) ## 候选方案 - 方案 A:数据库行锁 - 方案 B:Redis 分布式锁 - 方案 C:乐观锁(版本号) ## 决策 选择方案 C。 ## 决策理由 (口述,包含会议中讨论的几个考量点) ## 放弃的方案 (口述,讲清楚为什么不选 A 和 B) ## 后续行动 - 谁负责实现 - 什么时候上线 - 怎么验证四、和直接打字或直接让 AI 生成的对比讲清楚一件事——这个工作流不是来取代你的思考的,它只是把思考和写下来这两件事解耦。方式思考占比输出效率准确性个人风格直接打字100%低高强让 AI 直接生成0%高不稳定弱口述 AI 整理 人工补充100%中高高强第二种方式(直接让 AI 生成)是很多人现在的默认做法——给 AI 一个简单提示词,让它生成 PR 描述。这条路我也试过,但很快放弃了。原因:AI 不知道你具体改了什么。它只能基于代码 diff 猜测,而 diff 是结果,不能反映你的设计意图。AI 会用看起来很专业的话掩盖你没想清楚的地方。这在技术文档里是灾难——你会发现自己审稿审到一半,发现 AI 编了一个根本不存在的边界条件。文档没有你的个人风格。同一个团队所有人的 PR 描述读起来一样,是组织信号的损失。而口述工作流的不同在于:思考的主体始终是你。AI 只是替你把已经想清楚的东西快速变成可读的文字。你说什么它就有什么,你没说的它不编。五、几个开发者常踩的坑最后说几个我自己踩过的坑,帮你少走弯路。坑 1 · 期待 AI 帮你识别变量名变量名(createOrder、useState)、特殊符号(-、)、SQL 关键词(SELECT FOR UPDATE)——这些用语音输入识别率会肉眼可见地下降。我的解法:专业术语加进自定义词库。Typeoff 允许添加最多 100 个自定义词,而且它有一个智能词库建议——发现你反复在把某个错词手动改回来,它会主动提示你加进去。我把项目里高频的术语(Prisma、Supabase、SELECT FOR UPDATE、createOrder)都加进去之后,识别准确率明显提升。但更稳的做法还是:让 AI 整理大纲,代码部分自己回 IDE 手动补。别期待语音输入能精准识别代码片段——它不是来做这件事的。坑 2 · 在大开间办公区使用这是物理限制。我自己的解法:长内容(Bug 复盘、决策记录、技术博客):找空会议室,集中口述 10-15 分钟短内容(PR 描述、Slack 长消息):戴个口罩对着电脑小声说,反正 Typeoff 的麦克风够灵敏公共环境下完全没法用:那就回归键盘,这个工作流不是要取代键盘,是补充坑 3 · 期待 AI 整理后就能直接发AI 整理出来的大纲只是骨架,关键技术细节必须你手动补。最容易出问题的是边界条件——AI 整理时经常会漏掉或者编造。审稿时重点看边界条件,这是判断你这份文档可信度的硬指标。坑 4 · 在 IDE 里直接口述代码我刚开始用的时候做过这种事——在 VS Code 里按 Fn 说创建一个函数叫做 saveArticle,接收一个 Article 参数,返回 Promise——结果一看输出,标点全是中文标点、变量名识别错、async写成了耳所应可。别这么干。语音输入不是来替你写代码的,它是来写代码周围的文字的。这是两个完全不同的场景。六、写在最后回到文章开头的那段话:用户编辑文章以后点保存,偶尔返回 409。应该是本地版本和服务端最新版本冲突。需要先拉最新数据,再让用户决定合并还是覆盖,最后重新提交。如果是一年前的我,会把这段话留在脑子里,然后花 20 分钟把它翻译成正式的 PR 描述。现在的我,口述 30 秒,AI 整理 1 分钟,我补充代码片段和边界条件 5 分钟。总共 7 分钟拿到一份比之前更完整、更结构化的文档。真正的变化不是打字快了 4 倍,而是我开始愿意写文档了。以前不愿写文档,不是因为不重要,是因为启动成本太高。一段还没结构化的判断,要变成一份正式的文档,中间隔着 20 分钟的打字疲劳。而当这个启动成本被压低到 30 秒,我会愿意为每个 PR、每次 Bug 复盘、每次架构决策都留下一份文档。这是个隐藏价值——团队的知识沉淀,通常死在启动成本上,不是死在写作能力上。如果你想试这套工作流:Typeoff 官网: typeoff.aimacOS 11.0 / Windows 10/11 都支持免费版每周 8000 词,对绝大多数开发者够用第一次用建议先调下自定义词库和快捷键写完这篇文章一共用了 3500 字左右,其中初稿 80% 是用 Typeoff 口述出来的。整理一下个人风格、代码片段我手打,其他部分都是先说出来再修改。希望这套工作流能帮你把更多技术判断沉淀成可读的文档。