Pythonでフォルダ内全wavをスペクトログラムに変換してみた

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

音声ファイルをスペクトログラム表示することで、音声の周波数・時間・レベルの変化を一度に確認することが可能です。ここではさらにフォルダ内に保存された全wavファイルに対しSTFT計算し、スペクトログラム画像を作成する方法を紹介します。

こんにちは。wat(@watlablog)です。ここではフォルダ内一括処理のスペクトログラム版を紹介します

STFTとスペクトログラム表示のおさらい

STFT/スペクトログラムとは?

STFTShort-Time Fourier Transform : 短時間フーリエ変換)とは、フーリエ変換を応用した計算方法のことで、時系列データを細かく窓(フレーム)で区切ってFFTし、その窓を順次横にずらしながらFFTを繰り返していく解析方法です(下図参考)。

STFTの説明

一方、スペクトログラムとは時間×周波数×振幅レベルという3つの要素で構成された3次元グラフのことで、STFT計算した結果をそのように並べてプロットしたものになります(下図参考)。

spectrogramの例

STFTやスペクトログラムについての詳細な説明、Pythonコードは「Pythonで音のSTFT計算を自作!スペクトログラム表示する方法」に記載しましたので、是非確認してみて下さい!

スペクトログラムの例

当WATLABブログでは、STFT計算とスペクトログラム表示を使ってピアノ音楽の可視化を行った「Pythonでピアノ音楽のスペクトログラムを作ってみた」や、自分の声の声帯振動やフォルマントを確認した「Pythonの音声解析でフォルマントを抽出してみた」で記事を書いていますので、ご興味のある方は是非こちらもご覧ください!

フォルダ一括処理の考え方

上記で紹介した記事は1つの音声ファイルやデータに対して1つのスペクトログラムを作成するコードを書いていました。

プログラムはコンピュータに沢山仕事をさせるのが良いと思いますので、できるだけ自動化させたいですね。

自動化の基本的な考え方に、「フォルダに関連ファイルを全て入れて、その中のファイルを一括で処理する」というものがあります。

当WATLABブログでは「Pythonでフォルダ内の画像を自動一括リサイズする方法」という記事で初めてフォルダ内のファイル一括処理を行いました。

基本的な知識は「フォルダ内のファイルパスを取得する」、「パスをファイル名と拡張子に分ける」、「新規パスを作る」、「作ったパスで保存する」というものがあれば十分と考えます。

今回はwavファイルを任意のフォルダに複数入れた状態でプログラムを実行し、フォルダ内のwavファイルを全てスペクトログラム画像に変換、.png画像を保存フォルダに格納するという処理を書きます。

それでは早速Pythonコードを見てみましょう!

フォルダ内全wavをスペクトログラム画像に変換するPythonコード

準備

まずプログラムを実行する.pyファイルフォルダの直下に、「wav」というフォルダに予めwavファイルを複数置いておきます。

参考までに以下に図として示します。

フォルダ構成

サブプログラム(function.py):STFTの計算に使う関数群

Pythonで音のSTFT計算を自作!スペクトログラム表示する方法」の記事と同様に、STFT計算をするコードは長いので関数ファイルとしてまとめておきます。ここでは「function.py」というファイル名です。

メイン処理(multiple-stft.py)

続いて、メインのファイルを以下に示します。import文で先ほどのfunction.pyを読んでいるのはこれまでと同様ですが、フォルダやファイル処理を行うために、globosも読み込んでいます。

詳細の説明はコード内にコメントを書きましたので参照下さい。

実行結果

以下が実行結果です。spectrogramというフォルダ内にwavファイルと同様の名前の.pngファイルが作成されました。

実行結果

まとめ

本記事では過去のSTFT計算によるスペクトログラム画像の生成をおさらいし、フォルダ内wavファイルに対し一括スペクトログラム処理をしてみました。

このフォルダ内ファイル処理は様々な自動化の基本になりますので、是非応用してみて下さい。

今回は覚えたコードを組み合わせて音声ファイルの自動処理をしてみました!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!

SNSでもご購読できます。

コメントを残す

*