音声の再生と録音
本記事ではマイクから音声を録音、スピーカで再生する方法を記載します。
Pyaudioというモジュールを使用して実装していきます。
音声の再生
音声の録音・再生をする際はPyaudioで継続的にデータを入力or出力をしていきます。
コード内のパラメータの意味は以下の通りです。
・fs → サンプリング周波数
・ch → チャンネル数
・chunk → チャンク数
・format → データフォーマット
音声の再生はデータ配列をチャンクごとに区切り、配列が空になるまでストリームにデータを流し続ける仕組みにしました。
#正規化されたデータをバイナリデータに変換して使用する #パラメータの設定 fs = 44100 ch = 1 chunk = 1024 format = pyaudio.paInt16 # int16型 data = [int(x * 32767.0) for x in wave_data] data = struct.pack("h" * len(data), *data) #Pyaudioのモジュールを作成 p = pyaudio.PyAudio() #ストリームを作成 stream = p.open(format=format, channels=ch, rate=fs, output=True) #dataが空になるまでストリームにデータを書き込む for i in range(len(data)//chank): stream.write(data[chank*i:chank*(i+1)]) #ストリームを閉じる stream.stop_stream() stream.close() p.terminate()
音声の録音
音声の録音はマイクがストリームに記録したデータをチャンク毎に読み出して、配列に追加していく仕組みになります。
#パラメータの設定 fs = 44100 ch = 1 rec_time = 5 chunk = 1024 format = pyaudio.paInt16 # int16型 #Pyaudioのモジュールを作成 p = pyaudio.PyAudio() #ストリームを作成 stream = p.open(format=format, channels=ch, rate=fs, input=True, frames_per_buffer=chunk) #録音時間が終了するまでデータを取得し続ける frames = [] for i in range(0, int(fs / chunk * rec_time)): data = stream.read(chunk) frames.append(data) #ストリームを閉じる stream.stop_stream() stream.close() p.terminate() #配列を結合してバイナリ化 wave_data = b''.join(frames) #データをInt16に変換してさらに正規化 wave_data = np.frombuffer(wave_data, dtype="int16") wave_data = wave_data / 32767.0