阿凱正在測試讓病人可以直接用講話完成掛號、改期的語音助理
GPT-Live 是 OpenAI 目前用在 ChatGPT Voice 裡的第三代語音 AI 系統,最大的賣點很簡單:講話不用等對方講完,AI 可以像真人一樣邊聽邊回應。以前的語音助理靠一個叫輪次偵測器(turn detector)一個小模型,專門用來猜「使用者講完了沒」,猜太早使用者會被打斷,猜太晚回應就會卡頓的小模型,先判斷「你講完了沒」,才准許後面的大腦模型開始工作。GPT-Live 直接把這個「猜測」步驟從語音處理的路徑裡拿掉,改用全雙工(full-duplex)模型可以同時聆聽輸入的聲音、同時產生輸出的聲音,不用像對講機一樣一次只能一人說話的語音模型,讓聆聽和回應這兩件事同時發生。
要理解這個改變多重要,得先看舊架構怎麼運作。最早的語音助理是串接式(cascaded)架構把語音辨識、語言模型、語音合成三套獨立系統,像接力賽一樣一棒接一棒依序執行:先用語音轉文字(Speech-to-Text,STT)把你講的聲音轉換成文字,AI 的語言模型才看得懂把你的話變成文字,再交給語言模型想回覆,最後用文字轉語音(Text-to-Speech,TTS)把 AI 想講的文字內容,轉換成聽得到的語音把回覆念出來。這三棒依序執行,每一棒都要等上一棒做完,語氣、語速這些細節也在轉文字的過程中流失掉了。後來出現的語音到語音模型直接處理聲音,保留了這些細節、反應也變快,但骨子裡仍然靠輪次偵測器決定「什麼時候可以開始想」。
GPT-Live 的作法是把「決定何時該誰講話」這件事直接交給全雙工的語音模型本身去處理,不再需要另外一個小模型來猜。遇到需要深度思考或操作工具的複雜問題時,GPT-Live 會用非同步(asynchronous)不需要等前一件事情做完,可以同時去做另一件事,等做好了再回報結果的方式,把問題丟給像 GPT-5.5 這樣更強的大腦模型處理,同時自己繼續維持對話不中斷。為了讓這一切順暢運作,OpenAI 花了六個月重寫了模型推論(inference)AI 模型根據輸入資料進行運算、產生輸出結果的過程、上下文管理(context management)讓語音模型記住這段對話前面講過什麼內容的機制和媒體傳輸,目標就是把整段對話的延遲(latency)從使用者講完話到 AI 開始回應之間,中間等待的時間壓到最低。
| 架構世代 | 怎麼判斷該誰講話 | 對話體感 |
|---|---|---|
| 第一代:串接式(STT→LLM→TTS) | 三套系統依序接力,全部做完才輪到下一棒,且完全忽略語氣語速 | 延遲明顯,像通話品質差的越洋電話 |
| 第二代:語音到語音,但仍有輪次偵測器 | 直接處理聲音、保留語氣細節,但仍要等小模型猜你講完了沒 | 比第一代快,但還是會搶話或慢半拍 |
| 第三代:GPT-Live 全雙工 | 沒有偵測器,模型本身邊聽邊想邊說 | 接近真人對話的即時感 |
這段 pseudocode 對比「舊架構」跟「GPT-Live」在處理一段語音對話時,程式邏輯上的關鍵差異——重點不是語法,而是「誰在等誰」。
# 舊架構:靠「輪次偵測器」決定何時開始想def old_voice_loop(audio_stream): while True: chunk = audio_stream.read() buffer.append(chunk) if turn_detector.guess_user_finished(buffer): text = speech_to_text(buffer) reply_text = llm.generate(text) speech = text_to_speech(reply_text) play(speech) buffer.clear()# GPT-Live:全雙工,邊聽邊想邊說,沒有「猜你講完了沒」這關def gpt_live_loop(audio_in, audio_out): for chunk in audio_in: voice_model.feed(chunk) if voice_model.wants_to_speak(): for out_chunk in voice_model.stream_reply(): audio_out.write(out_chunk) if voice_model.needs_deep_reasoning(): asyncio.create_task(ask_frontier_model(voice_model.context))