日本声優統計学会より無償利用可能な発話データが公開されたので分析してみました。
(ソースはGitHubで公開中 https://github.com/roadroller2da/sound-recognition )
日本声優統計学会より
プロの女性声優 3 名が 3 パターンの感情で音素バランス文を読み上げたファイルです.48kHz / 16bit の WAV ファイルであり,総長約 2 時間,総ファイルサイズ 720 MB です.
この音声ファイルは主に個人での研究・分析目的でのみ無償で利用可能です.
再配布や公序良俗に反する利用などの,実演家の著作隣接権を侵害する行為は禁止します.
http://voice-statistics.github.io/
MFCC抽出
音認識でポピュラーなのはやはりMFCCということで抽出します。
scikits.talkbox.featuresを使えば簡単に特徴量抽出できるらしいのですが、今回はあえてlibrosaを使ってみました。
下2つは異なる声優さんの発話データから抽出したMFCCですが、ぶっちゃけあまり違いが分かりません。一見、色が濃い位置がほぼ一致してしまって区別困難に思えますが。。。。
ソースコード(GitHub)
https://github.com/roadroller2da/sound-recognition/blob/master/GetMFCC_librosa.py
主成分分析(PCA)
「ほんとに声だけで人を区別できるの??」と思ったので、ためしに主成分分析(PCA)で3次元に圧縮して可視化。さっきのMFCCからは想像つきませんでしたが、こうしてみると音特徴によって発話者を分離できていることがわかります。
3次元に圧縮した主成分だけでここまで分離できているので、13次元だったり26次元だったりあるMFCCならもっと正確に分離できそうな期待が持てます。
ソースコード(GitHub)
https://github.com/roadroller2da/sound-recognition/blob/master/PCA_mfcc.py
SVMによる認識
SVMで認識実行。3人の声優さんの発話データが100個ずつの計300データがあるので、半分を学習データ、残りの半分をテストデータとしました。
えっ、ちょ、認識率100%いけたやん。。。(プログラムのバグではない)
ノイズも無いしはっきりと発話しているデータなので問題設定としてEasyだったんでしょうね、きっと。言い換えると、発話者の特徴について境界線が引きやすかったのかと。
極端に少ない学習データでSVM認識
それぞれの声優さんの発話データをたった3つしか使わないで認識器構築した場合にどうなるか実験しました。深層学習と違ってSVMは学習データ量が少なくてもそこそこ動くといわれているので検証です。
結果、下記のように少ない学習データ量でも精度がそこそこ出ました。対角成分が正解で、右上や右下に色がついているのは誤った部分です。1つめと2つめのクラスは10~20%くらいの誤りが、クラス3は50%に近い誤りがありました。
今回は認識データがクリアな音声で、3クラス分類というEasyな問題設定だったのでうまくいきました。これだけでSVMは学習データが少なくても動くと結論付けるのは軽率ですが、一応それっぽい傾向の確認が出来たということで。
深層学習で認識する
流行りの深層学習(ディープラーニング)も使ってみました。音は時系列データなのでRNNやLSTMを用いるのが適切なんでしょうけど、今回は実装が慣れているシンプルなDNNを用いて、MFCCを抽出した上述の画像をINPUTとしています。
そんないい加減な実装でも9割手前くらいは達成できました。