---
title: "边做晚饭边用语音为博客制作 newsletter 功能"
canonical: "https://siyuanailab.com/curation/translations/a9d67c4f5c4e4111db03beda386a3a99-434a2002b25d8363ee5e4063da8731b2235957f3bc0b6f39275db5c9be6e7fd5/"
dateModified: "2026-10-10"
datePublished: "2026-10-10"
---

[返回日报条目](https://siyuanailab.com/curation/#entry/a9d67c4f5c4e4111db03beda386a3a99)

 

资料节译

 

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

 

[阅读原文](https://simonwillison.net/2026/Oct/9/built-using-my-voice/)

 

现有资料无法确认原文完整，本页只翻译已取得的材料。

 

现有原件无法确认图片是否齐全。

 

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

 

我用 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.](/curation/media/769d2989d03d3644d3bf3e7309957857d98963a1c77913e0ca7d72fc9663a4f4.webp)

 

我先在本地的[simonwillisonblog](https://github.com/simonw/simonwillisonblog)代码库检出目录中启动会话，输入了：

 

`Start dev server and open in browser`

 

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

 

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

 

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

 

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

 

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

 

看来模型很清楚我想做什么！你可以在这个 Gist 中阅读完整转录，[包括](https://en.wikipedia.org/wiki/Speech_disfluency)所有口语停顿和重复，[完整内容见此处](https://gist.github.com/simonw/a65a22204f6f7228cc59b4bc34d7c7c8)。

 

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

 

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

 

- 在 Django 中新增模型和迁移来表示导入的通讯简报，并配置相应的 Django Admin
 
- 四种可用的导入方式： 

- 通过 RSS 获取最新的 Substack 内容
 
- 通过 Substack 未公开的 API 获取其余所有内容，GPT-6 Astra 知道这个 API（它直接试了`/api/v1/archive`），然后搜索如何对结果分页，并找到了 Karen Spinner 写的[这篇文章](https://wonderingaboutai.substack.com/p/i-connected-my-newsletter-archive)
 
- 从我的 GitHub 仓库[simonw/monthly-newsletter-archive](https://github.com/simonw/monthly-newsletter-archive)导入所有已发布的月度通讯简报
 
- 从私有仓库导入我最新一期仅供赞助者阅读的私人通讯简报
 
- 公开归档页面 [/newsletters/](https://simonwillison.net/newsletters/) 和 [/newsletters/2026/](https://simonwillison.net/newsletters/2026/)
 
- 通讯简报也会显示在按日和按月归档的页面中，但不会出现在标签页或主页上
 
- 每周 Substack 通讯简报链接到 Substack；已归档的月度通讯简报则有各自的页面
 
- 接入我的站内搜索引擎

 

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

 

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

 

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

 

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

 

你可以在新的[通讯简报索引页面](https://simonwillison.net/newsletters/)查看最终效果，也可以查看[之前某期月度通讯简报的页面](https://simonwillison.net/newsletters/monthly-2026-08-august/)。

 

![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.](/curation/media/47617728491451136df180f17ab9b0fd5f4b3af1b5b45d806099ea1f52047410.webp)

 

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

 

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

 

OpenAI 很喜欢在 DevDay 这类[活动](https://simonwillison.net/2026/Sep/29/openai-devday-2026-live-blog/#live-update-504)上使用这样的语音演示，而且在那种场合确实效果不错。不过我不认为这会成为我日常使用的方式。

 

我[以前写过](https://simonwillison.net/search/?q=walking+dog)，自己遛狗时用手机上的 ChatGPT 语音模式完成了不少“工作”——主要是研究和头脑风暴，偶尔也会让 ChatGPT 编写并试跑代码片段，做一些实际开发。

 

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

 

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

 

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

 

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

 

标签：[文本转语音](https://simonwillison.net/tags/text-to-speech)、[人工智能](https://simonwillison.net/tags/ai)、[OpenAI](https://simonwillison.net/tags/openai)、[生成式人工智能](https://simonwillison.net/tags/generative-ai)、[大语言模型](https://simonwillison.net/tags/llms)、[通讯简报](https://simonwillison.net/tags/newsletter)、[编程代理](https://simonwillison.net/tags/coding-agents)、[Codex](https://simonwillison.net/tags/codex)、[语音转文本](https://simonwillison.net/tags/speech-to-text)、[网站升级](https://simonwillison.net/tags/site-upgrades)

 

AI 翻译；具体表述请与原文对照。
