gpt4 book ai didi

ruby - 在 ruby​​ 中使用 PortAudio 包装器将声音录制到 .wav

转载 作者:数据小太阳 更新时间:2023-10-29 06:44:32 24 4
gpt4 key购买 nike

我最近一直在研究 ruby​​,我决定开始一个简单的项目来编写一个 ruby​​ 脚本,将线路输入声音记录到 .wav 文件中。我发现 ruby​​ 不能很好地访问硬件设备(它可能不应该),但是 PortAudio 可以,而且我发现了一个很棒的 PA 包装器 here (它不是 gem,我认为是因为它使用 ruby​​ 的 ffi 附加到 PortAudio,而且 PA 库可能在很多地方)。我一直在摸索 PortAudio 的文档和示例以了解 PA 的工作原理。我已经很多年没有写过或读过 C 了。

我在创建过程中应该将哪些参数传递给流以及在创建过程中传递给缓冲区时遇到了困难。例如,frame 到底是什么,它与 channelsample rate 等其他参数有何关系。一般来说,我对音频编程也是全新的,所以如果有人能指出一些关于设备级音频的一般教程等,我将不胜感激。

ruby-portaudio 提供了一个创建流和缓冲区的示例,将正弦波写入缓冲区,然后将缓冲区发送到要播放的流。我在示例中遇到的一些 ruby 问题,特别是循环 block 。

  PortAudio.init

block_size = 1024
sr = 44100
step = 1.0/sr
time = 0.0

stream = PortAudio::Stream.open(
:sample_rate => sr,
:frames => block_size,
:output => {
:device => PortAudio::Device.default_output,
:channels => 1,
:sample_format => :float32
})

buffer = PortAudio::SampleBuffer.new(
:format => :float32,
:channels => 1,
:frames => block_size)

playing = true
Signal.trap('INT') { playing = false }
puts "Ctrl-C to exit"

stream.start

loop do
stream << buffer.fill { |frame, channel|
time += step
Math.cos(time * 2 * Math::PI * 440.0) * Math.cos(time * 2 * Math::PI)
}

break unless playing
end

stream.stop

如果我要记录,我应该将流读入缓冲区,然后操作该缓冲区并将其写入文件,对吗?

此外,如果我在这里咆哮错误的树,并且有更简单的方法来做到这一点(在 ruby 中),一些方向会很好。

最佳答案

让我们首先澄清一下您所询问的术语。为此,我将尝试以简化的方式解释音频管道。当您在您的示例中生成声音时,您的声卡会定期从您的代码中请求帧(= 缓冲区 = block ),您将在其中填充您的样本。采样率定义了您在一秒钟内提供了多少样本,从而定义了样本回放的速度。帧大小(= 缓冲区大小 = block 大小)决定了您在来自声卡的一次请求中提供了多少样本。缓冲区通常非常小,因为缓冲区大小直接影响延迟(大缓冲区 => 高延迟)并且大数组可能很慢(尤其是 ruby​​ 数组很慢)。

当您从声卡录制声音时会发生类似的事情。您的函数不时被调用,来自麦克风的样本通常作为参数传递给函数(或者甚至只是对此类缓冲区的引用)。然后您需要处理这些样本,例如通过将它们写入磁盘。

我知道“用 Ruby 做所有事情”的想法很诱人,因为它是一门如此美丽的语言。当您计划进行实时音频处理时,我建议切换到编译语言(C、C++、Obj-C 等)。它们可以更好地处理音频,因为它们比 Ruby 更接近硬件,因此通常速度更快,这在音频处理中可能是一个相当大的问题。这可能也是为什么 Ruby 音频库如此之少的原因,所以也许 Ruby 不是完成这项工作的合适工具。

顺便说一句,我尝试了 ruby​​-portaudio、ffi-portaudio 以及 ruby​​-audio,但它们都无法在我的 Macbook 上正常工作(试图生成正弦波),这再次令人遗憾地表明,Ruby 是多么不能够处理这些东西(还是?)。

关于ruby - 在 ruby​​ 中使用 PortAudio 包装器将声音录制到 .wav,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9163430/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com