見出し画像

Pythonでオーディオファイルの波形表示

シンプルな波形表示をメモしておこうと思いまして。

完成したグラフ表示

L/Rの波形をタイムライン表示します。

オーディオファイルの波形表示

ちなみに、WaveLabの表示がいいと思ってたのでこれに寄せました。
(個人的にはWaveLabが使いやすくて好きなんです)

WaveLabの表示

コード

Jupyter Notebook形式です。

必要なパッケージのインストールです。

%pip install --upgrade pip
%pip install pydub matplotlib

オーディオファイルを読み込みます(ここではmp3を読み込んでいます)

from pydub import AudioSegment

stereo = AudioSegment.from_mp3("input/audiofile.mp3")

print("channel count: ", stereo.channels)
print("sampling rate: ", stereo.frame_rate)
print("play time: ", stereo.duration_seconds)

L/Rを分離します。

import numpy as np

samples = np.array(stereo.get_array_of_samples())
left = samples[0:len(samples):2]
right = samples[1:len(samples):2]

次にX軸の目盛りを「時間表示」にしたいので計算します。
※何もしないとX軸はArrayの個数になります。ただ波形は分かります。

今回使ったオーディオファイルのサンプリングレートが48kHzとなっている(2個前のprintで確認)ので、1秒間に48,000回サンプリングされています。
そのため、例えば10秒分のArrayは 48,000(回) × 10(秒) となります。

以下ではグラフ表示のX軸に表示する間隔を interval_secounds で指定(60秒)しています。
そして、X軸に使う xticks と xtick_labels を計算しておきます。

import datetime

interval_secounds = 60
xticks = [0]
while stereo.frame_rate * interval_secounds * len(xticks) <= len(left):
  xticks.append(stereo.frame_rate * interval_secounds * len(xticks))

xtick_labels = []
for xtick in xticks:
  seconds = xtick / (stereo.frame_rate)
  xtick_time = datetime.timedelta(seconds=seconds)
  xtick_labels.append(xtick_time)

L/Rを綺麗に表示したいため、グラフは matplotlib のオブジェクト指向スタイルで作成します。

figsize で見やすい大きさにしています。
描画領域に2行 1列でグラフを表示します(L/Rを上限に表示する)
sharex, sharey でX軸、Y軸を共有しておきます(スケールを合わせておく)
先ほど計算した xticks と xtick_labels を利用します。

import matplotlib.pyplot as plt

fig, axes = plt.subplots(2, 1, figsize=(20, 10), sharex="all", sharey="all")

axes[0].set_title("Left")
axes[0].set_ylabel("Amplitude")
axes[0].set_xlabel("Time")
axes[0].set_xticks(xticks)
axes[0].set_xticklabels(xtick_labels, rotation=45)
axes[0].plot(left)
axes[0].grid()

axes[1].set_title("Right")
axes[1].set_ylabel("Amplitude")
axes[1].set_xlabel("Time")
axes[1].set_xticks(xticks)
axes[1].set_xticklabels(xtick_labels, rotation=45)
axes[1].plot(right)
axes[1].grid()

plt.show()

これでグラフとしてオーディオファイルの波形表示が出来ます。

オーディオファイルの波形表示

ちなみにY軸も対数計算して表示すればさらにWaveLabの表示に近づくかと思います。

さいごに

オーディオの分析だけならば WaveLab などでスペクトログラムなどの確認が出来ますが、プログラム的な解析や波形の加工や深層機械学習などへの活用を考えるとPythonでグラフ表示も出来ると進めやすいのではと思います。
今回はその一歩目として波形を表示する部分のメモです。

この記事が気に入ったらサポートをしてみませんか?