上個月整理一批 2018–2023 的現場錄音,總共 47 首曲目,都是 44.1kHz/16bit WAV,從三張不同場次的專輯抓出來。問題很一致:每首歌結尾的掌聲沒有乾淨收掉,直接接到下一首開頭,用 foobar2000 連續播放時,情緒會被硬生生切斷。我想要的不是把掌聲全刪掉,而是讓尾巴收在合理的長度,大約 1.2 到 1.8 秒,聽起來像自然收尾。
做法分兩步。先用 ffmpeg 的 silencedetect 找出每首歌結尾附近的靜音邊界,指令是:
ffmpeg -i input.wav -af silencedetect=noise=-35dB:d=0.6 -f null -
輸出的 silence_end 就是候選切點。但直接裁會太生硬,所以我保留最後一個 silence_start 前 0.3 秒的掌聲,再往後補 0.2 秒的淡出。實際處理用 Python 呼叫 ffmpeg:
python trim_tail.py --input in.wav --output out.wav --cut 123.45 --fade 0.2
腳本裡用 atrim 和 afade 組合,確保不會爆音。
為什麼這樣做:掌聲的能量曲線在結尾通常不是單調下降,而是有幾個峰值。silencedetect 抓的是能量低於門檻的區間,我用 -35dB 是因為這批錄音的底噪大約在 -40dB 左右,設太低會抓不到,設太高會把樂器尾韻也切掉。保留 0.3 秒是取捨:太短像被哢掉,太長又拖沓。代價是每首歌都要人工確認一次候選切點,47 首我花了大概兩小時。
失效的地方很明顯:如果結尾不是掌聲而是樂器自然衰減,silencedetect 會把衰減段當成靜音,裁下去會少掉最後一個和弦。我就踩過一次,一首鋼琴收尾的曲子被切掉 0.8 秒,聽起來像斷氣。所以後來我加了一個檢查:切點前 1 秒的平均音量不能低於 -30dB,否則跳過。另外,如果錄音本身有觀眾尖叫或口哨,能量不會掉到門檻以下,silencedetect 就找不到邊界,這種情況只能手動標。
腳本我放在自己的 gist,沒有公開,因為它依賴 ffmpeg 的版本,我測試的是 6.0,不確定 5.x 的行為是否一致。你們在處理現場錄音尾巴時,是寧可保留多一點掌聲,還是切到剛好?我目前偏向前者,但連續聽十首會有點膩。


0 条评论
还没有评论,写下第一条。