【Python】Pyaudioで音声を録音してグラフに表示
pyaudioというライブラリを使うと、音声を録音・再生・保存etc.することができます。
この記事では、音声の録音に挑戦してみます。また、録音した音声をmatplotlibを使ってグラフに表示してみます。
1.ライブラリのインストール
以下のコマンドをプロンプトで実行します。
pip install pyaudio
その後、Pythonの以下のスクリプトでエラーが出なければインストールは完了しています。
import pyaudio
2.音声を録音
以下のプログラムで音声を録音し、matplotlibで音声波形を表示することができます。
import pyaudio import numpy import matplotlib.pyplot as plt chunk = 1024 FORMAT = pyaudio.paInt16 CHANNELS = 1 #モノラル(2にするとステレオ) RATE = 44100 #サンプルレート(録音の音質) RECORD_SECONDS = 3 #録音時間 p = pyaudio.PyAudio() stream = p.open(format = FORMAT, channels = CHANNELS, rate = RATE, input = True, frames_per_buffer = chunk) #レコード開始 print("Now Recording...") all = [] for i in range(0, int(RATE / chunk * RECORD_SECONDS)): data = stream.read(chunk) #音声を読み取って、 all.append(data) #データを追加 #レコード終了 print("Finished Recording.") stream.close() p.terminate() data = ''.join(all) #Python2用 #data = b"".join(all) #Python3用 #録音したデータを配列に変換 result = numpy.frombuffer(data,dtype="int16") / float(2**15) plt.plot(result) plt.show()
3.実行結果
以下のようなグラフが作成されればOKです。
録音中に、マイクの前で数回手を叩いてみました。
コードの中身については、コメントを見ながら感じ取ってください。
トラブルシューティング
いか、私がこのプログラムを実行するときに躓いた点です。
プログラムエラー
上のプログラムを実行すると、このようなエラーが出ることがあります。
data = ''.join(all) TypeError: sequence item 0: expected str instance, bytes found
これは、Python3系で動作したときに発生するエラーのようです。
これを解決するには、
data = ''.join(all)
の部分を
data = b"".join(all) #Python3用
に変更してください。