Simon Willison 分享用 ChatGPT Codex 语音模式,在厨房做饭的同时通过语音对话完成了博客 Newsletter 页面功能开发,从起服务到写迁移到上线全流程。
我博客的新功能,用声音驱动构建
今天我给博客上线了一个新功能:Newsletters 页面,索引了我发出去的所有 newsletter,既包括每周免费的 Substack 邮件,也包括每月仅限赞助商阅读的内部更新。这个功能几乎完全是靠声音构建的——我在厨房做饭的时候,对着笔记本聊天就把活儿干完了。
我用的是 ChatGPT 桌面应用,切换到 Codex 标签页,使用语音对话模式,对接本地开发环境。大致是这样的:
我在本地 simonwillisonblog 代码库上启动了这次对话,方式是输入:
Start dev server and open in browser
这让我得到了一个网站预览,它接下来会在这上面工作,也意味着我后面可以让它把新页面展示给我看,从而直观地跟踪它的进度。
然后我点击了"Start new voice chat"按钮——不是那个麦克风按钮,是它右边那个——把笔记本架到厨房里,一边做饭一边跟它说。
我对自己想做什么已经有了一个相当清晰的构想,而且这是一个足够简单的 Django 功能,我有把握模型(这里是 GPT-6 Astra High)完全能搞定它。需要的东西包括:一个新 model、一条 migration、一些 view 代码、模板,还有几个 import 函数用来从外部数据源填充数据库。
下面是我语音转录的一段摘录,由 Codex 捕获:
Um, they do not. Um, this is going to be a new type of content. Um, it's not going to show up... Oh, hold on. Yeah, no- I do not want this to show up in my, um, tag pages and date archive pages and... Actually, no, I think... I don't want it on the tag pages. I don't want it on the, um, blog index page. But I think I do want it to show up on the date-based pages. You know, if you navigate to September the 19th, and I sent a newsletter on that page, I think I want that to show up. So... this is- so I think we probably need a new model. The other thing is that I want them searchable, uh the Substack ones are not searchable, because those are actually just copies of other s- on content on my blog. These monthly ones do contain unique content, and spe- and once they're... published, like once they're made public a month after they've gone out, I want them to show up on my search results.
听起来它理解得足够清楚,知道我要做什么!完整的转录(含所有口吃和停顿)可以看这个 Gist。
我们就这样持续了大约半小时——正好是做一顿饭的时间。模型会回复,偶尔会问一些澄清问题,然后动手修改代码。
我们全程用语音推进了相当长的距离:
一个新的 Django model 和 migration,用来表示导入的 newsletter,并配置了 Django Admin
四个能工作的 import:
/api/v1/archive),然后搜索找到了如何分页,找到了 Karen Spinner 的这篇文章/newsletters/ 和 /newsletters/2026/ 公开存档页面
Newsletter 也会出现在日期归档页面(月度和日度),但不出现在标签页或首页
每周的 Substack newsletter 链接到 Substack;月度存档 newsletter 有自己的独立页面
与站内搜索引擎集成
功能几乎可以上线了。问题出在 import 上:Astra 提议从我本地数据导出,然后导入到生产环境,但我希望它能跟我其他 import 脚本的方式一致。由于部分数据存在一个私有 GitHub 仓库里,这需要创建一个新的 API key,而这件事我知道必须坐在键盘前操作一段时间。
做完饭、确认功能基本完成后,我让 Codex 创建了一个分支并打开 Pull Request。
我在 GitHub PR 界面里审查了代码。它基本符合我的需求,唯一的问题是它选择了用 Git 子进程来处理其中一个 import 脚本。而我需要其中一个 import 从私有 Git 仓库拉取数据,所以我觉得用 API 会更好。我切换到打字,让 Codex 把那个改成基于 API 的 import。
你可以在 PR 的额外提交记录中看到我在审查期间做的修改。我改了 import 机制,并调整了公开页面的一些展示细节。又花了半小时基于打字的提示,才达到可以部署到生产环境的状态——合并那个 PR。
最终效果可以看新的 newsletters 索引页面,或者查看一期过往月度 newsletter 的页面。
索引页面把最近的 Substack 周刊和 GitHub Sponsors 月度 newsletter 混在一起,按时间倒序排列。页面再往下是按年份存档的链接。
GPT-6 Astra 设计了这个页面,然后又根据我在厨房里瞥了一眼本地预览后的语音反馈做了调整。
OpenAI 喜欢在 DevDay 之类的场合用这类语音驱动的演示——而且在那种环境下确实效果不错。但我不认为这会成为我日常使用的主要方式。
我之前写过关于在遛狗时用 ChatGPT 语音模式能做多少"工作"的文章——主要是研究和头脑风暴,偶尔也让 ChatGPT 写代码片段并测试。
这次感觉不一样。视觉预览的加入,加上当我需要传达一些语音难以表达的东西时可以随时用键盘打字或粘贴,使得这是一种与编程 agent 交互的强大得多的方式。
不过一旦涉及到细节,我还是切换回打字。能够粘贴示例和错误信息,或者直接高亮需要修改的代码或功能,这比用语言描述它们效率高得多。
我主要在家工作,这样挺好的——因为在共享办公空间里我可不想这样对着电脑说话!
对我来说杀手级的功能是能够多任务。我平时做饭通常会播播客或者刷 TikTok;现在我实际上可以_build_点东西了。
Claude Haiku 5.5 - 2026 年 10 月 7 日
我们需要在几乎所有地方设置默认的硬预算上限 - 2026 年 10 月 3 日
OpenAI DevDay 2026 实时博客 - 2026 年 9 月 29 日
2026 年的 LLM(截至目前)- 2026 年 9 月 27 日
本文是 Simon Willison 的 A new feature for my blog, built using my voice,发布于 2026 年 10 月 9 日。
属于系列 How I use LLMs and ChatGPT
Two new Showboat tools: Chartroom and datasette-showboat - 2026 年 2 月 17 日凌晨 12:43
Vibe coding SwiftUI apps is a lot of fun - 2026 年 3 月 27 日晚 8:59
Porting the Moebius 0.2B image inpainting model to run in the browser with Claude Code - 2026 年 6 月 22 日晚 11:43
A new feature for my blog, built using my voice - 2026 年 10 月 9 日下午 12:54
上一篇:Claude Haiku 5.5
每月赞助 $10,即可收到当月最重要 LLM 进展的精选邮件摘要。
付钱让我少给你发邮件!