模組四|剪輯管線(Day 17–22)
Day 19 拆完整條組裝鏈,收在一句話:有外部標準當錨的參數不會漂,靠耳朵決定的參數一定會漂。
這一篇講那個漂得最厲害的:背景音樂的音量。
它改了七次,中途還換過一套完全不相容的單位。而這一篇真正想講的不是那七個數字,是它們旁邊的註解。
第一代(線性乘數)
0.012 ← 沿用了六集
0.007
第二代(絕對響度 LUFS)
-30
-33
-36
-40
-45 ← 現在的值
七個值,兩套單位。

volume=0.012 的意思是「把這軌的振幅乘以 0.012」。
準不準還在其次,麻煩的是沒辦法比較。
同一個 0.012,套在一段大聲的音樂上跟一段小聲的音樂上,出來的結果完全不同。所以「0.012 是對的」這句話只在那一首 BGM 上成立。換一首,要重猜。
而且它跟人聲沒有關係。真正該控制的是「BGM 比人聲小多少」,而乘數完全不知道人聲有多大。
第一次調整的理由寫得很直接:
BGM_VOLUME_MAIN = 0.007 # 0.012 太大(使用者回饋),調低背景音樂 bed
「使用者回饋」就是有人跟我說太吵。而我的處理是把數字改小,沒有換掉那個不可比較的度量方式。
換成 LUFS 目標之後,註解變成這樣(原文大意):
BGM_LUFS_MAIN = -40
BGM 目標響度(壓在語音 -16 之下約 24 LU;極低底層感)
*曾試 -30 太大、-33 略大、-36 仍略大,-40 更 subtle;linear 0.012 ≈ -54 太小。
這一行做了三件事:
一、記錄了失敗嘗試:-30、-33、-36 各自為什麼被否決,都寫了(第四筆是舊值換算,下面第三點)。
二、給出相對關係:「壓在語音 -16 之下約 24 LU」。這句話比 -40 這個數字有用得多,因為它是可以移植的。換一首 BGM、換一個人聲響度,這個關係還成立。
三、回頭換算了第一代的值,並且判它太小。
第三點最有意思:它把舊單位換算成新單位,然後推翻了前七集的設定。
0.012 ≈ -54 LUFS,而現在認為 -40 才對。也就是說,前面六集的 BGM 幾乎聽不到。而那六集的參數是「不可比較」的,所以當時根本沒辦法發現這件事。
換單位真正的價值,是它讓過去的決定變得可以被檢驗。
BGM_LUFS = -45 # BGM 壓在語音(-16)之下約 29 LU
# (試聽 -40 仍嫌大聲,再降 5)
這是我在整個 repo 裡看過寫得最完整的一行參數註解。它同時回答了:
如果三個月後我想改這個值,這五件事我全部需要。而如果只寫 -45,我什麼都不知道。
參數的數值只是結論,註解才是推理。而會被重新檢視的是推理,不是結論。
改完之後不是直接上架,有一個很土但有效的驗證:
在成品上取 12 個點,每個點在 30 秒範圍內,找出最安靜的 0.5 秒、量它的 RMS。
目的是量「BGM 的底層」:人聲最安靜的瞬間,BGM 露出來多大聲。
結果:正片穩定落在 -48 到 -57 dB,冷開場 -86 dB(確認 BGM 沒有蓋到開場)。
這個驗收方法值得抄:要驗一個「墊在底下的東西」,就去量最安靜的那些瞬間。平均值會被人聲蓋掉,看不出來。

同一次驗收裡,發現了一個問題:
全片有 9 段、合計 2.73 秒的 BGM 短暫掉底(低於 -70 dB)。
成因判定:多次 mp3 轉檔,在人聲全靜的瞬間把 -50 dB 的底樂量化掉了。
佔比 0.06%,判定聽感不可辨,不修。
這一段是這篇最值得學的部分。值得學的是記錄的完整性,瑕疵本身反而其次:
第 4 點最重要。「不修」是一個決定,而決定要留痕跡。
如果沒寫,未來的我(或任何人)發現這 9 段的時候,會以為是新出的 bug,然後花時間追。而寫下來之後,它從「潛在問題」變成「已知取捨」。
Day 22 會講另一個版本的同樣道理:定案的時候要寫下回退路徑。
還有一條規則值得單獨拉出來:
來賓聲音偏小時,使用原始雙軌重新混音,不直接在成品上硬拉 gain。
權重:主持 1.0 / 來賓 1.4
為什麼不能在成品上拉?因為成品已經混過了,硬拉 gain 等於把混在裡面的底噪、串音、房間音一起拉大。
回到原始雙軌,各自調權重再混,噪音不會被放大。
這條跟 Day 17 那條「重算比修補便宜」是同一個心法的不同版本:回到源頭處理,比在成品上補救乾淨。
而它成立的前提是源頭還在。這也是為什麼原始錄音檔一定要留:它是所有「重來一次」的本錢。
這七次調整全部靠試聽,沒有任何客觀依據。
「-40 仍嫌大聲」是一個主觀判斷,而且是在我自己的耳機上做的。換一副耳機、換一個聽眾,結論可能不一樣。
我沒有做過任何形式的交叉驗證(例如找人在不同裝置上聽),所以 -45 的意思只是「在我的監聽條件下我覺得對」,離「正確的值」還有一段距離。
第二個代價:這七次的成本沒有被記錄。每一次調整都要重跑整條管線、重聽一遍。一集幾分鐘的運算加上幾十分鐘的聆聽,七次至少是好幾個小時,而這件事在 Day 5 那個「AI 省了什麼」的帳裡是隱形的。
第三個:我到現在沒有把 BGM 的響度驗收自動化。那個 12 點取樣是手動跑的,不在管線裡。它應該是輸出之後自動跑、超出範圍就警告,十幾行程式碼的事。
換單位的價值,是讓過去的決定變得可以檢驗。
從線性乘數換成絕對響度,精確度的提升只是順帶。差別在新單位可以回頭換算舊值,然後判斷舊值對不對。
所以當你發現一個參數反覆在調、每次都是憑感覺,先別急著問「正確值是多少」,先問:我現在用的這個度量,能不能跨情境比較?
不能的話,換一個能的,然後把舊值換算過來看看。
第二條:參數的註解要寫推理,不要只寫結論。
一行好的參數註解應該包含:現在的值、相對關係、上一個值、為什麼改。而其中相對關係最有價值:「壓在人聲之下 29 LU」可以移植到任何一集,-45 不行。
第三條,關於決定不修:
「不修」是一個決定,而決定要留下記錄。否則它會被未來的人(包括你自己)當成新出的 bug,然後重新調查一次。
一句「已量化、已判斷、不可辨、不修」,省掉的是未來某個人半天的時間。
明天講這一整章最貴的一次除錯:兩條應該同步的音軌,為什麼對不齊。