PythonのPySoundFileでwavファイル波形表示

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

信号処理は計測データに対して行うことがよくあります。オーディオファイルであるwavファイルは計測データを格納するのに非常に適した形式であるため、本記事ではwavファイルの波形を表示することで、Pythonでデータを処理可能にする方法までを説明します。

こんにちは。wat(@watlablog)です。
いよいよ信号処理のための第一歩!
wav波形の取り込み方法を習得します

wavファイルを波形表示する

wavファイルとは?

wavファイルとは一言で言えば音声ファイルです。音楽や会議の音声録音時に頻繁に使われるファイル形式ですが、実は計測の現場でも重宝されています。

かく言う僕も仕事で実験を行うのですが、計測した何かしらのデータを色々なソフトに読み込ませる時に、このwavファイルを使うことがあります。

wavファイルは歴史が古いファイル形式なので、様々なソフトに対応しています。各専門のソフト形式の方が計測データの保存に優れている部分が多くありますが、ソフト間の橋渡し、互換性という意味ではwavファイルが最強なのではないでしょうか?

Pythonでwavファイルを扱ってみよう!

使うパッケージ

今回調べた中では、以下のライブラリパッケージを使う方法が最も簡単でした。カッコ内はpipを使ったインストールコマンドです。

pipについての詳しい説明は「Pythonのパッケージ管理ツール pipの使い方とコマンド集」をご覧下さい。

  • NumPy (python -m pip install numpy)
  • matplotlib (python -m pip install matplotlib)
  • PySoundFile (python -m pip install pysoundfile)

特に、PySoundFileは音声ファイルを扱うためのライブラリなので、wavファイルの扱いに関して強い味方になってくれます。

NumPyはwavファイルのデータをPythonで扱える行列形式に変換し、matplotlibはグラフを描画するために使います。

波形表示までのコード

プログラミングしたソースコードを紹介します。今回も基本はdef文を使った関数形式でメインであるwav読み込みの部分を記述しました。

関数の基本的な使い方は「Pythonの関数 def文の使い方!引数や別ファイル式も解説」をご覧下さい。

関数で表現したwavファイル読み込み部分は以下のwav.pyファイルです。

このプログラムではdataとsamplerateという二つの戻り値を返しています。

dataはnumpyの配列形式(ndarray型)で用意された、波形そのもののデータです。

samplerateはサンプリングレートと呼び、データを収集した時のサンプリング周波数を意味しています。ちなみにサンプリング周波数の逆数が時間刻み値になります。

実行するファイルはこちらのmain_wavplot.pyです。

wav.pyをimportして参照しています。numpyはグラフ表示時の横軸の作成に使っています。len文で波形の長さ(データ数)を取得し、サンプリングレートで割る(つまり時間刻み値をかける)ことで時間の最大値を算出しています。

あとはmatplotlibの関数を使ってグラフ表示をするという手順です。

以下が実行結果です。無事に波形表示ができました!

graph

追記:関数ファイルを使わないで一度に書く

先ほどまでのコードは今後のことも考え関数ファイル(wav.py)を作成し、メインの実行ファイル(main.py)でwav.pyをインポートしていましたが、この程度の文量であれば1つのファイルに全て記入した方が良いかも知れません。

以下に純粋に1つの.pyファイルだけを使ってwav波形を表示させるコードを紹介します。

この方がシンプルでした!

まとめ

Pythonで簡単にwav波形の中身を表示するためには、PySoundFileというパッケージが便利でした。

まずは波形を表示、次に本題の信号処理、という流れになります。

また、今はグラフの書式は適当ですが、軸のラベル等書式は別記事でまとめたいと思います。

意外と簡単にwav波形のグラフ表示ができたぞ!もしかしてPythonって思ったより初心者にやさしい?
さぁ!これから信号処理だ!

Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!

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

SNSでもご購読できます。

コメント

  1. アバター temma より:

    コメント失礼します。このサイトのコードを使ってモーターの振動解析をしようと試みました。

    import wav と入力すると、name ‘wav’ is not definedと出たので、
    import wave 入力して行い、次に data, samplerate = wave.waveload(path)と入力すると、AttributeError: module ‘wave’ has no attribute ‘waveload’とエラーが出ました。どうすれば解決するでしょうか。

    1. wat wat より:

      ご訪問ありがとうございます!
      記事がわかりにくくて申し訳ございません。
      この記事では、「wav.py」というファイルにdef文を記入し、同フォルダに作るメイン実行ファイルでwav.pyをインポートする仕様でした。

      wav.pyはご用意されていますでしょうか?waveというのはPythonのその他ライブラリ名なので「そんな属性はありません」と出たと考えられます。

      とはいえ、本記事はわかりにくかったので、「追記:関数ファイルを使わないで一度に書く」にたった一つだけのPythonファイルで実行できるようなコードを追記しました。
      まずはこちらの内容で再度ご確認いただけませんでしょうか?

      よろしくお願い致します!

コメントを残す

*