Home / Newsletters / Featured / 我的博客新功能:用语音打造

我的博客新功能:用语音打造

Simon WillisonSimon Willison’s WeblogOctober 9, 2026View original
AICodexcoding-agentsvoice
  • Simon Willison 为他的博客发布了一个新的 Newsletters 索引页面,几乎完全通过 ChatGPT 桌面应用 Codex 语音模式与 GPT-6 Astra High 进行语音对话完成,针对本地 Django 开发环境。
  • 语音会话持续了大约做一顿晚饭的时间(约 30 分钟),产出了新的 Django 模型和迁移、Django Admin 配置、四个可用的导入脚本(Substack RSS、Substack 未公开 API、公开的月度 newsletter GitHub 仓库、私有的赞助者专属仓库)、公开归档页面、与日期/月份归档和站点搜索的集成,以及基于语音反馈的设计调整。
  • 语音会话后功能几乎可以发布,但导入机制需要调整:Astra 在一个导入脚本中使用了子进程调用 Git,Willison 在 GitHub PR 上进行键入式代码审查时将其替换为基于 API 的导入,又花了半小时。
  • Willison 总结认为,带有视觉预览的语音驱动编码在多任务处理(如做饭)方面很强大,比手机语音模式能力更强,但不是日常主力;他仍会在细节、粘贴示例和突出代码时切换回键入,并指出它不适合共享工作空间。

我的博客新功能:全程用语音打造

2026年10月9日

今天我为博客上线了一个新功能:Newsletters 页面,它汇总了我发出的所有通讯,既包括免费的每周 Substack,也包括每月仅限赞助者的更新。这个功能几乎完全是我用语音完成的——我一边做晚饭,一边对着笔记本电脑说话。

Codex 语音模式

我使用的是 ChatGPT 桌面应用,在 Codex 标签页中开启语音对话模式,连接本地开发环境运行。界面大致是这样的:

我在本地的 simonwillisonblog 检出目录上启动了会话,输入的是:

Start dev server and open in browser

这样我就得到了它将要在其上工作的站点预览,也意味着之后我可以让它展示新页面,以便直观地跟踪进展。

然后我点击了“Start new voice chat”按钮——不是麦克风按钮,而是它右边那个——并把笔记本电脑架在厨房里,这样我做饭时也能和它对话。

和我的电脑说话

我很清楚自己想要构建什么,而且这是一个足够简单的 Django 功能,我确信模型(这次是 GPT-6 Astra High)能够完成。需要一个新的模型、一次迁移、一些视图代码、模板,以及几个从外部来源填充数据库的导入函数。

以下是 Codex 捕获的我的语音转录片段:

嗯,它们不会。嗯,这会是一种新的内容类型。嗯,它不会显示……哦,等等。对,不——我不希望它出现在我的,嗯,标签页和日期归档页面上……其实,不,我想……我不希望它出现在标签页上。我不希望它出现在,嗯,博客索引页上。但我想我确实希望它出现在基于日期的页面上。你知道,如果你导航到 9 月 19 日,而我在那天发了一份通讯,我希望它能显示出来。所以……这——所以我想我们可能需要一个新模型。另外,我希望它们可被搜索,呃,Substack 的那些不可搜索,因为它们实际上只是我博客上其他内容的副本。这些每月通讯确实包含独特内容,而且一旦它们……发布,比如在发出一个月后公开,我希望它们出现在我的搜索结果中。

显然这已经足够清楚,模型知道我想构建什么了!你可以在这个 Gist 中阅读完整转录,包括所有不流畅之处。

我们就这样进行了大约半小时(正好是做晚饭的时间)。模型会回复,偶尔问一些澄清问题,然后就开始修改代码。

我们构建了什么

完全靠语音,我们竟然推进得相当远:

  • 在 Django 中表示导入通讯的新模型和迁移,以及相应的 Django Admin 配置
  • 四个可用的导入:
    • 通过 RSS 导入最近的 Substack 条目
    • 通过它们未公开的 API 导入所有其他 Substack 条目——GPT-6 Astra 知道这个 API(它直接尝试了 /api/v1/archive),然后运行搜索来弄清楚如何分页,并找到了 Karen Spinner 的这篇文章
    • 从我的 simonw/monthly-newsletter-archive GitHub 仓库导入所有已发布的每月通讯
    • 从私有仓库导入我最近的私密仅限赞助者通讯
  • /newsletters/ 和 /newsletters/2026/ 公开归档页面
  • 通讯也会出现在日和月归档页面上,但不出现在标签页或我的主页上
  • 每周 Substack 通讯链接到 Substack;归档的每月通讯有自己的页面
  • 与我的站点搜索引擎集成

它几乎可以上线了。问题出在导入上:Astra 提出从我本地副本导出数据,以便我导入到生产环境,但我希望它像我其他导入脚本一样工作。由于部分数据存放在私有 GitHub 仓库中,这需要创建一个新的 API 密钥,而为此我知道自己得在键盘前坐上一会儿。

通过审查来完成

等我做完饭,并判断它基本功能完整后,我让 Codex 创建了一个分支并打开了一个 pull request。

我在 GitHub PR 界面中审查了代码。它几乎就是我需要的,只是其中一个导入脚本选择了在子进程中使用 Git。我需要其中一个导入从私有 Git 仓库拉取,所以我认为用 API 会更合适。我切换到打字,让 Codex 把它换成基于 API 的导入。

你可以在 PR 上的额外提交中看到我在审查期间所做的更改。我修复了导入机制,并对那些公开页面的显示做了一些调整。又花了半小时基于打字的提示,才达到我满意并可以通过合并 PR 将其部署到生产环境的状态。

最终结果

你可以在新的通讯索引页面看到最终结果,或者查看之前某份每月通讯的页面。

索引页面将我最新的 Substack 每周通讯和 GitHub 赞助者每月通讯按时间倒序混合展示。页面下方是按年份归档页面的链接。

GPT-6 Astra 设计了页面,然后根据我隔着厨房瞥一眼本地预览后给出的语音反馈调整了设计。

更适合多任务处理,而非日常主力

OpenAI 非常喜欢在像 DevDay 这样的场合使用这种语音驱动的演示——它们在那样的环境中确实效果很好。不过我不认为这会成为我的日常主力。

我之前写过,在遛狗时用手机上的 ChatGPT 语音模式能完成多少“工作”——主要是研究和头脑风暴,但偶尔也会通过让 ChatGPT 编写和测试代码片段来做实际的开发工作。

这次感觉不同。视觉预览的加入,加上在需要传达不适合语音的内容时可以通过键盘输入或粘贴,使这成为与编码代理交互的一种强大得多的方式。

不过,一旦深入到具体细节,我还是会切回打字。能直接粘贴示例和错误信息,或者直接高亮需要修改的代码或功能,仍然比用语言描述更高效。

我主要在家工作,这很好,因为在共享办公空间里,我绝对不想这样对着电脑说话!

对我来说,最杀手级的功能是能同时处理多项任务。我平时做饭时会开着播客或 TikTok;现在我真的可以顺便搭建东西了。

这是 A new feature for my blog, built using my voice,作者 Simon Willison,发布于 2026年10月9日。

属于系列 How I use LLMs and ChatGPT

  1. Two new Showboat tools: Chartroom and datasette-showboat - 2026年2月17日 凌晨12:43
  2. Vibe coding SwiftUI apps is a lot of fun - 2026年3月27日 晚上8:59
  3. Porting the Moebius 0.2B image inpainting model to run in the browser with Claude Code - 2026年6月22日 晚上11:43
  4. A new feature for my blog, built using my voice - 2026年10月9日 中午12:54
  5. Battle Drones - a vibe coded RTS with audio-based multiplayer - 2026年10月20日 晚上7:34

⠀
下一篇: Hello Python 3.15, goodbye 3.10, and now I can use 3.11

上一篇: Claude Haiku 5.5

每月简报

以 每月10美元 赞助我,即可获得一份精选的当月最重要 LLM 发展动态邮件摘要。

付钱让我少给你发东西!

赞助并订阅

A new feature for my blog, built using my voice