#0. はじめに
pyaudioを用いて音を読み込み、それをnumpyでバイナリから数値化、matplotlibで描画する。
作業環境:
・Ubuntu
・Docker
・Python3.8.5
各ライブラリがインストールされていない場合はターミナルで以下を実行しpipインストールしておく。
python -m pip install numpy matplotlib pyaudio
インストールができたらimportする。
import pyaudio
import numpy as np
import matplotlib.pyplot as plt
#1. 音を読み込む前の設定
pyaudioを用いて音を読み込むための設定を行っていく。
CHUNK
はデータサイズ。基本的に1024とするがデータ数が少なくエラーを吐かれたので3倍している。
RATE
はサンプリングレート。1秒間に何回標本化するか指定する。CDが441KHzなのでそれに合わせている。
CHANKやサンプリングレートに関して詳しく知りたい方はGoogle先生へ。
CHUNK = 1024 * 3
RATE = 44100
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16, #データの型
channels=1, #ステレオかモノラルかの選択 1でモノラル 2でステレオ
rate=RATE, #サンプリングレート
input=True,
input_device_index = 6, #マイクの指定
frames_per_buffer=CHUNK) #データ数
#2. グラフ描画のための設定
次にmatplotlibの設定を行っていく。
matplotlibの細かい情報は公式リファレンスかGoogle先生へ。
fig, ax = plt.subplots() #描画領域の作成
fig.canvas.draw() #figureの描画
bg = fig.canvas.copy_from_bbox(ax.bbox) #描画情報を保存
line, = ax.plot([0 for _ in range(CHUNK)]) #データがないためCHANKの数だけ0をplot
ax.set_ylim(-1, 1) #yのデータ範囲を-1~1に設定
fig.show() #描画
#3. データの読み込みとグラフの描画
実際にデータを描画していく。
while True
で無限に繰り返しデータを抽出、描画し続ける。ctrl+c
でプログラムを停止する。
while True:
data = stream.read(CHUNK) #CHUNKだけデータを読み込む
line.set_ydata(np.frombuffer(data ,dtype="int16") / float(2**15)) #バイナリデータをnumpy配列に変換
fig.canvas.restore_region(bg) #保存した描画情報を読み込む
ax.draw_artist(line) #データを指定
fig.canvas.blit(ax.bbox) #保存した描画情報にデータを加える
fig.canvas.flush_events() #描画情報をクリア
stream.stop_stream() #streamを止める
stream.close() #streamを閉じる
p.terminate() #pyaudioを終了
#3. 最後に
記事作成者も学習段階であるため理解しきれていない点がある。また、よりよい方法が有る場合はコメントしてほしい。
では、よいPythonライフ
を。