【问题标题】:Batch measurements of .wav files with sox stats使用 sox 统计数据批量测量 .wav 文件
【发布时间】:2012-10-06 07:19:48
【问题描述】:

我的问题类似于之前关于“get-mean-amplitude-of-wav-from-sox”的问题:

Get Mean amplitude(only) of .wav from sox

我希望能够使用 stats sox 对目录中的 1,000 个 .wav 文件进行批量测量,并将结果存储在数据框或类似的结构中,我可以将其保存为 csv 文本文件.

对于一个声音文件,代码为:

./sox SampleSound.wav -n stat

导致以下输出:

Samples read:          72000000
Length (seconds):   3600.000000
Scaled by:         2147483647.0
Maximum amplitude:     0.778809
Minimum amplitude:    -1.000000
Midline amplitude:    -0.110596
Mean    norm:          0.062671
Mean    amplitude:    -0.008131
RMS     amplitude:     0.172914
Maximum delta:         1.778809
Minimum delta:         0.000000
Mean    delta:         0.014475
RMS     delta:         0.057648
Rough   frequency:         1061
Volume adjustment:        1.000

我想: - 对给定目录中的 1,000 个声音文件进行批量测量, - 捕获列中的统计输出以及测量的声音文件名, - 并导出以用作 R 分析中的协变量。

谢谢!

马修

【问题讨论】:

    标签: r stat sox wav


    【解决方案1】:

    首先,您需要对sox 执行系统调用,并捕获其输出。例如:

    > spam = system("sox worf.wav -n stat 2>&1", intern = TRUE)
    > spam
     [1] "Samples read:             34000" "Length (seconds):      3.083900"
     [3] "Scaled by:         2147483647.0" "Maximum amplitude:     0.999969"
     [5] "Minimum amplitude:    -0.938721" "Midline amplitude:     0.030624"
     [7] "Mean    norm:          0.190602" "Mean    amplitude:    -0.004302"
     [9] "RMS     amplitude:     0.244978" "Maximum delta:         1.340240"
    [11] "Minimum delta:         0.000000" "Mean    delta:         0.051444"
    [13] "RMS     delta:         0.099933" "Rough   frequency:          715"
    [15] "Volume adjustment:        1.000"
    

    设置intern = TRUE 将命令的输出返回到一个变量。奇怪的是,sox 将其输出提供给stderr 而不是stdout,因此需要2>&1。现在最好的方法是将其包装在一个函数中,该函数还对system 的输出进行后处理:

    get_wav_stats = function(wav_file) {
       rough_wav_stats = system(sprintf("sox %s -n stat 2>&1", wav_file), intern = TRUE)
       wav_stats = data.frame(do.call("rbind", strsplit(rough_wav_stats, split = ":")))
       names(wav_stats) = c("variable", "value")
       wav_stats = transform(wav_stats, value = as.numeric(as.character(value)))
       return(wav_stats)
    }
    > spam = get_wav_stats("worf.wav")
    > spam
                variable         value
    1       Samples read  3.400000e+04
    2   Length (seconds)  3.083900e+00
    3          Scaled by  2.147484e+09
    4  Maximum amplitude  9.999690e-01
    5  Minimum amplitude -9.387210e-01
    6  Midline amplitude  3.062400e-02
    7       Mean    norm  1.906020e-01
    8  Mean    amplitude -4.302000e-03
    9  RMS     amplitude  2.449780e-01
    10     Maximum delta  1.340240e+00
    11     Minimum delta  0.000000e+00
    12     Mean    delta  5.144400e-02
    13     RMS     delta  9.993300e-02
    14 Rough   frequency  7.150000e+02
    15 Volume adjustment  1.000000e+00
    

    接下来,您可以将其包装在应用循环中以从给定目录中获取所有统计信息:

    # files_dir = list.files("path", full.names = TRUE)
    # For this example I create a mock list:
    files_dir = rep("worf.wav", 10)
    stat_wavs = lapply(files_dir, get_wav_stats)
    > str(stat_wavs)
        List of 10
         $ :'data.frame':   15 obs. of  2 variables:
          ..$ variable: Factor w/ 15 levels "Length (seconds)",..: 13 1 14 2 8 7 6 4 10 3 ...
          ..$ value   : num [1:15] 3.40e+04 3.08 2.15e+09 1.00 -9.39e-01 ...
         $ :'data.frame':   15 obs. of  2 variables:
          ..$ variable: Factor w/ 15 levels "Length (seconds)",..: 13 1 14 2 8 7 6 4 10 3 ...
          ..$ value   : num [1:15] 3.40e+04 3.08 2.15e+09 1.00 -9.39e-01 ...
    << snip >> 
         $ :'data.frame':   15 obs. of  2 variables:
          ..$ variable: Factor w/ 15 levels "Length (seconds)",..: 13 1 14 2 8 7 6 4 10 3 ...
          ..$ value   : num [1:15] 3.40e+04 3.08 2.15e+09 1.00 -9.39e-01 ...
    

    仅提取 value 列,其中包含您需要的统计信息:

    stats4files = data.frame(do.call("rbind", lapply(stat_wavs, "[[", 2)))
    names(stats4files) = stat_wavs[[1]][[1]]
    rownames(stats4files) = files_dir # this doesn't work actually because I have repeated the same file multiple times :)
    
    > stats4files
       Samples read Length (seconds)  Scaled by Maximum amplitude Minimum amplitude Midline amplitude
    1         34000           3.0839 2147483647          0.999969         -0.938721          0.030624
    2         34000           3.0839 2147483647          0.999969         -0.938721          0.030624
    3         34000           3.0839 2147483647          0.999969         -0.938721          0.030624
    4         34000           3.0839 2147483647          0.999969         -0.938721          0.030624
    5         34000           3.0839 2147483647          0.999969         -0.938721          0.030624
    6         34000           3.0839 2147483647          0.999969         -0.938721          0.030624
    7         34000           3.0839 2147483647          0.999969         -0.938721          0.030624
    8         34000           3.0839 2147483647          0.999969         -0.938721          0.030624
    9         34000           3.0839 2147483647          0.999969         -0.938721          0.030624
    10        34000           3.0839 2147483647          0.999969         -0.938721          0.030624
       Mean    norm Mean    amplitude RMS     amplitude Maximum delta Minimum delta Mean    delta
    1      0.190602         -0.004302          0.244978       1.34024             0      0.051444
    2      0.190602         -0.004302          0.244978       1.34024             0      0.051444
    3      0.190602         -0.004302          0.244978       1.34024             0      0.051444
    4      0.190602         -0.004302          0.244978       1.34024             0      0.051444
    5      0.190602         -0.004302          0.244978       1.34024             0      0.051444
    6      0.190602         -0.004302          0.244978       1.34024             0      0.051444
    7      0.190602         -0.004302          0.244978       1.34024             0      0.051444
    8      0.190602         -0.004302          0.244978       1.34024             0      0.051444
    9      0.190602         -0.004302          0.244978       1.34024             0      0.051444
    10     0.190602         -0.004302          0.244978       1.34024             0      0.051444
       RMS     delta Rough   frequency Volume adjustment
    1       0.099933               715                 1
    2       0.099933               715                 1
    3       0.099933               715                 1
    4       0.099933               715                 1
    5       0.099933               715                 1
    6       0.099933               715                 1
    7       0.099933               715                 1
    8       0.099933               715                 1
    9       0.099933               715                 1
    10      0.099933               715                 1
    

    【讨论】:

    • 我打算告诉他用 Python 或类似的东西来做所有的预处理,但你的方法很巧妙。如果可以的话,我会 +2。
    • 谢谢保罗!这就像一个魅力......在我停止尝试通过我的终端窗口运行它之后,并在 R 中运行它......糟糕:) 我真的很感谢你优雅的解决方案,并且学到了一些有用的东西我在 R 中遇到了其他一些挑战。
    • 这可能是 reqlly greqt 但我),即使是第一行也很难运行:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多