つまりなにしたの?
友人の会社の勉強会にお邪魔して音声生成するために必要なことを勉強しつつ、
DeepNeuralNetworkを無理やり適用する方法を提案してみた。
でも、まだ計算が終わっていないし、なんなら収束しなさそう()
音声生成とは?
電車の案内とか電話案内みたいな目的地とか数字を入れかるのもそうだけど、
今回は任意のテキストを読み上げるシステムだった。
問題設定
コンテキストの情報からパラメータを予測する
これができると何ができるのか?:
- 形態素解析などでコンテキストを作成する
- コンテキストからパラメータを推測する ←ぼくが今日やったとこ
- パラメータから音声を作成する
- うわあああああしゃべったあああああああ
一般的な手法
コンテキスト[音素、モーラ、形態素、アクセント句、呼気段落、文長などなど]から
基本周波数[f0]をクラスタリングで求めて
特徴ベクトル[n次のメルケプストラム]とかその他状態量で構成されたパラメータを求めて、フレーム数分吐き出す。
それを波形に戻すとどうやら喋るらしい。
パラメータをフレーム数分求めるところはどうやら隠れマルコフモデルがよく使われるみたい。
DeepLearningとつなげたかった
せっかくの勉強会なのでナウいのをみんなでやろうということで、無理やりDeepLearningに繋げる方法を提案した。
僕が音声関係の知識がなさすぎて音声関係のデータセットの作りの難しさを見誤って申し訳ないことになったけど完成させてくれた。凄い。
DeepLearningで学習する
学習・評価データの形式
[先行, 当該, 後続, アクセント句長, アクセント句位置, アクセント型, フレーム数, 基本周波数, メルケプストラム[0...25]]
[phoneme0, phoneme1, phoneme2, accent_len, accent_pos, accent_type, frame_num, f0, mcep[0...25]]
フレーム数は当該音素になってから何フレーム目かを示す。
使ってみる時に入れる形式
[先行, 当該, 後続, アクセント句長, アクセント句位置, アクセント型, フレーム数]
[phoneme0, phoneme1, phoneme2, accent_len, accent_pos, accent_type, frame_num]
使ってみた時に出てくる形式
[基本周波数, メルケプストラム[0...25]]
[f0, mcep[0...25]]
こんな感じでやって、誤差は正しいのか知らないけど平均二乗誤差を使ってみることにした。
モデル
正規化しつつ少しずつ大きくすれば行けるかなって安易に考えたけど、
データセットができる前に作ったやつだしまだ実行終わってないからうまくいくかはわからない。
(改善の余地はいっぱいありそう…
実行結果は後ほどコミットする。
github.com
作ったコードはこちら。
おわりに
初めて音声関連のことを勉強した。
音響はすこしやってたけど音声は本気で初めてだから知らないことがいっぱい知れた。
音解析系のタスクではSPTKとSOXとかをよく使うみたいだけど、
SPTKは殆ど使ったことなかったので分厚いドキュメントを読んで勉強しようと思いました。
Speech Signal Processing Toolkit (SPTK)
SoX - Sound eXchange | HomePage