返回日报条目

资料节译

边做晚饭边用语音为博客制作 newsletter 功能

阅读原文

我今天为自己的博客上线了一项新功能:通讯简报页面,汇总了我发出的所有通讯简报,包括免费的每周 Substack简报,以及每月仅供赞助者阅读的更新。我几乎完全靠语音完成了这项功能:一边做晚饭,一边对着笔记本电脑聊个不停。

我用 ChatGPT 桌面应用完成了这项工作,在 Codex 标签页中使用语音对话模式,并连接到本地开发环境。界面看起来是这样的:

Three columns of the ChatGPT app. The left hand column shows my recent conversations. The middle column is a transcript of the conversation, with a throbbing black blob representing voice mode. The right hand column shows a local dev server version of my blog, with the Newsletters page visible.

我先在本地的simonwillisonblog代码库检出目录中启动会话,输入了:

Start dev server and open in browser

这样我就能预览它要处理的网站,之后也可以让它展示新页面,以便直观看到进展。

然后我点击了“开始新的语音聊天”按钮——那不是麦克风按钮,而是它右边的那个——并把笔记本电脑放在厨房里,这样我做饭时就能和它说话。

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

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

嗯,它们不是。嗯,这会是一种新的内容类型。嗯,它不会显示在……哦,等等。对,不——我不想让它显示在我的标签页和日期归档页里,而且……其实不,我想……我不希望它出现在标签页上。我不想让它出现在博客索引页上。不过我想它应该出现在按日期排列的页面上。你知道,如果你点到 9 月 19 日,而我那天发了一期通讯简报,我想它应该显示在那里。所以……这就——我想我们可能需要一个新模型。另一件事是,我希望这些内容可以搜索,呃,Substack 上的那些不能搜索,因为它们其实只是我博客上其他内容的副本。这些月刊确实包含独家内容,而且……一旦发布,也就是发出一个月后公开,我希望它们能出现在搜索结果中。

看来模型很清楚我想做什么!你可以在这个 Gist 中阅读完整转录,包括所有口语停顿和重复,完整内容见此处。

我们就这样聊了大约半小时(正好是做完晚饭所需的时间)。模型会回复,偶尔也会提出澄清问题,然后开始修改代码。

我们几乎全程靠语音就完成了不少工作:

它几乎就可以上线了。问题出在导入上:Astra 提议从我的本地副本导出数据,再把数据导入生产环境,但我希望它能像我其他的导入脚本那样工作。由于部分数据存放在私有 GitHub 仓库中,这就需要创建一个新的 API 密钥,而我知道这事得让我坐到键盘前处理一阵子。

做完饭并认为功能基本完善后,我让 Codex 创建分支并发起了一个拉取请求。

我在 GitHub 的 PR 界面里审查了代码。它基本符合我的需要,只是其中一个导入脚本用了子进程来调用 Git。我需要其中一个导入方式从私有 Git 仓库拉取内容,所以觉得用 API 更合适。我改为打字,让 Codex 把它换成基于 API 的导入方式。

你可以在 PR 的额外提交中看到我审查时做的修改。我修正了导入机制,也调整了几个公开页面的显示方式。之后我又花了半小时用打字提示,才把它改到让我满意的程度,并通过合并 PR 将其部署到生产环境。

你可以在新的通讯简报索引页面查看最终效果,也可以查看之前某期月度通讯简报的页面。

Newsletters page. It shows two Substack posts (with thumbnails) and one LLM digest Sponsors-only newsletter with a list of headings. On the right is a CTA to subscribe to my Substack and another one for my $10/month monthly briefing newsletter.

索引页面按时间倒序混排了我最新的 Substack 周刊和 GitHub 赞助者月刊。页面靠下的位置还有按年份划分的归档页面链接。

GPT-6 Astra 设计了这个页面,然后根据我从厨房里瞥看本地预览时给出的语音反馈调整了设计。

OpenAI 很喜欢在 DevDay 这类活动上使用这样的语音演示,而且在那种场合确实效果不错。不过我不认为这会成为我日常使用的方式。

我以前写过,自己遛狗时用手机上的 ChatGPT 语音模式完成了不少“工作”——主要是研究和头脑风暴,偶尔也会让 ChatGPT 编写并试跑代码片段,做一些实际开发。

这次的体验有所不同。加入视觉预览后,我还可以在需要传达无法用语音表达的内容时,通过键盘打字或粘贴内容,这让与编程代理互动的方式强大得多。

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

我大多数时候在家工作,这很好,因为我可不想在共享办公空间里这样对着电脑说话!

对我来说,最有用的功能是可以同时做多件事。我通常一边做饭一边听播客或刷 TikTok;现在我可以真正动手做点东西了。

标签:文本转语音、人工智能、OpenAI、生成式人工智能、大语言模型、通讯简报、编程代理、Codex、语音转文本、网站升级