音声ファイルの波形表示(Python)

目次

wavファイルの波形表示

今回は,wavファイルの波形を表示してみたいと思います.

手順

まず最初に,numpyとmatplotlibをpipでインストールします.

$ pip install numpy matplotlib

次にsignal_plot.pyというファイル名で作成し,以下のコードを記述します.

import sys

import numpy as np
import matplotlib.pyplot as plt
import soundfile as sf
def mono_plot(data, fs):
    time = np.arange(0, 1/fs * len(data), 1/fs)

    fig, ax = plt.subplots()
    ax.plot(time, data)
    ax.set_title("1-ch")
    ax.set_xlabel("time[s]")
    ax.set_ylabel("amplitude")
    plt.show()

def array_plot(data, fs):
    n_channels = data.shape[1]
    time = np.arange(0, 1/fs * data.shape[0], 1/fs)

    fig, axes = plt.subplots(n_channels)
    for i_channel in range(n_channels):
        axes[i_channel].plot(time, data[:, i_channel])
        axes[i_channel].set_title(f"{i_channel+1}-ch")
        axes[i_channel].set_xlabel("time[s]")
        axes[i_channel].set_ylabel("amplitude")
    plt.show()

def plot_signal(data, fs):

    if len(data.shape) > 1: # アレイ信号
        array_plot(data, fs)
    else:                   # モノラル信号
        mono_plot(data, fs)

def main():
    filepath = sys.argv[1]
    data, fs = sf.read(filepath)
    plot_signal(data, fs)

if __name__ == '__main__':
    main()

7行目はサンプリング周波数とデータ長から時間を表す配列を作成しています.
9行目でプロットするためのオブジェクトを作成しています.
10行目で描画し,11~13行目でタイトルやラベルを設定しています.
そして,14行目でプロットを表示しています.
array_plotメソッドもmono_plotと同様に動作します.

また,アレイ信号とモノラル信号の判定は,data.shapeが

  • モノラル信号の場合は1次元,
  • アレイ信号の場合は2次元配列

となることを利用しています.

実行例

$ python plot_signal.py /path/to/audio_file.wav

モノラル信号の場合は,以下のような図がプロットされています.

また,ステレオ信号の場合は次のような図がプロットされます.

まとめ

今回は,numpy, matplotlibを利用して,wavファイルの音声波形を表示してみました.また,モノラル信号,アレイ信号に対しても同様に表示してみました.

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次