LoginSignup
4
8

More than 1 year has passed since last update.

Python matplotlibでリアルタイムに音を可視化

Last updated at Posted at 2021-09-11

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ライフを。

4
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
8