把 92 首現場曲目的掌聲尾巴裁齊,我留下的一個腳本

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

手上一批 90 年代的現場靴腿,多數是從 CD 轉出來的 16bit/44.1kHz wav,也有幾張是 128k mp3 轉回來的假無損。問題不在音質,是每首歌結尾的掌聲長短不一:短的 1.2 秒就切掉,長的拖到 6 秒,做成歌單後節奏全亂。量不大,92 首,但手動剪會瘋。

我的做法是先用 ffmpeg 的 silencedetect 找尾巴的靜音段落,再回頭從峰值位置切。關鍵是門檻不能全域固定,掌聲的殘響跟場地大小差很多。我最後用兩段式:先粗掃 -50dB、0.8 秒,把候選點列出來,再對每首歌檢查最後一個「非靜音」段落的結尾。

ffmpeg -i in.wav -af "silencedetect=noise=-50dB:d=0.8" -f null - 2>&1 \
  | grep silence_end | tail -1

拿到時間點後,我沒有直接切在 silence_end,而是往回退 250ms,因為鼓掌的尾音通常比 -50dB 的判定晚一點消失。裁切用 stream copy 不重編碼:

ffmpeg -i in.wav -ss 0 -to 03:41.750 -c copy out.wav

這樣做的代價是時間點只能落在 frame 邊界,44.1kHz 下大約 23ms 的誤差,但對掌聲尾巴來說聽不出來,換來的是完全不動音訊。

為什麼不統一裁成固定長度?我試過,結果是有些歌的尾奏被吃掉,尤其是鋼琴收尾的那幾首。反過來說,全部保留原長也不行,歌單聽起來像在等鼓掌。

會失效的地方有三個。一是觀眾跟著唱到最後的歌,人聲會被判定成非靜音,退 250ms 就會切到人聲。二是 mp3 轉出來的那幾張,silencedetect 的門檻要放寬到 -45dB,不然整首都是「靜音」。三是我踩過最痛的一次:有首歌中間有 3 秒的停頓,tail -1 抓到的其實是中間那個點,整首被砍掉一半。後來我改成先確認 silence_end 大於總長度的 70% 才採用。

腳本現在跑一次大約 40 秒,92 首裡有 11 首需要手動複查,主要就是上面那三類。

你們在處理現場錄音的時候,是切在掌聲開始前,還是讓它自然淡出?我一直在這兩種之間搖擺。

0
赞同度 100% · 0 条评论 · 2 阅读

0 条评论

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

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