Pythonでお手軽音声処理(3) 波形の表示

シェアする

  • このエントリーをはてなブックマークに追加

こんにちは,ふるやん(@furuya1223)です.

Python音声処理シリーズ、前回はサンプリング周波数に関する解説を行いました。

第3弾の今回は,音声波形の表示と波の生成を行います.

やっぱり可視化は大事ですからね.

今回もプログラム類は GitHub のリポジトリで公開しています。

できるようになること

Python のグラフ描画ライブラリ matplotlib を用いて音声波形を表示させることができるようになります。

音声波形の表示

Pythonでグラフを描画する場合,matplotlibというライブラリがよく利用されていると思います.

ここでもこれを使用しましょう.

モノラル音声データを読み込むと,データは1次元配列(ndarray)として手に入ります.

これをプロットするには,matplotlib.pyplot.plot(x, y) を使用します.

(面倒なのでインポート時に matplotlib.pyplot を plt とします)

xが横軸の値,yが縦軸の値になります.xとyは同じ長さの配列でないといけません.

横軸(時間)の単位を 秒 としたい場合,x は「x[i] が第 i サンプルの時刻である」というような配列でないといけません.

前回,音声データの各値(サンプル)は,サンプリング周期 [s] の間隔ごとに記録されているという話をしました.

サンプリング周期はサンプリング周波数の逆数です.

例えば,サンプリング周波数が48000[Hz]のとき,各サンプル間の時間間隔は 1/48000 [s] となります.

したがって,最初のサンプルの時刻を 0 [s] とすると,次のサンプルの時刻は 1/48000 [s],その次は 2/48000 [s],……となります.

そのため,x として「0, 1/48000, 2/48000, ...」となる等差数列を使用すればよいのです.

最後の時刻は「(データサイズ-1)/48000」となります.

このような等差数列は,numpy の arange(開始, 終了, 刻み幅) を使えば作成できます.(半開区間になるので,"終了" の部分には実際の末項の次の項を入れます)

で作成できます.

音声データの読み込みから波形の表示まで,以下のコードで実行できます.

matplotlibでは,plot() を実行しただけでは画像は表示されません(内部的には作成されているようですが).

そのため,plt.show() で画像を表示させてやる必要があります.

上記のコードで音声波形が出力されますが,このままだと軸ラベルとタイトルがありません.

また,縦軸の表示範囲がデータに依存しているので,真ん中が0でないという状態になっています.

今回もJSUTの音声で試してみます。

横軸は秒単位になっています。

では、軸の値の範囲とタイトル・ラベルの設定を行いましょう。

タイトルは plt.title(タイトル文字列) で設定します。

軸ラベルは、 plt.xlabel(横軸ラベル文字列)plt.ylabel(縦軸ラベル文字列) で設定します。

縦軸の範囲設定は、 plt.ylim([下限, 上限]) で行います。今回は行っていませんが、横軸の範囲設定は plt.xlim([下限, 上限]) です。

これを行ってからグラフを表示すると、以下のようになります。

ちゃんとタイトル・軸ラベルが表示されており、値の範囲が-1から1までになっています。

前々回に作成した音割れ音声ファイルの波形を表示してみると、下図のようになります。

ちゃんとクリッピングされていることが分かりますね。

横軸の表示範囲を設定すると、ある部分だけ拡大して表示することもできます。

sample.wav を表示させるときに、

を plt.show() より前に入れると、下図が出力されます。

1秒から1.01秒までの0.01秒間を表示したものです。ここまで拡大すると、ちゃんと波になっていることが分かりますね。

plt.plot() は音声波形以外にも、1次元の特徴量(振幅スペクトルなど)の表示に使えるので、今後も使用していきます。

まとめ

  • グラフ描画ライブラリは import matplotlib.pyplot as plt として使用する
  • plt.plot(時刻配列, 波形データ) で波形データを表示できる
  • タイトルは plt.title(タイトル文字列) で設定する
  • 軸ラベルは plt.xlabel(横軸ラベル文字列)plt.ylabel(縦軸ラベル文字列) で設定する
  • 縦軸の範囲設定は plt.ylim([下限, 上限]) で行う

次回は色々な波の生成を行います。その次はフーリエ変換とスペクトログラムの表示かな?

スポンサーリンク
レクタングル(大)
レクタングル(大)

シェアする

  • このエントリーをはてなブックマークに追加

フォローする