CNNを使った機械学習で音声認識できるようになりました。
wav形式音声データをフーリエ変換して得られた周波数データをCNNに学習させます。
ここで実装したCNNは、入力がtrueかfalseか判定するだけの二値分類器です。
学習させたCNNを実際に使って音声デバイスからの音を判別させることもできます。
CNNの構築にはtensorflowを使っています。
また、wavファイルから読み取った音声データは、scipy.fftpackを使ってフーリエ変換しています。
実装内容の大まかにまとめると、次のようになります。
-
指定されたパスからwavファイルを読み込む
-
読み込んだwavファイルの先頭約170msを切り取り、
fftpackでフーリエ変換する。これが教師データひとつぶんとなる -
フーリエ変換後のデータは
- 横軸:時間
- 縦軸:周波数
- 輝度:振幅
の画像のようなデータになる
-
教師データをCNNに与えて
ディープラーニングする -
CNNのモデルは、
- 畳み込み層1
- プーリング層1
- 畳み込み層2
- プーリング層2
- 全結合層1
- ドロップアウト層
- 全結合層2
から構成されている
-
学習で得られたCNNのパラメータを保存
-
保存されているCNNのパラメータを読み込み、CNNを再構築する
-
pyaudioで音声デバイスを開き、音声データ取得を開始する -
取得した音声データを
fftpackでフーリエ変換 -
フーリエ変換後のデータをCNNに与える。CNNの出力結果を観察できる
-
rate : 48000 Hz
-
format : signed int 16 bits little endian
-
channel : monaural
-
python 3.5.2 -
tensorflow 1.2.1
指ぱっちんの音を学習させて実際に使ってみました。
https://www.youtube.com/watch?v=zfpo7Ow4mkc
データセットが格納されているディレクトリをwavdataset.pyに教えてあげます。
具体的には、wavdataset.pyのDatasetManager.true_dir_listには正解データが入っているディレクトリのパスを、
false_dir_listには不正解データが入っているディレクトリのパスを、それぞれ追加します。
wavdataset.pyはデータセットを管理するモジュールです。
wavdataset.pyは、指定されたディレクトリからwav形式の音声ファイルを読み込んでフーリエ変換し、
変換後のデータを集め、これをデータセットとして、他のモジュールに提供します。
データセットを使って学習させたいときはpythonインタプリタでtraining.pyを実行します。
training.pyは、所定のパスにあるデータセットを使ってCNNに学習させます。
学習が終わると、得られたパラメータを保存します。
学習パラメータはsound_recognition_model.なんたらみたいなファイルとかに保存されます。
また、training.pyでは学習後の挙動の確認用として、各入力データに対する結果をいくつか表示するようになっています。
realtime.pyは、音声デバイスから取得した音声をCNNに与えて、実際に正しく判定できるかどうか確認するためのモジュールです。
どの音声デバイスを使用するのか指定する必要があり、realtime.pyではデバイス名でデバイスを見つけ、指定しています。
使用したい音声デバイスによってデバイス名は異なるので、realtime.pyでは変数DEVICE_NAMEにて使いたいデバイスの名前を設定しています。
CNNのパラメータは、training.pyで学習したときに保存されたものを読み込んで使っています。