跳至主要內容

風味 · Essay

你煮飯的時候,耳朵在喫什麼?

讓 Windows 聲音無線飛進 HomePod 的串流工具 WinAirCast,我們把它端進廚房,聊聊做飯聽聲音的老傳統、聲畫同步的半秒學問,還有把房間當竈的調音法。

美食生活編輯部 ·
你煮飯的時候,耳朵在喫什麼?

先別急著答。回想昨天晚上就好:水滾了,麵下鍋,排油煙機轟隆隆拉到最強,你把手機斜靠在醬油瓶旁邊,追到一半的影集繼續播。演員的嘴動了,聲音卻慢了半拍才跟上,混進機器的轟鳴裡糊成一團。你把音量推到頂,人聲還是被喫掉大半,隔壁房間先傳來敲牆聲。

八月下旬,開發者 isayyeah 在少數派 Matrix 發表了一套 Windows 音訊串流軟體 WinAirCast,用 Rust 語言從零重寫底層協定,讓電腦的聲音能以原生 AirPlay 2 的方式,無線送進 HomePod 這類音箱。這篇是開發者自己寫的介紹文,本來寫給桌面音響玩家看,但我讀著讀著,滿腦子都是流理臺。

因為廚房,大概是一個家裡聲音最辛苦的房間。排油煙機、水聲、油炸聲、壓力鍋的洩氣閥,輪番上陣,任何聲音進了廚房,都要先被打掉三成元氣。

聲音是廚房裡隱形的那道菜

我阿嬤那輩的竈腳,牆上一定掛一臺收音機。中午十二點,歌仔戲的鑼鼓點一起,菜刀的節奏就跟著換拍子。切蔥花配胡琴,起油鍋配哭調,電臺主持人連珠砲的賣藥口白,是那個年代配飯的白噪音。竈腳裡沒有螢幕,聲音就是唯一配菜。

這個傳統其實沒斷過,載體一路換。香港茶餐廳吊在高處的電視、麵攤櫃檯下的收音機、日本喫茶店的老爵士,都在做同一件事:替一頓飯配音。從呷飯配電視到今天的下飯影片,我們先前聊過跟著網友重看老片配宵夜的懷舊潮,那個「配」字比任何一道菜都耐放。聲音也會入味,同一家麵攤,有電臺聲的下午和安靜的深夜,喫起來是兩碗麵。

差別在於,從前的聲音願意待在廚房裡等菜,現在的廚房太吵,聲音得自己想辦法站上第一線。手機小喇叭先天就薄,人聲一遇到機器轟鳴就沉下去。藍牙喇叭好一些,但人總得把手機端著走,湯滾了你離爐子兩步,聲音就斷在原地。把聲音送進一組放在流理臺附近、正經有份量的音箱,是讓聲音跟得上火候的第一步。

問題來了,電腦裡的聲音,怎麼過去?

半秒的遲到,足夠毀掉一碗麵

先說這半秒有多致命。人的眼睛和耳朵對「對不上」異常敏感。演員嘴型動了,聲音晚半拍才到,你說不上來哪裡怪,就是渾身不對勁。像一碗端上桌的湯麵,湯還燙著,麵已經涼了,溫度對不起來,整碗就不成立。

學做菜的人更是首當其衝。食譜影片裡,橄欖油下蒜片那一聲滋啦,師傅說「聽這個聲音就知道好了」的瞬間,聲音要是晚半拍,這堂課就白上了。廚房裡判斷火候,一半靠耳朵,延遲的聲音等於遲到的老師。

Windows 一直不原生支援 AirPlay,想讓電腦聲音飛進 HomePod,多半得靠第三方軟體,而老牌工具的毛病大家都踩過。

老牌音訊串流軟體的三個常見問題:延遲高導致聲畫對不上、停止維護在 Windows 11 上容易閃退甚至出現核心層錯誤、以及接不上 AirPlay 2 世代的新設備

像 TuneBlade 已經停止維護多年,在 Windows 11 上跑起來容易閃退,甚至鬧出核心層的錯誤;AirParrot 這類工具受限於舊式緩衝機制,延遲壓不下來。至於採用新同步機制的 AirPlay 2 設備,舊軟體連線成功率低,也沒辦法把幾臺音箱組成真正的立體聲。

WinAirCast 的做法是把地基重挖。協定堆疊用 Rust 重寫,原生生支援 AirPlay 2,也向下相容 AirPlay 1 的 RAOP 老協定,家裡那臺古早的 AirPort Express 都還認得。AirPlay 2 用的是 PTP 精確時間協定,WinAirCast 把時鐘同步做到微秒級;區域網路條件夠好時,開啟即時串流模式,延遲能壓到 45 毫秒上下。45 毫秒比一次眨眼還短,影集裡的人開口,聲音幾乎同一瞬間從音箱出來,鍋鏟聲再大,嘴型也對得上。

WinAirCast 開啟即時串流模式後,延遲可壓到約 45 毫秒,比一次眨眼還短,看影片時聲音幾乎與嘴型同步
網路條件良好時的極限值

聲音的規格也給得大方。標準的 ALAC 無損壓縮之外,還開放 PCM 未壓縮模式,跳過編解碼的損耗,細節留得完整。底層排程掛上 Windows 的 MMCSS Pro Audio 服務,把推流執行緒的優先權拉到最高,就算背景在跑滿載的渲染工作,聲音也不容易爆音卡頓。這道理進過廚房的人都懂,大火快炒那幾十秒,最怕有人來開冰箱。

從廚房唱到客廳,歌不能斷

再來是我私心最喜歡的部分:多房間同步。湯還在燉,你走到客廳收快遞、擺碗筷,歌要跟著人走,不能斷。小時候家裡辦桌,音響是搬著走的,主桌唱到副桌,中間總有幾拍空拍,那幾拍安靜得格外明顯。AirPlay 2 的分組播放讓廚房一組、客廳一組,靠微秒級的對時,兩邊唱的是同一個當下。這件事辦桌師傅最有感,兩桌的湯要同時上,一桌滾燙一桌溫吞,場面就砸了。聲音的多房間同步,就是聲音版的同時上菜。

家裡有兩臺 HomePod 的,還能組成真正的立體聲組。左右聲道各自就位,人在中島切菜,歌的舞臺就架在流理臺正前方,泡在湯鍋的蒸氣裡也不散。

房間是竈,均衡器是鹽罐

再好的音箱,進了不同房間都會變味。磁磚反射多,聲音發硬;窗簾沙發吸音多,聲音發悶。這跟做菜同一個道理,同一份食譜,每口竈火力不同,每口鍋脾氣不同,鹽就得跟著挪。HomePod 的預設調音,是蘋果替「平均房間」抓的,你家廚房當然不是統計上的平均房間。排油煙機一開,低頻轟鳴會喫掉多少人聲,煮過飯的都知道。

WinAirCast 內建十段圖形均衡器加前級增益控制,DSP 端做了防削波處理,可以照房間的脾氣一格一格修。修好的參數存成預設,廚房一組、客廳一組,一鍵切換。這根本是聲音版的配方卡,阿嬤那本用鉛筆記著「鹽少半匙」的簿子,換了個數位身分。主畫面則把網路上所有 AirPlay 接收器列成一張設備清單,連線狀態、編碼格式、即時延遲、各自的音量滑桿一次看盡,點一下就把聲音推過去,像跟熟悉的老闆點菜一樣直接。

以廚房調味比喻圖形均衡器的主張:每個房間的聲學脾氣不同,如同每口竈火力各異,用十段均衡器逐頻段調整聲音,調好的參數存成預設,就能在廚房與客廳之間一鍵切換

只端那一道菜

還有一個功能,設計得很有分菜的教養:單應用隔離。它不必把整臺電腦的聲音都倒出去,你可以只把想聽的那一道送進音箱。遊戲的槍聲、通訊軟體的提示音、突然跳出來的廣告,都留在電腦裡,不會從客廳的音箱嚇你一跳。對有版權保護的內容,軟體也留了對應的播放路徑。

這門功課,深夜下廚的人最懂。聲音有了自己的去處,你就能用剛好的音量聽清楚,不必再跟鄰居的睡眠談判。我們先前寫過深夜爐火練習低調的那堂睦鄰課,鍋鏟、油煙、燈光都要收著,現在連聲音也有了收的方式。

這週就能上桌的聲音提案

把這套工具翻譯成幾個廚房裡立刻能用的靈感。

配節奏。快炒配快歌,燉湯配長訪談或單口。手上的菜刀會跟上 BPM,切蔥花的粗細,有時候就是被節奏帶出來的。

立濕手規矩。手上有油有水的時候,別去碰鍵盤。WinAirCast 的懸浮小窗能釘在桌面角落,調音量、看連線、斷開接回都是一個按鈕的事;停靠欄平時貼著螢幕邊緣收著,滑鼠靠過去才展開,擦乾手點一下就好。

讓老音箱回鍋。翻翻儲物櫃,那臺被遺忘的 AirPort Express 還能被認出來,接一對舊喇叭,書房就多開一間分店。老陶鍋回鍋得先煮一鍋粥養鍋,老音箱回鍋簡單多了,通電就醒。

耳朵挑的話,選編碼。網路穩的日子開 PCM 未壓縮,圖個產地直送;平常開 ALAC 無損,也已經夠體面。

回到開場那碗麵。水滾,下麵,這回聲音從流理臺那端的音箱出來,人聲清楚,嘴型對得上,鑼鼓點正好落在菜刀的節奏裡。三分鐘後麵起鍋,影集也剛好播進下一章。

耳朵這道菜,平常沒人點它。要等它遲到半秒,你才會發現,它其實一直在席上。