概要
自分の声が誰に似ているか気になりますよね!
今回はWebアプリにて似ている声の人を診断してくれるアプリを作ってみました。
早速ですが、作ったサイトはこちら↓
実際の動作
スマホ上でこんな感じで動きます。
仕組み(解析)
入力された音声に対して、①特徴量の抽出を行い、②機械学習によって似た声を解析しています。
①特徴量の抽出
音声の話者の特徴を表すMFCC(メル周波数ケプストラム係数)を特徴量として抽出しています。
ケプストラム係数は、声道の特性(低周波数で変動)と発話内容の特性(高周波で変動)を分離して前者を抽出します。(信号 → FT → abs() → log → 位相アンラッピング → FT → ケプストラム)
これにより、発話中にはほとんど変動しない特徴量が得られます。
これが私が話した10秒ほどの音声データからMFCCを抽出したもので、発話部分では似た強度になっていることが分かります。
今回は、計算量の削減と、データ入力サイズを揃えるために、発話中のMFCCに対して時間方向に平均を取ったものを特徴量としています。
②機械学習
①の特徴量抽出で得られたデータを、SVMを用いた分類器で分類しています。
実際の入力は42次元の特徴量になります。
やっていることは、標準化してSVMで学習するだけです。
このデータをさらに標準化し、ローカル環境で、SVMを用いた分類器を作成しています
測定結果の入力に対して、分類結果を返します
仕組み(構造)
使ったことのあるpythonを使用しています。
webアプリを作れるライブラリのdjangoを用いています。
実装としてはそこまで珍しいことはしていないはずです。
webアプリ初心者なので、ひたすら調べながら実装しました。
実際に作成したイメージは以下の画像の通りです。
- 測定部
- getUserMedia() を使っています
- なので、httpでは通信できません
- wavファイル形式で測定するならこの方法が一番かと思います
- 通信部
- 測定データはAjaxで送信しています
- データはbase64でエンコードしています
感想
動くところまで作れて良かったです。
本当は深層学習ベースの話者特徴量(speaker embedding)を使いたかった(ローカル環境では作りました)のですが、計算量が多いってherokuに怒られたので諦めました。
とはいっても、自分で試した限り精度は良くないのでもう少しいい方法があったら実装していきたいです。
もっと良い方法等あればコメントかTwitterで教えていただけると喜びます。
もし使ってくれるようならデータも増やしていくつもりです。
コメント
もちおさん、こんにちわ。(^^)
もちおさんの作ったこの声質チェッカで問題が発生しまして(音域チェッカでも同じ事象が発生します。)測定開始を押してひとこと話して測定停止を押しても測定中のままで、測定停止を押しても反応しません。(もちろん声質判定を押しても反応しません。)もしバグでしたら早めに直して貰えるでしょうか?どうかよろしくお願いしますm(_ _)m
こんにちは、遊んでくれてありがとうございます!
なんでなんでしょうか😓少し調べてみます😓
他の端末・ブラウザで試してみてください…!