sox:在靜音時分割音訊但保持靜音

sox:在靜音時分割音訊但保持靜音

我有多本有聲讀物,儲存在大型 mp3 中。我正在嘗試將這些大 mp3 分割成多個較小的檔案。

我找到了一個工具,可以檢測音訊檔案中的靜音並根據此「分隔符號」分割音訊檔案。

這是一個例子:

sox -V3 audiobook.mp3 audiobook_part_.mp3 \
silence 1 0.5 0.1% 1 0.5 0.1% : newfile : restart

這基本上會分為audiobook.mp3, audiobook_part_001.mp3, audiobook_part_002.mp3... 其中靜音 >= 0.5 秒。

現在的問題是,這個命令不僅分割文件,而且還消除了靜默。

因此,當您播放播放​​清單中的新檔案時,曲目/段落聽起來會被擠在一起。

那麼你如何告訴sox只分割文件但保持沉默(在每個曲目的末尾)?

答案1

您可以透過一些小的更改來保留分割部分中的所有靜音。從你原來的命令開始:

silence 1 0.5 0.1%   1 0.5 0.1% 

第一個三元組值表示在開始時消除靜音(如果有),直到 0.5 秒聲音高於 0.1%。第二個三連音表示當靜默時間至少有 0.5 秒低於 0.1% 時停止。命令的其餘部分,: newfile : restart然後啟動一個新的輸出文件,並再次開始在開頭尋找聲音。因此,第一個檔案在靜音開始時結束,第二個檔案將在靜音結束時開始。

改善這一點的最簡單的選擇是silence -l。它將保留觸發文件結束的 0.5 秒靜默。不幸的是,任何更長的靜音都將被刪除,因為它是下一個檔案的開始。保持較長間隙的簡單方法是結合-l較長的檢測時間,例如 2 秒:

silence -l  1 0.5 0.1%   1 2.0 0.1%

現在,只有在至少有 2 秒沉默的情況下,您才會分裂,但您將保留間隙的前 2 秒。為了避免失去所有靜音,只需在開始時刪除對靜音的偵測即可。您需要將三元組替換為單一0

silence -l  0   1 2.0 0.1%

如果您想玩簡單的聲音檔案以了解如何sox處理情況,您可以輕鬆創建 2 個聲音文件,一個包含 1 秒的音調,另一個包含 1 秒的靜音,然後在演示之前將它們組合在一起結果作為silence效果的輸入。例如,創建:

sox -n gap.wav   trim 0 1
sox -n tone.wav  synth 1.001t sine C5

然後加入間隙音間隙音並out.wav使用您​​的效果進行創建並聆聽結果:

sox gap.wav tone.wav gap.wav tone.wav out.wav silence 1 0.5 0.1%
play out.wav

答案2

我會使用 sox pad 在每個分割檔案的開頭和結尾加上靜音。最後,它不會是一個單一的 sox 命令一次完成所有操作,但它更加直接,並為您提供了一些額外的控制,例如選擇填充靜音的長度。

這個答案關於如何使用襪墊。例如

files="*.wav"
for f in $files
do
  sox "$f" "${f%.*}-pad.wav" pad 2 3
done

相關內容