我正在构建一个工具,它应该在服务器上运行并分析音频文件。由于我所有的其他工具都是用Ruby编写的,因此我想使用Ruby来完成这项任务。但我很难找到一个好的方法来实现它。
我发现的许多例子都做了可视化和图形方面的工作,而我只需要FFT数据,没有别的要求。我需要获取音频数据并对其进行FFT处理。我的最终目标是计算一些东西,如所有频率(加权幅度)上的平均值/中位数/众数、第25百分位数和第75百分位数、BPM,以及可能一些其他的好特性,以便后来能够将类似的声音聚集在一起。
首先,我尝试使用ruby-audio和fftw3,但我从未真正使两者配合工作。文档也不好,所以我真的不知道数据是如何传递的。 接下来,我尝试使用bplay / brec,并将我的Ruby脚本限制为仅使用STDIN并对其执行FFT(仍然使用fftw3)。但我无法让bplay / brec工作,因为服务器没有声卡,我也无法直接将音频直接发送到STDOUT而不经过音频设备。
我发现的许多例子都做了可视化和图形方面的工作,而我只需要FFT数据,没有别的要求。我需要获取音频数据并对其进行FFT处理。我的最终目标是计算一些东西,如所有频率(加权幅度)上的平均值/中位数/众数、第25百分位数和第75百分位数、BPM,以及可能一些其他的好特性,以便后来能够将类似的声音聚集在一起。
首先,我尝试使用ruby-audio和fftw3,但我从未真正使两者配合工作。文档也不好,所以我真的不知道数据是如何传递的。 接下来,我尝试使用bplay / brec,并将我的Ruby脚本限制为仅使用STDIN并对其执行FFT(仍然使用fftw3)。但我无法让bplay / brec工作,因为服务器没有声卡,我也无法直接将音频直接发送到STDOUT而不经过音频设备。
这是我最接近的:
# extracting audio from wav with ruby-audio
buf = RubyAudio::Buffer.float(1024)
RubyAudio::Sound.open(fname) do |snd|
while snd.read(buf) != 0
# ???
end
end
# performing FFT on audio
def get_fft(input, window_size)
data = input.read(window_size).unpack("s*")
na = NArray.to_na(data)
fft = FFTW3.fft(na).to_a[0, window_size/2]
return fft
end
现在我卡住了,在谷歌上找不到更多好的结果。也许你们 Stack Overflow 的人可以帮我吗?
谢谢!