Keras CNN で 音の分類 #2。
ディープラーニングで音声分類 のサンプルが出ていたので、試してみました。
Keras CNN Sound Classify
で、学習済データが出来上がったので、
アプリケーションとして、
Window10 の MIC から音を取り込んで、
上記分類器にかけるプログラムを作ってみました。
環境
Windows10
マイク
USB カメラ / ロジクール ウェブカメラ C270n
↓
XIAOKOA PCマイク USBマイク
プログラムは下記になります。
sound-predict3.py
Windows10 に繋がった USB カメラのマイクから音を拾って、
当初、HeadPhone から音をモニターしながらテストできる仕様でしたが、sound-player.py でテストする事にしたので止めました。
性能は、今は、ほどほどですが、後述のマイク入力後の高音域の減衰が改善できれば、もっと
良くなりそうです。
後述の、MobileNet v1 もそれなりに、判定できます。
マイクは、USB カメラのマイクでは無くて、出来るだけ性能の良い物を使った方が良いと思います。
MEMSマイクロフォン IM69D130 を使ってみたいですが、これは、どうやって使うのか?
https://www.macnica.co.jp/business/semiconductor/articles/infineon/129257/
市販の完成品は無いのかな?
使ってみて気が付いたこと。
変更1.
MICからの入力データを、2**15(32768) で一律割るように改めました。 2010.1.27
dx = np.frombuffer(data,dtype="int16").astype('float32')/2**15
変更2.
メルスペクトグラムデータの正規は、train.py に倣って、+- のまま、一律 4.1 で割ります。 2010.1.30
変更3.
テストには、下記の、sound-player.py からスピーカに音を出して、それをマイクで拾って、
試験する方法に改めました。2010.2.5
オリジナルのWAVの波形と、マイクで拾った波形を、どちらも、
matplotlib.pyplot で表示してみると、どうしても マイクで拾った音が短くなるみたいです。
これが改善できれば、もう少し判定結果が良くなるかもしれません。
変更4.
上記点に関して、sound-player.py にバグがありました。 2010.2.6
#output = stream.write(j)
output = stream.write(j,j.shape[0]) <- データ長の指定が必要です。
WAV データと、マイク入力されたデータのメルスペクトグラムを見比べて気が付いたのですが、
マイク入力データでは、高音域 の減衰が大きい様です。
これが、どこで生じているのか、スピーカの特性か、マイクの特性かはまだ分かりません。
ここが改善されれば、もっと良くなる気がします。
この点に関して、スピーカーが、ダイソーで買った300円の物なので、仕方がない。
但し、Windows10 の Sound の設定で、イコライザーが使えれば、高音域を補整して試して
みます。
ESC-50 の WAVデターを直接渡してのテストでは、正解率 0.95 程出ているので、
スピーカー > マイク 経由でも、同じESC-50 の WAVデターを使ったら、理屈上は、正解率 0.95
程は、出るはずなので、後は、プログラムの実装上の問題になるのか? (2010.2.7 by おんちゃん)
Realteck HD オーディオマネージャで、高音をブーストすれば、結構よくなりました。2010.2.7
sound-player.py