WAVデータから時間-音圧グラフ生成をGoogle Colaboratryで行う 音処理 第1回

デジタル音データを処理したい。今後の機械学習やAIでの音分類への展開を考え、Google Colabで行う。
使用する音データに:WAV方式(.wav)
理由:WAV拡張子のデータは重いが生データに近いとのこと。

音データの処理に、音を画像に変換して行う方法がある。
音データを変換してできる画像のうち簡単なものは(1)時間-音圧グラフ(2)スペクトログラム。
これらはPythonであまり苦労なく生成できる。

今回は、水が流れる音データから時間-音圧グラフを作成する。
具体的には、音データ“water01.wav”を、Googleドライブにアップロードした後、Google Colabでグラフを作成する。

WAVデータをGoogleドライブにアップロード

デスクトップにWAVデータ設置。Googleにログインして、[アプリ]→[ドライブ]クリック。

Googleドライブ画面になるので、[+新規]クリック。
デスクトップの“water01.wav”ファイルを選択し[開く]クリック。
“ファイルのアップロード”を選択。

少し待っていると、アップロードが完了し、ドライブ内にデータが確認できた。

Google Colaboratry起動

このデータを使う。
ブックマークから“Colaboratoryへようこそ”クリックして、Colaboratory起動。
“ノートブックを新規作成”をクリック。

Googleドライブをマウントする

画面左のメニューからフォルダアイコンをクリックして、[ドライブをマウント]アイコンをクリック。
[Googleドライブに接続]クリックして、ドライブのマウント完了。
“water01.wav”ファイルもちゃんと表示されている。

時間ー音圧グラフのコード実行

WAVデータから時間ー音圧グラフを生成するコードを記述して実行したところ、無事に“water01.wav”の時間-音圧グラフが表示された。
コードと実行結果を図に示す。

ファイル名を変更後、[ファイル]→[保存]として、終了。

コード内容の詳細説明

時間が経つとコードの意味を忘れてしまう(1,2か月他の事をやっているとすっかり分からなくなってしまう今日この頃)ので、以下にコードの説明を記述しておく。

はじめに使用するモジュール(ライブラリ?)をインポートする。
①wavデータを読み込むためのモジュール(wave)をインポート
②数値演算用モジュール(numpy)をインポート
③グラフ作成モジュール(matplotlib)インポート

使用するファイルと保存先のパス(場所)を指定する。
①開く予定のwavファイルのパス(ドライブのなかにあれば、/content/drive/MyDrive/までは同じ)を指定
②生成画像の保存先のパス()を指定。

ファイルからデータを取得する。
①wavファイルをwaveで開いて変数wavに入れる。ここからはこのwavを操作する。
②wavのサンプリング周波数情報(1秒間にサンプリングした音圧の値の個数)取得
③wavのサンプルサイズ(音圧値の目盛り数.単位はバイトであることに注意)を取得
 サンプルサイズは2のべき乗値が多く、特に16ビット=2の16乗=65536個=2バイトが多い。
④wavのチャンネル数(録音された際のマイクの数)取得
 1だとデータが[右右右・・・右]、2だと[左右左右・・・・左右]と収まっている。
⑤wavのデータ全体でのサンプル総数(記録されている音圧値の個数)取得

wavに入っている音圧値を読み込んでグラフ描画に利用できる形に変換する。ここが、データ処理のメイン部分。
①wavから各サンプルに対応する音圧値を全サンプル分読み込み、データをwaveformとする。
  .readframes(読み込むサンプル数)のコードで読み込みを行う。
②読み込んだ時点ではバイナリ型(0か1の2進数)であるwaveform内のデータを、16ビット整数型に変換する。
 16ビット整数は216 (=65,536) 種類の値を保存することができる。
  符号なしの表現では、0 から 65535 までの整数値となる。
 符号ありなら、-32768 から 32767 まで)に変換する。
 16ビット整数値に変換するのはサンプルサイズが2バイト=16ビットだからかな。
③WAVデータが 2チャンネルで保存さているので、片方の音圧値だけ取り出す。
 左だけならleft=data[::2]([0::2]と同じ?0番から1つおき)
 右ならright=data[1::2]

実行結果の表示について指定する。%の使い方は、print(“%d” %値A)と記述した場合、値Aをdの部分に整数(0,1,2,3・・・)にして(これがdの意味)結果に書き出すといこと。
①サンプリング周波数書き出し
②サンプルサイズ書き出し
③チャンネル数書き出し
④サンプル総数書き出し

グラフの設定と描画
①グラフのx座標の値(データは行列となる)の作成し、time_axis(単位は秒)にする。
 np.arange(サンプル数)で、[0,1,2,・・・,サンプル数-1]というサンプル数分の要素の行列ができる。これを周波数で割ることで、行列の各要素の単位が(秒)に変換される。
②プロットの描画領域作成。figsize=(横幅, 高さ)で記述する。単位はインチ。
③グラフを描画する。plt.plot(x,y)で(x、y)座標の折れ線グラフ作成。
 time_axis, waveformともに行列。初めにx軸行列のn番目の値を取り出して、次にy軸行列のn番目の値を取り出す。そしてその座標にプロットする。そして線でつなげる。
④x軸のラベル名定義
⑤y軸のラベル名定義
⑥x軸の表示領域を0秒~波形終了時刻(秒)に設定する。
  ここを工夫すれば任意の時間(例:開始後2~3秒)に設定することもできるかもしれない。
⑦グラフの保存

実行結果

参考書籍:Pythonで学ぶWAVプログラミング 北山洋章著、Pythonで学ぶ音声認識 高島遼一著

タイトルとURLをコピーしました