【发布时间】:2013-02-08 12:08:02
【问题描述】:
我正在构建一个应该在服务器上运行并分析声音文件的工具。我想用 Ruby 来做这件事,因为我所有的其他工具也是用 Ruby 编写的。但我很难找到完成此任务的好方法。
我发现的很多例子都是在做可视化和图形化的东西。我只需要 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
所以现在我陷入困境,无法在 Google 上找到更多好的结果。所以也许你们可以帮助我?
谢谢!
【问题讨论】:
-
也许之前的讨论可能会有所帮助:stackoverflow.com/questions/2834548/…
-
您能否详细说明您被卡住的原因?请包括错误消息或您对事情应该如何工作的理解中的差距。
-
到目前为止我已经添加了我的代码。在使用 ruby-audio 读取数据和使用 fftw3 提取 FFT 之间存在巨大差距。请参阅带有三个问号的评论。我在 buf 中有 wav 数据,但我不知道数据到底是什么/代表什么。里面有标头吗?它是压缩/编码的吗?等等,等等。我想将数据放入 get_fft (这几乎是从另一个 SO 帖子中逐字提取的)。