- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我最近一直在研究 ruby,我决定开始一个简单的项目来编写一个 ruby 脚本,将线路输入声音记录到 .wav
文件中。我发现 ruby 不能很好地访问硬件设备(它可能不应该),但是 PortAudio 可以,而且我发现了一个很棒的 PA 包装器 here (它不是 gem,我认为是因为它使用 ruby 的 ffi
附加到 PortAudio,而且 PA 库可能在很多地方)。我一直在摸索 PortAudio 的文档和示例以了解 PA 的工作原理。我已经很多年没有写过或读过 C
了。
我在创建过程中应该将哪些参数传递给流以及在创建过程中传递给缓冲区时遇到了困难。例如,frame
到底是什么,它与 channel
和 sample 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/
如果已知该确切样本存在于 wav 中的某处(但可能与其他声音混合),是否可以使用 FFT 找到较长 wav 中出现的小 wav 样本? 编辑 (收到两个回复后):如果我有一个包含所有已知声音的库,这些
我对 .NET 中的音频完全陌生,所以请多多包涵。 我的目标是创建一个具有两个 channel 的 wav 文件。左声道将包含语音消息(使用 SpeechSynthesizer 生成的流),右声道需要
我的大部分信息都来自其他stackoverflow帖子,但没有一个真正有用。 import UIKit import AVFoundation class FaceButtonSc
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 3 年前。
这可能是一个非常简单的问题;我将一个单声道 WAV 文件转换为一个 short[] 数组,并且我有一个将其写回 WAV 文件的函数。一切正常。 (writeBuffer 是 short[] 数组) b
我们的应用程序需要知道它加载的音频文件的样本数。我们使用的库可以可靠地确定采样率,但不能确定样本数。我们是否可以仅从文件大小和采样率来计算样本数? 最佳答案 马克说什么。不,通常您需要解释标题。但是,
我正在用java做一个项目,需要我加密wave文件。那么,是否有一个直接的过程可以将波形文件转换为二进制文件并返回?我将对二进制数据应用加密算法。 最佳答案 是的。 File file = new F
我想知道如何从 .wav 文件中获取样本以执行两个 .wav 文件的窗口连接。 谁能告诉我怎么做? 最佳答案 wave标准库的模块是关键:当然在代码顶部的 import wave 之后,wave.op
我有一个几分钟长的 .wav 文件,我想将其分成不同的 10 秒 .wav 文件。 到目前为止,这是我的 python 代码: import wave import math def main(fil
我在 ffmpeg 中使用以下命令合并多个 wav 文件: -f concat -safe 0 -i /storage/emulated/0/AudioClipsForSpeakerRecogniti
我正在尝试用python实现主动降噪。我的项目由两组代码组成: 录音代码 声音过滤代码 我的目标是当您运行该程序时,它将开始通过麦克风录音。录音完成后,会生成一个名为“file1.wav”的保存文件,
我正在尝试制作一个音乐识别系统。我担心我可能没有按照预期读取 wav 样本,而且我可能会应用错误的窗口大小来进行 FFT 和其他操作。 如果你能帮我的话,那就太好了。 首先,我有一些关于 Wavs 中
如何使用 java 合并两个 wav 文件? 我试过了 this但它没有正常工作,他们还有其他方法吗? 最佳答案 如果您直接处理 wav 文件的字节,您可以在任何编程语言中使用相同的策略。对于此示例,
尝试为我的 previous question 找到解决方法,我想将用 byte[](具有 wav header )编写的 16k 8 位单声道 wav 转换为 8k 8 位单声道流/字节 []。 是
目前我正在使用一个语音到文本的翻译模型,该模型采用 .wav 文件并将音频中的可听语音转换为文本转录本。该模型之前曾用于直接录制的 .wav 音频录音。但是现在我正在尝试对视频中最初出现的音频做同样的
试图在 python 中将 wav 文件转换为 wav uLaw。 使用 pydub 的 AudioSegment,我可以使用以下命令转换为 mp3: AudioSegment.from_wav(fr
我在 xcode 项目中添加了 LibFlac。然后我在我的项目中添加了来自 Libflac 的decode/main.c。我通过了 infile.flac 并运行了项目的可执行文件,但它给出了以下错
大家好,感谢您的阅读。 我想使用 Python 的 scipy.io.wavfile 对一首歌进行一些分析。由于我只有 .mp3 格式的歌曲,因此我使用 ffmpeg 将文件转换为 .wav,方法如下
我需要连接两个音频波,以便最终输出的音频波应该有一个更平滑的交汇点。我的意思是,在连接点,假设 10 秒钟,第一个音频应该开始淡出,而另一个音频开始拾取。 我已经能够连接两个音频文件并生成单个输出,但
我需要将一个 wav 文件转换为 8000Hz 16 位单声道 Wav。我已经有一个代码,它适用于 NAudio 库,但我想使用 MemoryStream 而不是临时文件。 using System.
我是一名优秀的程序员,十分优秀!