2016-09-13 18 views
0

私はPythonとこの場合はPyAudioを使用してオーディオキャプチャ/録音について学びたいと考えています。私はいくつかの例で見てみると、この1出くわしています:私は何CHUNK、FORMAT、CHANNELS、すべての意味と行うRATEの大まかな理解を持っていると思う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の値を2から4に変更すると、int(RATE/CHUNK * RECORD_SECONDS)の値が半分になります。しかし、コードを実行すると、指定した3秒間も録音が行われます。

最終的に、このforループは、範囲が半分になると同じ時間内にどのように実行できますか?

申し訳ありませんが、意味が分からない場合、愚かな質問のように感じます。

編集:範囲を変更せずに手動で読み取ったサンプルの数を変更すると、繰り返しループが繰り返されます(範囲(0,60000)で一定ですがデータ= sample.read(CHUNK)が変化します)記録にかかる時間。つまり、各反復を読み込んだサンプルを2倍にすると時間が2倍になります。つまり、データを処理するのに2倍の時間がかかります。しかし、もしそうなら、利用可能な処理能力に応じて、異なるコンピュータで異なる時間を取ることはできないだろうか?

+0

'CHUNK'が増加したので、この行' data = stream.read(CHUNK) 'は' stream.read(2) 'を – depperm

+0

' CHUNK'で処理するのに時間がかかります。それ以外の場合は、読み取られた合計バイト数は同じです。 –

+0

@deppermそれは私が思ったものですが、コンピュータがどれくらい速くそれを処理できるかによって時間が変わってしまいます。 – WillR27

答えて

1

CHUNKは、データブロック内のサンプル数です。私はこの "ブロックサイズ"と呼ぶだろう。サウンドカードとサウンドドライバは、通常、もう一方のサンプルを処理しませんが、チャンクを使用します。それらのブロックサイズは、典型的には数百のサンプルである。 512または1024サンプル。遅延時間が非常に短い場合にのみ、64または32サンプルのようなより小さいブロックサイズを使用するようにしてください。通常、ブロックサイズが2の場合は正常に動作しません。

RATEはサンプリングレート、すなわち1秒当たりのサンプル数です。 44100ヘルツはCDの時代の典型的なサンプリングレートですが、今日では48000ヘルツもよく見かけるでしょう。

for -loopは、オーディオハードウェアのデータブロック(または必要に応じて「チャンク」)を読み込みます。 3秒間のオーディオを録音する場合は、3 * RATEサンプルを録音する必要があります。 ブロックの番号を取得するには、ブロックサイズCHUNKで除算する必要があります。

あなたがCHUNKの値を変更した場合、これは(離れてint()によって行わいくつかの切り捨てから)全体録画の継続時間を変更しませんが、それはfor -loopが実行されている回数を変更します。

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)が自動的に選択します。

関連する問題