我正在尝试使用Python学习音频捕获/录制,在本例中是PyAudio。我正在看几个例子并遇到了这个例子:
/:json
我认为我对CHUNK,FORMAT,CHANNELS和RATE的意思和行为都有一个粗略的了解,但我不明白特定时间内的录音是如何工作的。如果我要将CHUNK的值从2更改为4,则int(RATE / CHUNK * RECORD_SECONDS)的值将减半。但是如果我要运行代码,录制仍然会在指定的3秒内发生。
最终,当范围减半时,这个for循环如何在相同的时间内执行?
对不起,如果我没有意义,这感觉就像一个愚蠢的问题。
编辑:因此改变手动读取的样本数量,而不改变for循环迭代的范围(因此在范围(0,60000)处恒定但数据= sample.read(CHUNK)不同),确实改变了记录的时间。这意味着每次迭代读取的样本加倍可以将所花费的时间加倍,这是否意味着处理数据只需要两倍的时间?但如果是这样的话,根据可用的处理能力,不同计算机上的时间是否会有所不同?
答案 0 :(得分:2)
CHUNK
是数据块中的样本数。我称之为“块大小”。声卡和声音驱动程序通常不会一个接一个地处理一个样本,但它们使用的是块。这些的块大小通常是几百个样本,例如, 512或1024个样本。只有在需要非常低的延迟时,才应尝试使用较小的块大小,如64或32个样本。块大小为2通常不能很好地工作。
RATE
是采样率,即每秒的采样数。 44100 Hertz是CD时代的典型采样率,现在你经常会看到48000赫兹。
示例中的for
- 循环是从音频硬件读取数据块(或者如果您愿意,则为“块”)。如果要录制3秒的音频,则需要录制3 * RATE
个样本。要获得块的数量,您必须将其除以块大小CHUNK
。
如果更改CHUNK
的值,则不会更改整个录制的持续时间(除了int()
完成的某些截断),但它会更改for
的次数1}} - 循环正在运行。
如果您愿意使用NumPy,可以使用更简单的方法将几秒钟的音频录制到WAV文件中:使用sounddevice模块录制音频数据和soundfile模块将其保存到WAV文件:
import sounddevice as sd
import soundfile as sf
samplerate = 44100 # Hertz
duration = 3 # seconds
filename = 'output.wav'
mydata = sd.rec(int(samplerate * duration), samplerate=samplerate,
channels=2, blocking=True)
sf.write(filename, mydata, samplerate)
顺便说一句,如果你没有理由,你不需要指定块大小。底层库(PortAudio)将自动为您选择一个。