ひばりログ

Apple関連やプログラミングなど趣味を書き綴る。

PyaudioとMatplotlibでリアルタイムに音の波形をグラフ化する

できたもの

f:id:hibari2978:20190705154853g:plain

ソースコード

import pyaudio
import numpy as np
import matplotlib.pyplot as plt

# 1フレームあたりのサンプル数
CHUNK = 1024
# サンプリング周波数(1秒間にとる音の入力点の数)                                
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 16000
# 何秒間をグラフ化するか                                
DISPLAY_SECONDS = 4                         

pa = pyaudio.PyAudio()

# 実際のサンプル数
sample = int(RATE/CHUNK) * CHUNK
# 表示する時間のサンプル数            
all_sample = (DISPLAY_SECONDS+1) * sample   
# x軸のデータ
x = np.arange(0, all_sample, 1)
# y軸のデータを0でパディング             
y = np.zeros(all_sample)                    

try:
    while True:
        # 収録の設定
        stream = pa.open(
            format = FORMAT,
            channels = CHANNELS,
            rate = RATE,
            input = True,
            frames_per_buffer = CHUNK
        )

        # 次に表示するフレームの音をずらす
        y[:all_sample-CHUNK] = y[CHUNK:all_sample]                          
        data = np.frombuffer(stream.read(CHUNK), dtype="int16")/32768.0
        # ずらした部分にデータを入れる
        y[all_sample-CHUNK:all_sample] = data                               

        plt.plot(x, y)   
        plt.pause(0.01)  # 引数はsleep時間
        plt.cla()        # 現在描写されているグラフを消去
        
        stream.close()
        
        
        
except KeyboardInterrupt:
    stream.close()
    pa.terminate()
    pass

音の収録

こちらのサイトを参考にさせて頂きました。 qiita.com

まずstreamを開き、1フレーム(1024)のデータを読み込みます。

stream = pa.open(
            format = FORMAT,
            channels = CHANNELS,
            rate = RATE,
            input = True,
            frames_per_buffer = CHUNK
        )

data = np.frombuffer(stream.read(CHUNK), dtype="int16")/32768.0

次に、1フレームのデータを読み込んだので、

表示する音のサンプルを入れてあるyの配列を

1フレーム(1024)分、右から左へとずらし、

読み込んだデータを入れます。

y[:all_sample-CHUNK] = y[CHUNK:all_sample] 
y[all_sample-CHUNK:all_sample] = data 

リアルタイム図示

こちらのサイトを参考にしました。

space-denpa.jp

plt.plot(x, y)   
plt.pause(0.01)  
plt.cla()

参考にしたサイトと同じことをやって、

リアルタイムで表示することができました。