Pythonで録音した音声をリアルタイムにスペクトログラム表示する

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

 FFTの応用であるSTFTを使ったスペクトログラムは周波数波形の時間変化がわかるため、音声解析でよく使われます。これまでWATLABブログではwavファイルや生成した波形からスペクトログラムをつくっていましたが、この記事ではリアルタイムにスペクトログラムを計算する方法を紹介します。

こんにちは。wat(@watlablog)です。ここでは録音した音声をリアルタイムにスペクトログラムにする方法を紹介します!

スペクトログラムについて

計算方法

 スペクトログラムには高速フーリエ変換FFT:Fast Fourie Transform)を短時間で行うSTFTShort Time Fourie Transform)という計算が使われています。STFTの計算方法やスペクトログラムの作り方はWATLABブログですでに説明しているので、以下の記事を参考にしてください。

Pythonで音のSTFT計算を自作!スペクトログラム表示する方法

リアルタイムでスペクトログラムを計算する目的

 これまではあらかじめ音声が録音されたwavファイルや生成した波形からスペクトログラムを作成していました。wavファイルを使えば、計算に多くのリソースを使えるので詳細な分析が可能です。しかし、その場で周波数分析をしたい時にいちいち録音してから波形分析をかけるのは若干面倒な時があります。このような場面でリアルタイム処理の需要がでてきます。

 例えばリアルタイムにスペクトログラムを目視することができれば、分析対象の音が鳴った瞬間に何[Hz]の音がどのくらいの時間で鳴っていたのかが一目瞭然です。即時分析ができると音の測定現場における生産性が上がるため、リアルタイムに処理ができるプログラムは現場の音分析担当者にこそ役に立ちます。

STEP1:リアルタイムにチャート波形を表示するPythonコード

Advertisements

並列処理のプログラミング方法

 以下の記事でPyAudioMatplotlibthreadingで並列処理するコードを紹介しています。基本的にはこの記事のリアルタイムFFTの仕組みをそのまま使います。

Check Point! : 並列処理を行うPythonコード

チャート波形を追加する

 上記記事の内容にチャート波形を追加してみましょう。チャート波形とは、任意サイズのバッファを持ったデータを表示する波形の種類です。チャート波形の動画を以下に示します。

 右側の波形がチャート波形です。10秒間のデータをバッファに保持し、流れていく波形となっています。

 このプログラムは以下のコードで作成できます。

96, 111〜117行目:チャート波形の作り方

  history_dataを用意し、 np.concatenateでデキューしたデータを繋げていきます。その後、データ長が max_chart_dataを超えたらNumPyのスライス古いデータを破棄する部分がポイントです。

データバッファの仕組み

STEP2:リアルタイムにスペクトログラムを作成するPythonコード

Pythonコード

 普通の時間波形でチャート波形を描けたら、後は次のコードでこの仕組みを利用してスペクトログラムのチャート波形を作成しましょう。

72〜79行目:スペクトログラムの初期データ

 スペクトログラムを流れるように表示させるために、まずは initial_dataとして空(0)の2次元配列を最大時間長分作成します。これを history_ampにセットしておきます。

89, 91〜95行目:スペクトログラムデータの作成

  new_ampでFFT後の振幅(Amplitude)を用意しますが、振幅として意味のあるデータはナイキスト周波数までなので // 2とデータを半分切り捨てます。スペクトログラムにした時に周波数成分が上下逆になってしまうことを防ぐために、 [::-1]で逆順に並び替えています。

97〜100行目:dB変換とプロット範囲の指定

 スペクトログラムは imにセットしますが、その際に対数の計算を行なってdBに変換します。dB変換については以下の記事を参考にしてください。
Pythonで音圧のデシベル(dB)変換式と逆変換式!

 こちらの動画が実行結果の例です。スペクトログラムが流れています!

注意点:オーバーラップ処理は入れていない

 コードを見るとわかりますが、このコードはオーバーラップ処理は入れていません。オーバーラップ処理を入れると計算量が増えるのでリアルタイム性が損なわれます。そのためより詳細な分析をするためにはwavファイルにデータを保存しておき、それをポスト処理で再度オーバーラップ付きスペクトログラム計算にかけるのが良いでしょう。
 詳細な計算の方は以下の記事を確認してください。
Pythonで音のSTFT計算を自作!スペクトログラム表示する方法

おまけ:wav保存機能付きリアルタイムスペクトログラムコード

 以下はおまけです。スペクトログラムで表示されている範囲をwavに保存できれば便利かなと思い、wav保存機能を追加してみました。

 このコードを実行すると、スペクトログラムで表示されている範囲のデータが recorded.wavというファイルに保存されます。録音の全範囲を保存するとデータ量が多くなってしまうので、実用的にはこのような仕様で問題ないと思いました。

目的とする音が測定できたらプロットを閉じるだけ!これでwavファイルが保存されます!

 ちなみにwavファイルの音量をもっとあげたい時は波形の絶対値の最大値を1にする正規化する手もあります。

まとめ

 本記事では録音した音声のチャート波形を表示する練習を行い、スペクトログラムをチャートで流してみました。この処理を行うことでリアルタイムに周波数波形の変化を目で確認できるので、現場における音分析が捗ります。
 また、最後にスペクトログラムで表示されている範囲の音声をwavファイルに保存するコードも紹介しました。

ブログ立ち上げ当初からやりたかったリアルタイムスペクトログラム計算ができました!
Xでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!

SNSでもご購読できます。

コメントを残す

*