WAVデータからスペクトログラム生成をGoogle Colaboratryで行う 音処理 第2回

音データを変換して画像情報にする方法のうち、Python言語で簡単に生成可能なのは(1)時間-音圧グラフと(2)スペクトログラムである。
音データを材料とした機械学習では、スペクトログラム画像を生成して学習させるものが多い。
今回はGoogleドライブに置いたWAVデータからスペクトログラムを生成する。 

前回はWAVデータから時間ー音圧グラフ作成(詳細は以下の記事を参照)

まずColaboratory起動して[ノートブックを新規作成]クリック。:詳細記事

Googleドライブをマウント(忘れないように注意!!)
画面左のフォルダから、[ドライブをマウント]アイコンクリック。
さらに[Googleドライブに接続]クリック。(しばらくColaboratory起動しなかったときの反応については後述)

ドライブのマウント完了。使用するwater01.wav(前回アップロードした)も確認できた。

スペクトログラム生成コードの記述と実行

コードを記述して実行したら、スペクトログラムが描画された。

コード全体と実行結果が以下。

Saveした”water01.png”が画面左のフォルダ内に出現する。
このファイルファイルのはGoogleColab上であり、一度ノートブックを閉じたり、時間が経過すると消えてしまう。
消えないようにしたい場合には、保存場所をGoogleドライブにする。

ノートブック名を変更して保存する。
「ファイル」から「保存」選択で、保存された。

コードの詳細説明

忘れても思い出せるよう、以下にコードの説明を記述する。
初めに使用するモジュールをインポートする。
① numpyインポート
② waveインポート
③ 高度科学技術計算ライブラリscipyのモジュールscipy.signal(信号処理用)インポート
④ matplotlib.pyplotインポート
⑤ mathインポート

入力データと出力先のパスを定義して、wavデータを開いて、読み込んで、利用できるように変換する。
① 入力ファイルのパスを設定
② 出力ファイル名(パス)設定。ここをドライブ内に設定するとドライブに保存できるのかも。
③ モジュールwaveでwavデータを開く。
④ .readframes(サンプル数)関数で音圧データ配列を取得。サンプル数は .getnframes()関数で取得する。
⑤ 読み込んだバイナリ型(0と1)データを16ビット(このデータが2バイトであることは事前に分かっているため)整数値に変換。
⑥ データは2チャンネル(左右)で記録されているので、データ(行列)から左のみ取得。

次が今回のメインパート。スペクトログラム描画のためのデータ作成。
短時間フーリエ変換(Short Time Fourier Transform)を計算する。
① sp.stft(x,fs)は、測定値の時系列(x)とxのサンプリング周波数(fs)入力で、周波数の配列(f)セグメント時間の配列(t)xのSTFT値の配列(Stft)を戻り値とする。
サンプリング周波数は、前回同様 .getframerate()関数で取得。
② Stft値を対数表示に直す必要があるらしい(戻り値の状態が分からないので理由は不明)。

グラフの設定を行う。
メインは5行目のplt.pcolormesh()関数。X,Yグラフに正方形を並べて正方形の色でその座標(X,Y)での強さを表現するカラーマップ(グラフ)。ヒートマップの生成に利用される。似た関数に .pcolor()があるが .pcolormeshの方が描写が早いらしい。
① グラフの描画領域を設定。単位はインチ。
② グラフのタイトル設定。
③ x軸のラベル設定。
④ y軸のラベル設定。
⑤ カラーマップ(スペクトログラム)描画。関数plt.pcolormesh(x,y,data)で座標(x,y)の四角にdataの値に対応した色を着色する。cmapはカラーマップの色を指定するパラメータで、デフォルトは‘viridis’で紫―緑-黄(後述)。‘jet’は青-緑-黄-赤と変化が大きいので色の変化を感じやすい。
⑥ 画像を定義したファイル名(パス)で保存

実行結果

実行結果

いくつかの気付き項目

余談1:しばらくColaboratory起動しなかった後に、“ドライブをマウント”アイコンを使用しようとしたところ、ドライブをマウントするコードが自動で記述出現し、実行するように促された。実行すると以前の投稿と同様に接続可能であった。その後はまたアイコンが使えるようになった。

余談2:生成データの保存先にGoogleドライブ内を指定したら、ドライブ内に保存された。

余談3:グラフ描画時の関数で、cmapをデフォルト(‘viridis’)とすると。

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

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