【问题标题】:Explanation of audio stat using sox使用 sox 解释音频统计
【发布时间】:2017-09-10 22:31:48
【问题描述】:

我有一堆音频文件,需要根据静音和使用SOX 拆分每个文件。但是,我意识到有些文件的背景非常嘈杂,而有些则没有,因此我不能使用一组参数来迭代所有进行拆分的文件。我试图弄清楚如何通过嘈杂的背景将它们分开。这是我从sox input1.flac -n statsox input2.flac -n stat 得到的信息

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,因为差距很大。 谁能为我解释这些统计数据的含义,或者至少告诉我我自己在哪里可以得到它(我尝试在官方文档中查找,但他们没有解释)。非常感谢。

【问题讨论】:

    标签: audio sox


    【解决方案1】:

    我不知道我是怎么一直错过SoX docs 中的stat,它就在那里。

    • 长度
      • 音频文件的长度(以秒为单位)
    • 按比例缩放
      • 输入的缩放比例。默认为 2^31-1,从 32 位有符号整数变为 [-1, 1]
    • 最大振幅
      • 最大样本值
    • 最小振幅
      • 最小样本值
    • 中线幅度
      • 又名mid-range,最大值和最小值之间的中点。
    • 平均标准
      • 样本绝对值的算术平均值
    • 平均振幅
      • 样本值的算术平均值
    • RMS 幅度
    • 最大增量
      • 两个连续样本之间的最大差异
    • 最小增量
      • 两个连续样本之间的最小差异
    • 平均增量
      • 连续样本之间差异的算术平均值
    • RMS 增量
      • 连续样本之间差异的均方根
    • 粗略频率
      • 估计输入文件的频率,以赫兹为单位。不确定使用的方法
    • 音量调整
      • 应该发送到 -v 的值,因此峰值绝对幅度为 1

    我个人更喜欢使用stats 函数,我发现它的输出更实用。

    作为区分或多或少嘈杂音频的衡量标准,我会尝试使用最高和最低声级之间的差异。最安静的部分永远不会比单独的背景噪音更安静,所以如果差别不大,音频要么很吵,要么一直很响,就像compressed pop song。您可以获取最大和最小 RMS 值之间的差值,或者峰值和最小 RMS 值之间的差值。 RMS 窗口长度应保持相当短,例如在 10 到 200 毫秒之间,如果音频有淡入或淡出部分,则应将其修剪掉,尽管我没有将其包含在代码中。

    audio="input1.flac"
    width=0.01
    
    # Mixes down multi-channel files to mono
    stats=$(sox "$audio" -n channels 1 stats -w $width 2>&1 |\
      grep "Pk lev dB\|RMS Pk dB\|RMS Tr dB" |\
      sed 's/[^0-9.-]*//g')
    
    peak=$(head -n 1 <<< "$stats")
    rmsmax=$(head -n 2 <<< "$stats" | tail -n 1)
    rmsmin=$(tail -n 1 <<< "$stats")
    
    rmsdif=$(bc <<< "scale=3; $rmsmax - $rmsmin")
    pkmindif=$(bc <<< "scale=3; $peak - $rmsmin")
    
    echo "
      max RMS: $rmsmax
      min RMS: $rmsmin
    
      diff RMS: $rmsdif
      peak-min: $pkmindif
    "
    

    【讨论】:

    • 请问什么对确定/估计音频是否被剪辑有好处?检查'Min level' == 1.0 还是'Pk lev dB' == 0.0 ??谢谢
    • @Blue482:这些值也可能表明音频已被标准化,如果音频随后被缩放,则不会检测到剪辑,最好使用平坦因子和 Pk 计数。第一个是衡量有多少连续样本的增量为零,后者是衡量音频达到最大幅度的次数,两者都会随着削波而增加。该文档声称 Pk 计数不是样本计数,而是发生次数,但没有对此进行扩展,并且它很好地跟踪了样本数。
    • 平面因子也没有很好地定义,但最大值似乎是 87.6,并且不依赖于音频的长度。参见 f.ex:sox -n -p synth 10 square 1 norm -3 | sox - -n stats
    • 感谢@AkselA!关于如何选择平坦因子和 Pk 计数的阈值来决定音频是否被剪辑,是否有任何直觉?
    • @Blue482:我认为你必须自己测试。找出您最满意的 I/II 类错误率。这也很大程度上取决于您测试的音乐类型。例如,嘎吱作响的电吉他中的轻微削波并不像单簧管独奏那样明显。
    【解决方案2】:

    文档位于安装目录的sox.pdf

    例如,如果您安装 Windows 32 位版本的 SoX 14.4.2,则 PDF 位于 C:\Program Files (x86)\sox-14-4-2\sox.pdfstat 的文档位于第 35 - 36 页。

    我还找到了网页版here

    【讨论】:

      【解决方案3】:

      我会使用“平均标准”值作为决定因素。它对我有用,尤其是当您在线上弹出或点击时。但是,如果线路是干净的,那么最大振幅可能是一个更好的值(我注意到你的最大振幅在两者上是相同的,因此不要在你的情况下使用它)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-13
        • 2020-07-13
        • 2014-04-14
        • 2021-07-08
        • 1970-01-01
        相关资源
        最近更新 更多