iT邦幫忙

2026 iThome 鐵人賽

DAY 20
0
AI 自動化

我以為我保留了五道閘門系列 第 20

Day 20|「試聽還是嫌大聲,再降 5」

  • 分享至 

  • xImage
  •  

模組四|剪輯管線(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)
  • 相對關係是什麼(人聲之下 29 LU)
  • 上一個值是多少(-40)
  • 為什麼改(試聽仍嫌大聲)
  • 誰決定的、什麼時候(原註解裡有)

如果三個月後我想改這個值,這五件事我全部需要。而如果只寫 -45,我什麼都不知道。

參數的數值只是結論,註解才是推理。而會被重新檢視的是推理,不是結論。

驗收:12 點取樣

改完之後不是直接上架,有一個很土但有效的驗證:

在成品上取 12 個點,每個點在 30 秒範圍內,找出最安靜的 0.5 秒、量它的 RMS。

目的是量「BGM 的底層」:人聲最安靜的瞬間,BGM 露出來多大聲。

結果:正片穩定落在 -48 到 -57 dB,冷開場 -86 dB(確認 BGM 沒有蓋到開場)。

這個驗收方法值得抄:要驗一個「墊在底下的東西」,就去量最安靜的那些瞬間。平均值會被人聲蓋掉,看不出來。

一個被記錄下來、但決定不修的瑕疵

我沒去補地上那道細縫,而是蹲下來在旁邊蓋一個章

同一次驗收裡,發現了一個問題:

全片有 9 段、合計 2.73 秒的 BGM 短暫掉底(低於 -70 dB)。
成因判定:多次 mp3 轉檔,在人聲全靜的瞬間把 -50 dB 的底樂量化掉了。
佔比 0.06%,判定聽感不可辨,不修。

這一段是這篇最值得學的部分。值得學的是記錄的完整性,瑕疵本身反而其次:

  1. 量化了(9 段、2.73 秒、0.06%)
  2. 找到成因了(多次編碼的量化誤差,正是 Day 19 那個「每段獨立寫中間檔」的代價)
  3. 做了判斷(不可辨)
  4. 決定不修,並寫下來

第 4 點最重要。「不修」是一個決定,而決定要留痕跡。

如果沒寫,未來的我(或任何人)發現這 9 段的時候,會以為是新出的 bug,然後花時間追。而寫下來之後,它從「潛在問題」變成「已知取捨」。

Day 22 會講另一個版本的同樣道理:定案的時候要寫下回退路徑。

混音的一條鐵律

還有一條規則值得單獨拉出來:

來賓聲音偏小時,使用原始雙軌重新混音,不直接在成品上硬拉 gain。
權重:主持 1.0 / 來賓 1.4

為什麼不能在成品上拉?因為成品已經混過了,硬拉 gain 等於把混在裡面的底噪、串音、房間音一起拉大。

回到原始雙軌,各自調權重再混,噪音不會被放大。

這條跟 Day 17 那條「重算比修補便宜」是同一個心法的不同版本:回到源頭處理,比在成品上補救乾淨。

而它成立的前提是源頭還在。這也是為什麼原始錄音檔一定要留:它是所有「重來一次」的本錢。

代價

這七次調整全部靠試聽,沒有任何客觀依據。

「-40 仍嫌大聲」是一個主觀判斷,而且是在我自己的耳機上做的。換一副耳機、換一個聽眾,結論可能不一樣。

我沒有做過任何形式的交叉驗證(例如找人在不同裝置上聽),所以 -45 的意思只是「在我的監聽條件下我覺得對」,離「正確的值」還有一段距離。

第二個代價:這七次的成本沒有被記錄。每一次調整都要重跑整條管線、重聽一遍。一集幾分鐘的運算加上幾十分鐘的聆聽,七次至少是好幾個小時,而這件事在 Day 5 那個「AI 省了什麼」的帳裡是隱形的。

第三個:我到現在沒有把 BGM 的響度驗收自動化。那個 12 點取樣是手動跑的,不在管線裡。它應該是輸出之後自動跑、超出範圍就警告,十幾行程式碼的事。

帶走什麼

換單位的價值,是讓過去的決定變得可以檢驗。

從線性乘數換成絕對響度,精確度的提升只是順帶。差別在新單位可以回頭換算舊值,然後判斷舊值對不對

所以當你發現一個參數反覆在調、每次都是憑感覺,先別急著問「正確值是多少」,先問:我現在用的這個度量,能不能跨情境比較?

不能的話,換一個能的,然後把舊值換算過來看看。

第二條:參數的註解要寫推理,不要只寫結論。

一行好的參數註解應該包含:現在的值、相對關係、上一個值、為什麼改。而其中相對關係最有價值:「壓在人聲之下 29 LU」可以移植到任何一集,-45 不行。

第三條,關於決定不修:

「不修」是一個決定,而決定要留下記錄。否則它會被未來的人(包括你自己)當成新出的 bug,然後重新調查一次。

一句「已量化、已判斷、不可辨、不修」,省掉的是未來某個人半天的時間。

明天講這一整章最貴的一次除錯:兩條應該同步的音軌,為什麼對不齊。


上一篇
Day 19|一條組裝鏈,只有一個參數從頭到尾沒漂過
下一篇
Day 21|offset 從 +3.0 秒漂到 +1.75 秒
系列文
我以為我保留了五道閘門21
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言