我今天为自己的博客上线了一项新功能:通讯简报页面,汇总了我发出的所有通讯简报,包括免费的每周 Substack简报,以及每月仅供赞助者阅读的更新。我几乎完全靠语音完成了这项功能:一边做晚饭,一边对着笔记本电脑聊个不停。
我用 ChatGPT 桌面应用完成了这项工作,在 Codex 标签页中使用语音对话模式,并连接到本地开发环境。界面看起来是这样的:

我先在本地的simonwillisonblog代码库检出目录中启动会话,输入了:
Start dev server and open in browser
这样我就能预览它要处理的网站,之后也可以让它展示新页面,以便直观看到进展。
然后我点击了“开始新的语音聊天”按钮——那不是麦克风按钮,而是它右边的那个——并把笔记本电脑放在厨房里,这样我做饭时就能和它说话。
我大致清楚自己想做什么,而且这是个足够简单的 Django 功能,我确信模型(这里用的是 GPT-6 Astra High)能够完成。需要新增一个模型、一项迁移、一些视图代码、模板,以及几个从外部来源填充数据库的导入函数。
以下是 Codex 捕获的一段语音转录:
嗯,它们不是。嗯,这会是一种新的内容类型。嗯,它不会显示在……哦,等等。对,不——我不想让它显示在我的标签页和日期归档页里,而且……其实不,我想……我不希望它出现在标签页上。我不想让它出现在博客索引页上。不过我想它应该出现在按日期排列的页面上。你知道,如果你点到 9 月 19 日,而我那天发了一期通讯简报,我想它应该显示在那里。所以……这就——我想我们可能需要一个新模型。另一件事是,我希望这些内容可以搜索,呃,Substack 上的那些不能搜索,因为它们其实只是我博客上其他内容的副本。这些月刊确实包含独家内容,而且……一旦发布,也就是发出一个月后公开,我希望它们能出现在搜索结果中。
看来模型很清楚我想做什么!你可以在这个 Gist 中阅读完整转录,包括所有口语停顿和重复,完整内容见此处。
我们就这样聊了大约半小时(正好是做完晚饭所需的时间)。模型会回复,偶尔也会提出澄清问题,然后开始修改代码。
我们几乎全程靠语音就完成了不少工作:
- 在 Django 中新增模型和迁移来表示导入的通讯简报,并配置相应的 Django Admin
- 四种可用的导入方式:
- 通过 RSS 获取最新的 Substack 内容
- 通过 Substack 未公开的 API 获取其余所有内容,GPT-6 Astra 知道这个 API(它直接试了
/api/v1/archive),然后搜索如何对结果分页,并找到了 Karen Spinner 写的这篇文章 - 从我的 GitHub 仓库simonw/monthly-newsletter-archive导入所有已发布的月度通讯简报
- 从私有仓库导入我最新一期仅供赞助者阅读的私人通讯简报
- 公开归档页面 /newsletters/ 和 /newsletters/2026/
- 通讯简报也会显示在按日和按月归档的页面中,但不会出现在标签页或主页上
- 每周 Substack 通讯简报链接到 Substack;已归档的月度通讯简报则有各自的页面
- 接入我的站内搜索引擎
它几乎就可以上线了。问题出在导入上:Astra 提议从我的本地副本导出数据,再把数据导入生产环境,但我希望它能像我其他的导入脚本那样工作。由于部分数据存放在私有 GitHub 仓库中,这就需要创建一个新的 API 密钥,而我知道这事得让我坐到键盘前处理一阵子。
做完饭并认为功能基本完善后,我让 Codex 创建分支并发起了一个拉取请求。
我在 GitHub 的 PR 界面里审查了代码。它基本符合我的需要,只是其中一个导入脚本用了子进程来调用 Git。我需要其中一个导入方式从私有 Git 仓库拉取内容,所以觉得用 API 更合适。我改为打字,让 Codex 把它换成基于 API 的导入方式。
你可以在 PR 的额外提交中看到我审查时做的修改。我修正了导入机制,也调整了几个公开页面的显示方式。之后我又花了半小时用打字提示,才把它改到让我满意的程度,并通过合并 PR 将其部署到生产环境。
你可以在新的通讯简报索引页面查看最终效果,也可以查看之前某期月度通讯简报的页面。

索引页面按时间倒序混排了我最新的 Substack 周刊和 GitHub 赞助者月刊。页面靠下的位置还有按年份划分的归档页面链接。
GPT-6 Astra 设计了这个页面,然后根据我从厨房里瞥看本地预览时给出的语音反馈调整了设计。
OpenAI 很喜欢在 DevDay 这类活动上使用这样的语音演示,而且在那种场合确实效果不错。不过我不认为这会成为我日常使用的方式。
我以前写过,自己遛狗时用手机上的 ChatGPT 语音模式完成了不少“工作”——主要是研究和头脑风暴,偶尔也会让 ChatGPT 编写并试跑代码片段,做一些实际开发。
这次的体验有所不同。加入视觉预览后,我还可以在需要传达无法用语音表达的内容时,通过键盘打字或粘贴内容,这让与编程代理互动的方式强大得多。
不过,一旦深入到具体细节,我还是会切回打字。粘贴示例和错误消息,或者直接选中需要修改的代码或功能,仍然比用语言描述更高效。
我大多数时候在家工作,这很好,因为我可不想在共享办公空间里这样对着电脑说话!
对我来说,最有用的功能是可以同时做多件事。我通常一边做饭一边听播客或刷 TikTok;现在我可以真正动手做点东西了。
标签:文本转语音、人工智能、OpenAI、生成式人工智能、大语言模型、通讯简报、编程代理、Codex、语音转文本、网站升级