2017-04-14 45 views
0

我有一堆音频文件,需要根据静音分割每个文件并使用SOX。但是,我意识到某些文件背景非常嘈杂,有些文件不能,因此我不能使用一组参数来遍历所有分割文件。我试图弄清楚如何通过嘈杂的背景将它们分开。以下是我从sox input1.flac -n stat得到和sox input2.flac -n stat音频统计使用sox的说明

Samples read:   18207744 
Length (seconds): 568.992000 
Scaled by:   2147483647.0 
Maximum amplitude:  0.999969 
Minimum amplitude: -1.000000 
Midline amplitude: -0.000015 
Mean norm:   0.031888 
Mean amplitude: -0.000361 
RMS  amplitude:  0.053763 
Maximum delta:   0.858917 
Minimum delta:   0.000000 
Mean delta:   0.018609 
RMS  delta:   0.039249 
Rough frequency:   1859 
Volume adjustment:  1.000 

Samples read:   198976896 
Length (seconds): 6218.028000 
Scaled by:   2147483647.0 
Maximum amplitude:  0.999969 
Minimum amplitude: -1.000000 
Midline amplitude: -0.000015 
Mean norm:   0.156168 
Mean amplitude: -0.000010 
RMS  amplitude:  0.211787 
Maximum delta:   1.999969 
Minimum delta:   0.000000 
Mean delta:   0.091605 
RMS  delta:   0.123462 
Rough frequency:   1484 
Volume adjustment:  1.000 

前者不包含嘈杂的背景和后者一样。由于差距很大,我怀疑我可以使用Max deltaSample Mean。 任何人都可以为我解释这些统计数据的含义,或者至少告诉我我可以在哪里得到它(我试图在官方文档查找,但他们不解释)。非常感谢。

回答

1

我无法解释这些统计数据的含义。我试图在很多场合自己搞清楚,但它似乎没有任何地方记录。我个人会使用stat函数,它的输出更容易理解。

作为一种区分嘈杂声音的措施,我会尝试使用最高和最低声级之间的差异。最安静的部分将永远不会比背景噪音更安静,所以如果没有什么区别,音频可能会嘈杂,或者一直很响,就像compressed pop song。您可以取最大和最小RMS值之间的差值,或峰值和最小RMS值之间的差值。 RMS窗口长度应该保持相当短,如果音频有淡入或淡出部分,那些应该被删除,但我没有在代码中包含它。

audio="input1.flac" 
width=0.01 

peak=$(sox "$audio" -n channels 1 stats -w $width 2>&1 |\ 
    grep "Pk lev dB" |\ 
    sed 's/[^0-9.-]*//g') 
rmsmax=$(sox "$audio" -n channels 1 stats -w $width 2>&1 |\ 
    grep "RMS Pk dB" |\ 
    sed 's/[^0-9.-]*//g') 
rmsmin=$(sox "$audio" -n channels 1 stats -w $width 2>&1 |\ 
    grep "RMS Tr dB" |\ 
    sed 's/[^0-9.-]*//g') 
rmsdif=$(echo "($rmsmax)-($rmsmin)" | bc -l) 
pkmindif=$(echo "($peak)-($rmsmin)" | bc -l) 

echo " 
    max RMS: $max 
    min RMS: $min 

    diff RMS: $rmsdif 
    peak-min: $pkmindif 
"