使用SoX更改音频文件中一段时间​​的音量级别

时间:2013-11-21 16:52:09

标签: audio sox

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

现在,我不得不:

  1. 修剪原始文件三次以获得:音频效果改变前的部分,(我改变声级的部分)和
  2. 之后的部分
  3. 执行效果以更改提取的“中间”音频块的声音级别,在其自己的文件中
  4. 将所有内容拼接在一起,同时考虑到SoX建议的淡入/交叉淡化5ms重叠
  5. 有没有更好的方法来执行此操作,而不涉及编写脚本来执行上述操作?

2 个答案:

答案 0 :(得分:10)

对于那些偶然发现这个排名靠前的线程的人来说,找到一种方法来躲避音频文件的中间位置:

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

结果是单线解决方案,但您需要设置时序,因此,除非您的淡入淡出时间对所有文件都相同,否则使用算法生成线可能很有用。

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

通过使用混合功能并使用垫定位每个部件,然后给每个部分修剪和放大。褪色我们也可以避免使用' splice'这里。我真的不是一个粉丝。

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

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

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

通过将其分解为几个部分,让我们在这里更具可读性:

第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命令行

' fade t 0 2.2 0.4 ' ..淡出整卷部分。 t =线性。 0淡入。然后(因为我们希望交叉淡入淡出的中间点为2秒)我们淡出2.2秒,淡出0.4秒(淡出参数用于淡入淡出时!)

' -t wav ' ..建议下一部分的类型 - 如上所述

然后...... SECOND管道部分(鸭子部分)

'的 -V1 ' ..再次,忽略输出长度警告 - 见上文 那么相同的输入文件名

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

'的 - ' ..用于管道输出,见上文

' 修剪1.8 ' ..因为这个中间部分会在2秒内到达转换的中间位置,所以(使用0.4秒交叉淡入淡出),鸭子音频文件将在此之前0.2秒开始

' 淡出0.4 3.4 0.4 ' ..淡化鸭子部分&再次淡出。所以0.4渐弱。然后(最复杂的部分)作为下一个交叉渐变将在5.2秒结束我们必须采取该数字减去该部分的修剪量,所以5.2-1.8 = 3.4(再次这是因为淡出位置处理结束时间的淡出)

' 获得-6 ' ..是以dB为单位的数量,我们应该用它来消费

' pad 1.8 ' ..必须与上面的修剪图匹配,以便在开始时插入静音量,以便在切片混合时使其同步

' -t wav ' ..建议下一部分的类型 - 如上所述

然后...... THIRD管道部分(返回完整级别)

'的 -V1 ' ..再次 - 见上文

然后输入相同的文件名

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

<强> - &#39; ..用于管道输出,见上文

修剪4.8 &#39; ..这最后一节将在5秒开始,但是(用0.4秒交叉渐变)音频将在此前0.2秒开始

&#39; 淡出0.4 0 0 &#39; ..只是淡入这个完整的卷部分。没有淡出

&#39; pad 4.8 &#39; ..必须与上面的修剪图匹配,如上所述 然后输出文件名

&#39; 获得9.542 &#39; ..看起来很棘手,但基本上当你&#34; -m&#34;混合3个文件,SoX将音量减少到1/3(三分之一)以提供空间。

而不是打败它,我们提升到300%。我们得到这个公式20 * log(3)/ log(10)

的dB量为9.542

如果你复制&amp;将单行粘贴到您可以轻松看到的地方,它比解释要简单得多!

最后 - 我最初担心交叉渐变是否需要对数而不是线性,但在我的情况下,从听取结果线性确实给出了我期望的声音。

您可能希望尝试更长时间的交叉淡入淡出,或者更早或更晚地发生转换,但我希望单行给那些认为需要许多临时文件的人带来希望!

如果有更多说明可以帮助我,请告诉我们。

audacity waveform

答案 1 :(得分:3)

好的,使用ffmpeg和过滤器非常简单。

想象一下,你有2首曲目,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个输入文件,将两个流转换为相应的格式,然后应用音量过滤器。

音量的语法很简单:如果时间 t 某些开始结束时间 - 然后根据所需的开始音量加上一些系数乘以开始时间和当前时间 t 之间的差值来应用音量过滤器。< / p>

这将在一个范围内将音量从初始音量线性增加到所需值。

在所有范围上调整音量后,​​

atrim 将修剪音频块。

ffmpeg真是太棒了,表达式可能非常复杂,许多数学函数都可以用在表达式中。