Pyaudioのドキュメントを読んで、ウェブ上の他の記事を読んだ後、私の理解が正しいかどうか混乱しています。
これは、pyaudioのサイトにある音声録音のコードです。
_import pyaudio
import wave
CHUNK = 1024
FORMAT = pyaudio.Paint16
CHANNELS = 2
RATE = 44100
RECORD_SECONDS = 5
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("* done recording")
stream.stop_stream()
stream.close()
p.terminate()
_
これらの行を追加すると、記録したものは何でも再生できます。
_play=pyaudio.PyAudio()
stream_play=play.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
output=True)
for data in frames:
stream_play.write(data)
stream_play.stop_stream()
stream_play.close()
play.terminate()
_
pyaudio.get_sample_size(pyaudio.Paint16)
を使用して計算されます。frames[0]
_のサイズは4096バイトである必要があります。ただし、sys.getsizeof(frames[0])
は_4133
_を返しますが、len(frames[0])
は_4096
_を返します。for
ループはint(RATE / CHUNK * RECORD_SECONDS)
回実行されますが、その理由はわかりません。 ここ は「ルーベン・サンチェス」が答えたのと同じ質問ですが、彼が_CHUNK=bytes
_と言うように正しいかどうかはわかりません。そして、彼の説明によると、int(RATE / (CHUNK*2) * RECORD_SECONDS)
でなければなりません。なぜなら_(CHUNK*2)
_は、各反復でバッファに読み込まれたサンプルの数だからです。print frames[0]
_を書くと、文字列をASCIIエンコードされたものではなく、単なるバイトストリームになります。 struct
モジュールを使用してこのバイトストリームを16進数で印刷しますか?また、後で16進数の値を選択した値に変更しても、再生可能なサウンドが生成されますか?私が上に書いたものは何でも物事の私の理解であり、それらの多くは間違っているかもしれません。
sys.getsizeof()
は、Pythonインタープリターが必要とするストレージスペースを報告します。通常、これは生データの実際のサイズよりも少し大きくなります。RATE * RECORD_SECONDS
_は、記録する必要があるframesの数です。 for
ループは各frameではなく、各chunk、ループの数をチャンクサイズCHUNK
で割る必要があります。これはsamplesとは関係がないため、_2
_の要因はありません。[hex(x) for x in frames[0]]
のようなものを試すことができます。実際の2バイトの数値を取得する場合は、struct
モジュールでフォーマット文字列_'<H'
_を使用します。wave
モジュールを使用したWAVファイルの読み取りに関する私のチュートリアルに興味があるかもしれません。これは、質問のいくつかをより詳細にカバーしています: http://nbviewer.jupyter.org/github/mgeier/python -audio/blob/master/audio-files/audio-files-with-wave.ipynb