[英]Recording audio for specific amount of time with PyAudio?
我正在嘗試使用Python(在本例中為PyAudio)來學習音頻捕獲/記錄。 我看一些例子,並發現了這個例子:
import pyaudio
import wave
CHUNK = 2
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 44100
RECORD_SECONDS = 3
WAVE_OUTPUT_FILENAME = "output.wav"
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
print("* recording")
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
print(int(RATE / CHUNK * RECORD_SECONDS))
print("* done recording")
stream.stop_stream()
stream.close()
p.terminate()
wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
我想我對CHUNK,FORMAT,CHANNELS和RATE的含義和作用有一個大概的了解,但我不了解在特定時間段內錄制的工作方式。 如果我將CHUNK的值從2更改為4,則int(RATE / CHUNK * RECORD_SECONDS)的值將減半。 但是,如果我要運行代碼,則錄制仍將在指定的3秒鍾內進行。
最終,當范圍減半時,該for循環如何在相同的時間內執行?
抱歉,如果我沒有道理,那感覺就像是一個愚蠢的問題。
編輯:因此,更改手動讀取的樣本數量,而不更改for循環的范圍(因此,范圍(0,60000)不變,但data = sample.read(CHUNK)不變),確實會更改記錄。 這意味着將每次迭代讀取的樣本加倍會使花費的時間加倍,這是否意味着處理數據所需的時間只是原來的兩倍? 但是,如果是這樣,根據可用的處理能力,不同計算機上花費的時間是否會有所不同?
CHUNK
是CHUNK
中樣本的數量。 我將其稱為“塊大小”。 聲卡和聲音驅動程序通常不會一個接一個地處理一個樣本,但是它們會使用很多塊。 這些塊的塊大小通常是幾百個樣本,例如512或1024個樣本。 僅當需要非常低的延遲時,才應嘗試使用較小的塊大小,例如64或32個樣本。 塊大小通常為2,效果不佳。
RATE
是采樣率,即每秒的采樣數。 44100赫茲是CD時代的典型采樣率,如今您經常會看到48000赫茲。
您的示例中的for
循環是從音頻硬件讀取數據塊(如果需要,還可以讀取“塊”)。 如果要錄制3秒鍾的音頻,則需要錄制3 * RATE
采樣。 要獲得塊數,您必須將其除以塊大小CHUNK
。
如果更改CHUNK
的值,則不會更改整個記錄的持續時間(除了通過int()
進行的一些截斷),但是會更改for
循環運行的次數。
如果您願意使用NumPy的,還有一個更簡單的音頻幾秒鍾記錄到WAV文件的方法:使用sounddevice模塊記錄的音頻數據和音效檔模塊將其保存為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)將自動為您選擇一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.