Simon Willison ★ 74 3 min

A new feature for my blog, built using my voice

🔗 https://simonwillison.net/2026/Oct/9/built-using-my-voice/

📌 用語音寫程式:Simon Willison 邊煮晚餐邊讓 ChatGPT Codex 生出新功能

TL;DR:語音加本機預覽的混合工作流,能把煮飯時間變成寫程式時間,但精確細節仍得靠打字收尾。

🎣 一邊炒菜一邊口述需求,電腦另一端就把資料庫遷移、View、樣板全部生出來——這不是什麼示範影片,是 Simon Willison 幫自己部落格加新功能時的真實紀錄。

🤔 他早就習慣用語音跟 AI 工作,但這次多了一塊「看得到的畫面」

Simon Willison 先前就常在遛狗時用 ChatGPT 語音模式做研究與腦力激盪,偶爾也讓它寫寫程式碼片段。這次不同的地方在於,他改用 ChatGPT 桌面版的 Codex 分頁,搭配語音對話模式,並且是對著本機開發環境在講話,所以能隨時用瀏覽器看到目前的進度。

🧩 流程:先開本機伺服器,再用語音把需求講給模型聽

  1. 在本機 simonwillisonblog 專案輸入指令,啟動開發伺服器並在瀏覽器開啟預覽。
  2. 點擊「Start new voice chat」(不是麥克風按鈕,是右側的語音對話鍵),把筆電搬進廚房,邊煮飯邊對話。
  3. 用口語描述需求:這是一種新的內容類型(Newsletter),不該出現在標籤頁、日期彙整頁或部落格首頁,但要出現在對應日期的彙整頁;其中月費限定的內容,公開一個月後要能被搜尋到。
  4. 模型(GPT-6 Astra High)理解需求後,陸續生成新的 model、資料庫遷移、view 程式碼、樣板,以及匯入外部資料的函式,過程中偶爾會反問澄清問題。
  5. 整段語音對話持續約半小時,剛好是煮飯的時間,功能幾乎做到可以上線的程度。

💡 語音能帶你走到「幾乎完成」,但匯入邏輯還是得坐下來打字

其中一支匯入腳本的資料來源是私有 GitHub 儲存庫,Astra 原本選擇用 git 在子程序裡處理,但 Simon 認為用 API 金鑰的方式更適合他既有的其他匯入腳本做法,於是切換成打字模式,請 Codex 把這段改成以 API 存取,並新增一支 API 金鑰。最後讓 Codex 建立分支並開 PR,他在 GitHub 的 PR 介面裡 review 程式碼,除了把匯入機制換掉之外,還做了幾處公開頁面顯示上的微調,又花了額外半小時的打字式 prompt 才定案並正式上線部署。他的結論是:這套語音加視覺預覽加打字的混合互動方式,比單純語音模式強大許多,但還不會變成他的日常工作方式——一旦涉及貼錯誤訊息、直接指向某段程式碼這類精確溝通,打字依然比口述更有效率。他也坦言,在共享辦公空間根本不會想這樣對電腦講話,主要是在家工作才可行;對他來說,這個模式最大的價值是能一邊做家事一邊真正產出東西,而不只是聽播客。

🎯 這個案例顯示,語音驅動 coding agent 目前最適合處理「需求釐清」與「大範圍功能骨架搭建」這類模糊度較高、對話式的工作;一旦進入精確除錯、貼錯誤訊息或指定特定程式碼區塊,切回鍵盤仍是更有效率的做法。如果工作環境允許(例如在家工作、需要同時處理其他事情),語音加本機預覽的混合模式值得一試,能把原本「純用耳朵」的空檔時間轉換成實際產出。

🔗 來源

#VoiceCoding #AIAgent #ChatGPT #Codex #DeveloperWorkflow #LLM #AIAssistant #Django #CodingAgent #AIProductivity

原始資料 Simon Willison · 收集於 2026-10-17
來源原標題
A new feature for my blog, built using my voice
作者
Simon Willison
原始標籤
blog
原始連結
https://simonwillison.net/2026/Oct/9/built-using-my-voice/

摘要原文

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 Next: Hello Python 3.15, goodbye 3.10, and now I can use 3.11 Sponsor me for $10/month and get a curated email digest of the month's most important LLM developments.

由 claude-code/sonnet 自動生成