Audio

sox 命令在 mp3 開始時自動添加延遲

  • July 7, 2020

我有一些影片文件在音頻中有“嗡嗡聲”。因此,我為批處理創建了以下腳本。**我正在使用ffmpeg, 將音頻提取為 .mp3,並使用sox進行降噪,**這將輸出無雜訊的 mp3 文件。

在此處輸入圖像描述

mkdir -p ./tmp;
for f in *.mp4;
do
   title=${f%.mp4};
   echo "Working on $f";
   mv ./"$f" ./tmp/ && ffmpeg -i ./tmp/"$f" -f mp3 -ab 128000 -vn ./tmp/"$title"_noise.mp3;

   echo "Sox process started...";
   sox -v 0.80 ./tmp/"$title"_noise.mp3 ./tmp/"$title"_128.mp3 noisered ./noise_profile 0.20 && sox ./tmp/"$title"_128.$mp3 -C 96 ./$title.mp3;

   echo "Removing Audio from video file...";
   ffmpeg -loglevel warning -stats -y -i ./tmp/"$f" -c copy -an ./"$f";
done

但問題是,我觀察到00:00:00.050s最終的 mp3 文件中添加了 (HH:MM:SS.ms - Checked with Audacity) 延遲。我相信Sox正在增加這種延遲。

  1. **我該如何解決這個問題?或者,如何00.050從開頭刪除/修剪秒數並00.050在音軌末尾添加幾秒的靜音?**或者
  2. 還有其他更好的方法來完成我的任務嗎?

注意:我正在嘗試使用.wav而不是.mp3在閱讀下面的回復後,如果它有效,我將在這裡更新。)

我找到了我自己問題的答案。有兩種方法可以解決這個問題。我的第一個問題的答案是…

1. 我該如何解決這個問題?或者,如何00.050從開頭刪除/修剪秒數並00.050在音軌末尾添加幾秒的靜音?

**答案 1:**這可能具有破壞性,因為我要多次轉換 mp3。如果有人想知道的話。trim在開頭使用以下命令並pad在結尾使用添加靜音。

sox Speech_01.mp3 Speech_01_Corrected.mp3 trim 0.049 pad 0 0.050

trim 0.049將從一開始就消除 049ms 的沉默。pad 0 0.050將在最後添加 050ms 的靜音。


答案2:這就是解決我的問題的方法。我按照這個頁面的說明,拼湊了一個批處理腳本。

2. 還有其他更好的方法來完成我的任務嗎?

正如所**@Artem S. Tashkinov**指出的,LAME.wav由於和.mp3格式之間的樣本差異而增加了延遲。(這是我的理解)。所以,我只使用.wav 了這個頁面中提到的

**注意:出於某種未知原因,以下sox**命令從音頻文件的末尾刪除了一小部分。因此,我不得不pad在音頻的末尾添加一些靜音,並避免意外失去音頻的任何部分。通過反複試驗,我知道這0.010ms對我的情況來說已經足夠了。

# You can observe pad here, which is adding silence at the end.
sox ./tmp/"$title"_noisy.wav ./tmp/"$title"_noisy_s.wav pad 0 0.010

# Below command will delete small part from the end of output wav file,
# Hence the above command.
sox -v 0.80 ./tmp/"$title"_noisy_s.wav ./"$title".wav noisered ./allnoise_profile 0.30

收集雜訊以生成noise profile.

就我而言,我的文件中有不同的“hmm”噪音變化。結果,為所有文件只選擇一個雜訊樣本對我不起作用。因此,我使用Audacity複製了正在轉義的變體並創建了一個.wav文件 ( allnoise_samples.wav) 。**注意:**在變體之間保持沉默對我不起作用。所以,樣本是連續的。

在此處輸入圖像描述

# Use below command to generate a noise sample file.
sox ./allnoise_samples.wav -n noiseprof ./allnoise_profile

這是批處理的最終腳本。

處理.wav文件會佔用大量儲存空間。所以,一旦他們的目的實現,我就會刪除它們。

mkdir -p ./tmp;
for f in *.mp4;
do
   title=${f%.mp4};
   echo -e "\n\n$f - Splitting Audio and video files...";
   mv ./"$f" ./tmp/"$title"_O.mp4 && ffmpeg -i ./tmp/"$title"_O.mp4 -c:a pcm_s16le -ar 128k -vn ./tmp/"$title"_noisy.wav;
   ffmpeg -i ./tmp/"$title"_O.mp4 -c copy -an ./"$title"_v.mp4;

   echo "Adding Silence at the end...";
   sox ./tmp/"$title"_noisy.wav ./tmp/"$title"_noisy_s.wav pad 0 0.010 && rm -rf ./tmp/"$title"_noisy.wav;

   echo "Sox process started...";
   sox -v 0.80 ./tmp/"$title"_noisy_s.wav ./"$title".wav noisered ./allnoise_profile 0.30 && rm -rf ./tmp/"$title"_noisy_s.wav;

   echo -e "Sox finished... \nMerging Audio and video files...";
   ffmpeg -loglevel warning -stats -y -i ./"$title"_v.mp4 -i ./"$title".wav -map 0:v -map 1:a -c:v copy -c:a aac -b:a 96k ./"$f";
   rm -rf ./"$title"_v.mp4 ./"$title".wav;
done

這可能歸結為 MP3(MPEG-1 音頻層 III)標準:

https://lame.sourceforge.io/tech-FAQ.txt

閱讀以下部分:“為什麼 LAME 會在每首歌曲的開頭添加靜音?”

引用自:https://unix.stackexchange.com/questions/597012