目次
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ファイルの音声波形を表示してみました.また,モノラル信号,アレイ信号に対しても同様に表示してみました.
コメント