我有一些音频中带有“嗡嗡”声的视频文件。因此,我创建了以下脚本用于批处理。我正在使用ffmpeg
, 将音频提取为 .mp3,并且袜队去噪,这将输出无噪音的 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 - 用 Audacity 检查)。我相信红袜队正在添加这个延迟。
- 我该如何解决这个问题?或者,如何
00.050
从开头删除/修剪秒数并00.050
在音轨末尾添加静音秒数?或者 - 还有其他更好的方法来完成我的任务吗?
注意:我正在尝试使用.wav
而不是.mp3
在阅读下面的回复后,如果它有效,我将在此处更新。)
答案1
这可能取决于 MP3(MPEG-1 音频层 III)标准:
https://lame.sourceforge.io/tech-FAQ.txt
阅读以下部分:“为什么 LAME 在每首歌的开头添加静音?”
答案2
我找到了我自己问题的答案。有两种方法可以解决这个问题。我的第一个问题的答案是......
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
指出,瘸由于.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.
就我而言,我的文件中存在不同的“嗯”噪音变化。因此,为所有文件仅选择一个噪声样本对我来说不起作用。因此,我复制了转义的变体并创建了一个.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