我正在构建一个应该在服务器上运行并分析声音文件的工具.我想在
Ruby中这样做,因为我所有的其他工具都是用Ruby编写的.但是,我找不到一个完成这个的好方法.
很多我发现的例子一直在做可视化和图形化的东西.我只需要FFT数据,没有了.我需要获得音频数据,并对其进行FFT.我的最终目标是计算一些东西,比如所有频率(加权幅度),BPM的平均值/中值/模式,第25个百分位数和第75个百分位数,还有一些其他好的特性,以便以后可以将类似的声音聚集在一起.
首先我试图使用ruby-audio和fftw3,但是我从来没有去过这两个人真正的合作.文档不是很好,所以我真的不知道什么数据被洗牌.
接下来,我试图使用bplay / brec并限制我的Ruby脚本,只需使用STDIN并执行FFT(仍在使用fftw3).但是,由于服务器没有声卡,我无法获得播放/播放,因此我无法直接将音频直接发送到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
所以现在我被卡住了,在Google上找不到更好的结果.那么也许你们可以帮助我吗?
谢谢!
解决方法
这是我正在尝试实现的最终解决方案,非常感谢Randall Cook的有用建议.在Ruby中提取wav文件的声波和FFT的代码:
require "ruby-audio" require "fftw3" fname = ARGV[0] window_size = 1024 wave = Array.new fft = Array.new(window_size/2,[]) begin buf = RubyAudio::Buffer.float(window_size) RubyAudio::Sound.open(fname) do |snd| while snd.read(buf) != 0 wave.concat(buf.to_a) na = NArray.to_na(buf.to_a) fft_slice = FFTW3.fft(na).to_a[0,window_size/2] j=0 fft_slice.each { |x| fft[j] << x; j+=1 } end end rescue => err log.error "error reading audio file: " + err exit end # now I can work on analyzing the "fft" and "wave" arrays...