Audio 使用SoX更改音频文件中某个时间范围的音量级别

Audio 使用SoX更改音频文件中某个时间范围的音量级别,audio,sox,Audio,Sox,我想使用SoX更改音频文件中特定时间范围/片段的音量级别 现在,我必须: 将原始文件修剪三次以获得:音频效果更改之前的部分、更改期间的部分(我正在更改声级)和更改之后的部分 执行此效果以更改提取的音频“中间”块在其自己的文件中的声级 考虑到SoX建议的衰落/交叉衰落5ms重叠,将所有内容重新拼接在一起 有没有更好的方法不需要编写脚本来完成上述任务?好的,使用ffmpeg和过滤器,一切都非常简单 假设你有两个音轨,A和B,你想裁剪一个,并对音量做些改变。因此,解决办法是: ffmpeg -y -i

我想使用SoX更改音频文件中特定时间范围/片段的音量级别

现在,我必须:

  • 将原始文件修剪三次以获得:音频效果更改之前的部分、更改期间的部分(我正在更改声级)和更改之后的部分
  • 执行此效果以更改提取的音频“中间”块在其自己的文件中的声级
  • 考虑到SoX建议的衰落/交叉衰落5ms重叠,将所有内容重新拼接在一起

  • 有没有更好的方法不需要编写脚本来完成上述任务?

    好的,使用ffmpeg和过滤器,一切都非常简单

    假设你有两个音轨,A和B,你想裁剪一个,并对音量做些改变。因此,解决办法是:

    ffmpeg -y -i 1.mp3 -i 2.mp3 i f454495482c151aea8761dda.mp3 -i f5544954796af4a171f11b57.mp3 -i f754495448788e35e6123679.mp3 -i f754495448788e35e6123679.mp3 -i f85449545e646dea98e5dd19.mp3 \
    -filter_complex "[0]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo,volume='if(between(t,129.00,129.20),0.15000*(t - 129.00) + 0.03,1)':eval=frame,volume='if(between(t,129.20,181.50),-0.00057*(t - 129.20) + 0.06,1)':eval=frame,volume='if(between(t,181.50,181.60),0.40000*(t - 181.50) + 0.03,1)':eval=frame,volume='if(between(t,181.60,183.50),-0.03684*(t - 181.60) + 0.07,1)':eval=frame,volume='if(between(t,183.50,188.00),0.00000*(t - 183.50) + 0.00,1)':eval=frame,atrim=0.00:56.00,adelay=129000|129000|129000|129000,apad[0:o];[1]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo,volume='if(between(t,0.00,134.00),0.00000*(t - 0.00) + 0.06,1)':eval=frame,atrim=0.00:134.00,apad[1:o];[0:o][1:o]amix=inputs=28,atrim=duration=185.00" -shortest -ac 2 output.mp3
    
    它将获取2个输入文件,将两个流转换为相应的a格式,然后应用过滤器

    volume的语法很简单:如果timet介于somestartendtime之间,则应用音量过滤器,基于所需的开始音量水平加上一些系数乘以开始时间和当前时间之间的差值t

    这将在一定范围内使体积从初始体积线性增加到所需值

    atrim将在所有范围内调整音量后修剪音频块


    ffmpeg真是太神奇了,表达式可能非常复杂,表达式中可能会用到许多数学函数。

    对于那些偶然发现这一排名靠前的线程,正在寻找避开音频文件中间的方法的人:

    我已经玩SoX很久了,我构建的方法使用管道来处理每个部分,而不创建所有那些临时文件

    结果是一个单行解决方案,尽管您需要设置计时,因此,除非所有文件的淡入淡出计时相同,否则使用算法生成该行可能会很有用

    我很高兴管道能够正常工作,因为我知道这方面对其他人来说很困难。命令行选项可能很难正确使用。然而,我真的不喜欢凌乱的附加文件作为替代

    通过使用混合功能和使用焊盘定位每个零件,然后对每个部分进行修剪和淡入,我们也可以避免在此处使用“拼接”。我真的不是一个粉丝


    在SoX 14.4.2 Windows中测试的工作单线示例:

    它在2秒时衰减-6dB,在5秒时恢复到0dB(使用0.4秒的线性衰减):

    让我们将其分解为几个部分,使其更具可读性:

    第1节=完整卷,第2节=缩回,第3节=完整卷

    sox -m
        -t wav "|sox -V1 inputfile.wav -t wav - fade t 0 2.2 0.4" 
        -t wav "|sox -V1 inputfile.wav -t wav - trim 1.8 fade t 0.4 3.4 0.4 gain -6 pad 1.8"
        -t wav "|sox -V1 inputfile.wav -t wav - trim 4.8 fade t 0.4 0 0 pad 4.8"
        outputfile.wav gain 9.542
    
    现在,把它分解,非常彻底

    -m”。。表示我们将混合(这会自动降低增益,请参见最后一个参数)

    -t wav”。。表示随后的管道命令将返回WAV(似乎WAV头在管道中丢失)

    然后。。第一个管道部分(鸭子前的完整体积)

    -V1”。。表示忽略警告-在输出此特定节时,将出现一条关于不知道输出文件长度的警告,但此操作不应产生其他警告

    然后输入文件名

    -t wav”。。强制输出类型

    -”。。是将返回SoX命令行的管道输出的标准名称

    衰减t 0 2.2 0.4”。。淡出整个音量部分。t=线性。0淡入。然后(因为我们希望crossfade的中间点为2秒),我们淡出2.2秒,淡出时间为0.4秒(淡出参数用于淡出结束时!)

    -t wav”。。建议下一个零件的类型-如上所述

    然后。。第二个管道部分(缩进部分)

    -V1”。。同样,要忽略输出长度警告,请参见上文 然后输入相同的文件名

    -t wav”。。强制输出类型,如上所述

    -”。。有关管道输出,请参见上文

    '修剪1.8
    '。。因为这个中间部分将在2秒时到达过渡的中间部分,所以(0.4秒的交叉淡入淡出)被回避的音频文件将在这之前0.2秒开始

    衰减t0.43.40.4”。。要在缩进部分淡出,请再次淡出。因此,0.4淡入。然后(最复杂的部分)由于下一个交叉淡入将在5.2秒结束,我们必须将该数字减去本节的修剪量,因此5.2-1.8=3.4(同样,这是因为淡出位置处理淡出的结束计时)

    增益-6”。。是以dB为单位的金额,我们应使用该金额

    垫1.8”。。必须与上面的修剪图匹配,以便在开始时插入静音量,使其在混合部分时同步

    -t wav”。。建议下一个零件的类型-如上所述

    然后。。第三个管道部分(返回至满液位)

    -V1”。。再次-见上文

    然后输入相同的文件名

    -t wav'。。强制输出类型,如上所述

    -'。。有关管道输出,请参见上文

    修剪4.8'。。最后一部分将在5秒开始,但(0.4秒的交叉淡入)音频将在此之前0.2秒开始

    衰减t0.40”。。只需淡入这个完整的音量部分。不褪色

    垫4.8”。。如上文所述,必须与上面的修剪图相匹配 然后输出文件名

    增加9.542”。。看起来很棘手,但基本上
    sox -m
        -t wav "|sox -V1 inputfile.wav -t wav - fade t 0 2.2 0.4" 
        -t wav "|sox -V1 inputfile.wav -t wav - trim 1.8 fade t 0.4 3.4 0.4 gain -6 pad 1.8"
        -t wav "|sox -V1 inputfile.wav -t wav - trim 4.8 fade t 0.4 0 0 pad 4.8"
        outputfile.wav gain 9.542