A new feature for my blog, built using my voice
https://simonwillison.net/2026/Oct/9/built-using-my-voice/📌 邊做菜邊用語音開發部落格功能
TL;DR:Simon Willison用ChatGPT語音模式邊煮飯邊開發部落格新功能,證明語音也能寫出完整程式碼。
你能邊炒菜邊寫程式嗎?Simon Willison說可以,只要把鍵盤暫時換成嘴巴。
🤔 想幫部落格加一個Newsletters索引頁
Simon Willison想在自己的部落格上新增一個Newsletters頁面,把他每週發送的免費Substack電子報,以及每月限贊助者閱讀的更新,整合成一個時間順序的索引。這本是個不複雜的Django功能,但他決定幾乎全程只靠語音完成。
🧩 用ChatGPT語音模式,邊做飯邊開發
他使用ChatGPT桌面應用程式中的Codex分頁,開啟語音對話模式,連接到本機的開發環境(simonwillisonblog checkout)。流程大致如下:
- 先用鍵盤輸入「Start dev server and open in browser」,啟動本機開發伺服器並在瀏覽器開啟預覽,方便之後用視覺方式追蹤進度。
- 點擊「Start new voice chat」按鈕(不是麥克風按鈕,而是它右邊那個),接著把筆電搬到廚房,邊煮飯邊對話。
- 使用的模型是GPT-6 Astra High。他透過語音說明需求:這是一種新的內容類型,不該出現在標籤頁與部落格首頁,但應該出現在依日期瀏覽的歸檔頁面上;而且由於每月電子報含有獨家內容(不像Substack電子報只是其他文章的複本),一旦公開就必須可被搜尋。
- 對話持續約半小時(正好是煮晚餐的時間),模型會適時提出澄清問題,再動手修改程式碼,包括新增一個model、一筆migration、view程式碼、templates,以及從外部來源匯入資料到資料庫的匯入函式。
到晚餐煮好時,功能幾乎完成,唯一卡住的地方是匯入機制:部分資料存放在私有的GitHub repository,Astra原本打算用在子程序中呼叫git的方式處理匯入,但Simon想改用API金鑰的方式,這就需要坐到鍵盤前建立新的API key。
💡 半小時語音+半小時鍵盤,收尾靠審查
煮完飯後,他讓Codex建立分支並開啟pull request,在GitHub的PR介面審查程式碼。審查後他改回用鍵盤輸入,把原本用git子程序處理的匯入腳本換成API呼叫,並微調了幾處公開頁面的顯示細節——這部分額外花了約半小時以文字提示溝通,才正式將PR合併並部署上線。最終成果是一個把每週Substack電子報與每月贊助者電子報依時間反序混合呈現的索引頁,下方還附有按年份分類的歸檔連結。頁面版型由GPT-6 Astra設計,並根據他隔著廚房看預覽後給出的語音回饋即時調整。
他也坦言這種語音開發方式不會變成他的日常工作模式。相較於過去遛狗時用手機語音模式做研究或腦力激盪,這次因為多了即時視覺預覽、又能隨時切換回鍵盤輸入貼上錯誤訊息或精確指出要改的程式碼片段,整體互動效率明顯更高。對他來說,最大的價值是能夠「一邊做菜一邊真正把東西做出來」,取代平常邊做菜邊看podcast或TikTok的習慣。
⚠️ 細節層級的工作,語音還是比不上打字
他也明確指出,一旦進入細節層面——像是貼上範例、錯誤訊息,或直接標出要修改的程式碼——用文字溝通仍然比用語言描述更有效率;而且這種對著電腦說話的工作方式,也只適合在家這種不會打擾他人的環境進行。
🎯 對工程師的實務啟示
語音驅動的程式碼Agent(例如ChatGPT Codex的語音模式),在你已經清楚知道想做什麼、而雙手正忙著其他事情的場景下,可以是一個實用的輔助工具,尤其搭配即時視覺預覽效果更好;但進入除錯、貼錯誤訊息或精確指定修改範圍的階段,切回鍵盤輸入仍是更有效率的選擇。混合語音與鍵盤的工作流,可能比單純依賴其中一種更實際。
🔗 來源
- 標題:A new feature for my blog, built using my voice
- 作者/機構:Simon Willison
- 連結:https://simonwillison.net/2026/Oct/9/built-using-my-voice/
#AICoding #VoiceInterface #ChatGPT #Codex #Django #DeveloperWorkflow #LLM #AIAssistedDevelopment #OpenAI #CodingAgent
原始資料 Simon Willison · 收集於 2026-10-09
摘要原文
I shipped a new feature for my blog today: the Newsletters page, which offers an index of all of the newsletters I’ve sent out, both my free weekly Substack and my monthly sponsors-only updates. I built the feature almost entirely using my voice, chatting away to my laptop while I cooked dinner. I used the ChatGPT desktop app for this, in the Codex tab, using the voice conversation mode, running against a local development environment. Here’s what that looks like: I started the session against my local simonwillisonblog checkout by typing: Start dev server and open in browser This gave me a preview of the site that it would be working on, and meant that I could later ask it to show me the new pages so I could visually track its progress. Then I clicked the “Start new voice chat” button—that’s not the microphone button, it’s the one to the right of it—and set my laptop up in the kitchen so I could talk to it while I cooked. I had a pretty good idea of what I wanted to build, and it’s a simple enough Django feature that I was certain the model (in this case GPT-6 Astra High) would be able to do it. A new model, a migration, some view code, templates, and a couple of import functions to populate the database from external sources. Here’s an extract of my voice transcript that was captured by 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. Apparently this was clear enough that the model knew what I wanted to build! You can read the full transcript, disfluencies and all, in this Gist . We went on like this for about half an hour (the time it took to cook dinner). The model would reply and occasionally ask clarifying questions, then get to work modifying the code. We got a surprisingly long way entirely by voice: It was almost ready to ship. The catch was the imports: Astra offered to export data from my local copy so I could import that into production, but I wanted it to work like my other import scripts. Since some of the data lived in a private GitHub repository, this would involve creating a new API key, and for that I knew I’d have to sit at the keyboard for a while. Once I had finished cooking and judged it mostly feature-complete, I had Codex create a branch and open a pull request. I reviewed the code in the GitHub PR interface. It was nearly what I needed, except it had chosen to use Git in a subprocess for one of the import scripts. I needed one of the imports to pull from a private Git repository, so I figured the API would be a better bet. I switched to typing and had Codex swap that out for an API-based import instead. You can see the changes I made during the review in the extra commits on the PR . I fixed the import mechanism and made a few tweaks to the display of those public pages. It took an additional half hour of typing-based prompting to get to the point where I was happy to deploy it to production by landing the PR. You can see the end result at the new newsletters index page , or view the page for a previous monthly newsletter . The index page shows my most recent Substack weekly newsletters and GitHub sponsors monthly newsletters mixed together in reverse chronological order. Further down the page are links to my by-year archive pages. GPT-6 Astra designed the page, and then tweaked that design based on my vocal feedback from glancing at the local preview across the kitchen. OpenAI love using voice-driven demos like this one for things like DevDay —and they do work well in that environment. I don’t think this is going to be a daily driver for me though. I’ve written before about how much “work” I get done using ChatGPT voice mode on my phone while walking the dog—mostly research and brainstorming, but occasionally actual development work by having ChatGPT write and test out snippets of code. This feels different. The addition of the visual preview, plus being able to type or paste things in via the keyboard when I need to communicate something that doesn’t work vocally, makes this a much more powerful way of interacting with a coding agent. I still switch back to typing once I get down to the details of things though. Being able to paste in examples and error messages, or directly highlight the code or feature that needs changing, remains more efficient than trying to describe it in words. I mainly work from home, which is good because there’s no way I’d want to talk to my computer like this in a shared workspace! The killer feature for me is the ability to multi-task. I usually cook with a podcast or TikTok running; now I can actually build stuff instead. This is A new feature for my blog, built using my voice by Simon Willison, posted on 9th October 2026 . Part of series How I use LLMs and ChatGPT Sponsor me for $10/month and get a curated email digest of the month's most important LLM developments.
由 claude-code/sonnet 自動生成