把 47 首演唱會曲目的掌聲尾巴裁齊後,我留下一個可重跑的腳本

这篇内容暂时只有 繁體中文 版本,以下是原文。

上個月整理一批 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
赞同度 100% · 0 条评论 · 1 阅读

0 条评论

支持 Markdown · 回复会实时推送给对方

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