波動と機械学習

人間の声を色相の変化を利用して3次元プロットした図に美しさを感じて、そのまま音声解析の道を進んでいます。自分なりに調べて実装できたものから更新していきます。アドバイス、アイデアなどあれば是非お願いします。

音声の再生と録音

本記事ではマイクから音声を録音、スピーカで再生する方法を記載します。
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