- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题类似于之前关于“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 分析中的协变量。
谢谢!
马修
最佳答案
首先,您需要对 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
关于r - 使用 sox 统计数据批量测量 .wav 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12757685/
我正在尝试使用 SoX 生成频谱图程序。根据documentation ,我应该尝试以下方法来创建频谱图: sox output.wav -n spectrogram 我收到以下错误,而不是频谱图:
对于我正在进行的项目,我需要使用 SoX 工具来生成音频。如果有一种方法可以使用 SoX 生成特定持续时间的特定音符/音调,请告诉我!我对此做了很多研究,但无济于事。 此外,有什么方法可以使其直接输出
我正在尝试剪掉一个 30 分钟以上的文件的前 .010 毫秒。修剪命令修剪它,但我得到的输出是 0.010 毫秒。我想要的是保留音频文件的结尾部分并去掉文件开头的 .010 毫秒。 我尝试使用下面的命
我如何调用 sox 将 2 秒的音频文件转换为加速,以便文件的最终长度为 1.5 秒(75%)?我是否必须通过参数来进行音高校正? 我必须通过什么参数才能使文件大小保持小? 最佳答案 试试这个(用 i
我想在 Linux 中使用 SOX 混合音频。这是我的脚本。我是这件事的初学者。 time sox --buffer 128000 --combine mix audio1.mp3 audio
在静音时拆分音频文件,例如 sox input.wav output.wav silence 1 0.5 1% 1 3.0 1% : newfile : restart 多个输出文件的文件名类似于 o
当我混合四首轨道时,声音降低了很多,我尝试了混合音量和混合。 我如何做到让音量不改变? 我试过 -M after "sox --combine mix-power" ,但最终文件的长度为 0 秒。 最
我想从上传到服务器的音频文件中删除某个频率范围。我了解到SoX命令具有这种功能。 我找不到实现此目的的确切方法。任何帮助都是最欢迎的。 最佳答案 您要查找的命令可能是sinc。 例如:要从wave文件
我正在尝试为几个我不知道以秒为单位的总持续时间的波形文件创建淡入和淡出。我阅读了手册,但我看到的示例看起来都像我需要知道文件的全长。 有人可以在不知道 wav 文件的全长的情况下发布一个在 5 秒内淡
根据联机帮助页(其中已作为示例列出),以下命令应将输入文件拆分为多个音频文件,并在有 2 秒静音的位置进行分割。取而代之的是,它只创建了一个据报道大约 0.2 秒长的文件。 $ sox -V3 inf
我正在使用 SOX 混合音频。 命令 SOX -m voice.wav audio.wav final.wav 是我正在使用的。 我的目标是将 voice.wav 延迟 10 秒,如果我尝试使用延迟
我想将音频文件的音量减少10%(这样新的音量将是原始音量的90%)。如何使用SOX做到这一点?根据SOX手册,它支持音量选项: -v,--volume FACTOR 将调整系数调整为FACTOR。这是
这是来自:wac-to-wav-conversion 的后续问题 我已将文件扩展名从 .wac 更改为 .raw 并使用以下命令: sox -r 44100 -e unsigned -b 8 -c 1
我正在尝试使用链接 here 中给出的脚本将 728 个 .raw 文件转换为 16khz .wav 文件但我收到一个错误 sox FAIL formats: can't open input fil
当前使用的命令是 `sox input.wav -G -t mp3 -r 16k test.mp3` 但这正在创建一个比特率为24.0 kbps的文件。 如何使输出文件的比特率达到16.0 k
我想为音频文件添加噪音。有没有办法在 SoX(或其他工具)中实现这一点? 我正在进行机器学习研究,需要在存在噪声的情况下测试我的算法。理想情况下,我想指定一个信噪比并添加噪声以达到该目标 SNR。 我
我在用 socks 挣扎。我试图简单地切断文件结尾的1.2秒。我知道sox中有一个trim函数,但是我不确定如何使用它,因此它会切断最后的确切时间?我知道它大致像这样工作: sox input out
我尝试了这个: sox -u -r 11.025k -b 8 -c 1 infile.wav outfile.wav 但是当我播放声音时,声音混乱且无法识别。我怎样才能解决这个问题? 最佳答案 试试这
所以,我有一个音频文件,我想在不改变音调的情况下将它的速度降低到 0.5 倍,问题是当我这样做时,我会得到一种奇怪的口吃效果。有什么办法可以让 sox “平稳地”减慢音频速度,这样就不会出现明显的卡顿
audacity有一个噪声门插件,效果很好。我正在寻找等效的命令行-但无法找出SoX compand命令来执行此操作。谁能告诉我与胆大的噪声门相当的sox吗?例如,我在大胆使用 “门频率高于:0.0”
我是一名优秀的程序员,十分优秀!