【Python/pydub】音声ファイルの信号をリアルタイムグラフ

Pythonモジュール「pydub」で音声ファイル(mp3)の信号をリアルタイムグラフ化する方法についてソースコード付きでまとめました。

音声ファイルの信号をリアルタイムグラフ化

Pythonモジュール「pydub」で読み込んだ音声データをMatplotlibでリアルタイムグラフ化してみました。

サンプルコード(Python3)

サンプルプログラムのソースコードです。

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np
from pydub import AudioSegment
import ctypes
import time

def getkey(key):
    return(bool(ctypes.windll.user32.GetAsyncKeyState(key)&0x8000))

def line000(pos):
    WIDTH = 80
    pl = [(pos)%WIDTH, (pos+1)%WIDTH, (pos+2)%WIDTH]
    rettxt = ""
    for i in range(WIDTH):
        if i in pl:
            rettxt += "0"
        else:
            rettxt += "-"
    return(rettxt)

# リアルタイムグラフの描画
def realtime_graph(t, y, dt=0.01):
    line, = plt.plot(t*0.0001, y, "r-", label="y=x") # (x,y)のプロット
    line.set_ydata(y)   # y値を更新
    plt.title("Graph")  # グラフタイトル
    plt.xlabel("t[s]")     # x軸ラベル
    plt.ylabel("y")     # y軸ラベル
    plt.legend()        # 凡例表示
    plt.grid()          # グリッド表示
    plt.ylim(-15000, 15000)
    plt.draw()          # グラフの描画
    plt.pause(dt)     # 更新時間間隔
    plt.clf()           # 画面初期化


def main():
    ESC = 0x1B          # ESCキーの仮想キーコード
    (x, y) = (0, 0)     # 初期値
    dt = 0.01
    i = 0
    plt.ion()           # 対話モードオン

    # 音声ファイルの読み込み
    sound = AudioSegment.from_file("input.mp3", "mp3")
    time = sound.duration_seconds # 再生時間(秒)
    rate = sound.frame_rate  # サンプリングレート(Hz)
    channel = sound.channels  # チャンネル数(1:mono, 2:stereo)

    # 音声データをリストで抽出
    list_sound = sound.get_array_of_samples()
    y = np.array(list_sound)
    t = np.arange(0, int(time*rate))

    while(True):
        realtime_graph(t[i:500+i], y[i:500+i], dt)
        i += int(rate*dt)
        if getkey(ESC):     # ESCキーが押されたら終了
            break

    plt.close()


if __name__ == '__main__':
    main()
関連記事
1 【Python/pydub】音声ファイル処理Python入門 基本文法
関連記事