簡體   English   中英

使用PyAudio錄制特定時間的音頻?

[英]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)不變),確實會更改記錄。 這意味着將每次迭代讀取的樣本加倍會使花費的時間加倍,這是否意味着處理數據所需的時間只是原來的兩倍? 但是,如果是這樣,根據可用的處理能力,不同計算機上花費的時間是否會有所不同?

CHUNKCHUNK中樣本的數量。 我將其稱為“塊大小”。 聲卡和聲音驅動程序通常不會一個接一個地處理一個樣本,但是它們會使用很多塊。 這些塊的塊大小通常是幾百個樣本,例如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM