sox 命令会自动在 mp3 的开头添加延迟

sox 命令会自动在 mp3 的开头添加延迟

我有一些音频中带有“嗡嗡”声的视频文件。因此,我创建了以下脚本用于批处理。我正在使用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 检查)。我相信红袜队正在添加这个延迟。

  1. 我该如何解决这个问题?或者,如何00.050从开头删除/修剪秒数并00.050在音轨末尾添加静音秒数?或者
  2. 还有其他更好的方法来完成我的任务吗?

注意:我正在尝试使用.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

相关内容