読者です 読者をやめる 読者になる 読者になる

人工知能に関する断創録

人工知能、認知科学、心理学、ロボティクス、生物学などに興味を持っています。このブログでは人工知能のさまざまな分野について調査したことをまとめています。最近は、機械学習・Deep Learningに関する記事が多いです。



統計的声質変換 (2) ボイスチェンジャーを作ろう

音声信号処理 音声合成

統計的声質変換 (1) ロードマップ(2015/2/11)の続き。

統計的声質変換の第二回ということでまずは統計的じゃない声質変換の枠組みで簡単なボイスチェンジャーを作ってみたい。いきなり本題とずれているけれどここをしっかり理解できていないと統計的な方はまったく歯が立たないため整理しておきたい。

ソース・フィルタモデル

人間の音声は、ノドの声帯を振動させたブザー音が声道、口、唇を通過することで出てくる仕組みになっている。これを数学的にモデル化したのがソース・フィルタモデル

f:id:aidiary:20130119110259p:plain http://www.kumikomi.net/archives/2010/08/ep30gose.php から引用

このモデルでは、音源にあたるブザー音を作り出し、ブザー音をディジタルフィルタに通すことで音声を作る。音源のパラメータとして声の高さを表すピッチ、声道のパラメータとしてメルケプストラムというのがよく使われる。メルケプストラムは音韻を表すだけでなく、個人の声質の特徴も表している。

f:id:aidiary:20130119105645p:plain http://www.kumikomi.net/archives/2010/08/ep30gose.php から引用

簡単にまとめると「人間の音声からピッチとメルケプストラムというパラメータを抽出でき、そのパラメータからフィルタを用いて音声を再合成できる」ってところが非常に重要になる。最初に勉強したときはここがピンとこなくてずいぶん苦労した・・・*1

ボイスチェンジャーを作ろう

簡単なボイスチェンジャーは、音声からメルケプストラムとピッチを抽出し、それらのパラメータに何らかの変換を施したあとに再合成することで実現できる。

f:id:aidiary:20150224222047p:plain

上の図でmcep、pitchなどのコマンドが書いてあるが、これらはSPTKという音声信号処理のツールのコマンドを表している。SPTKを使うとパラメータの抽出や変換がコマンドの組み合わせで簡単にできる。今回はこれを使って簡単なボイスチェンジャーを実装してみた。SPTKの具体的な使い方は前に書いたことがあるので今回は触れない。

マイクから自分の声を入力し、SPTKでパラメータを抽出・変換・再合成し、スピーカーから変換した声が出てくるスクリプトを作ってみる。

このスクリプトを実行するには、PyAudioというPythonの音声ライブラリが必要。音声の録音と再生に使っている。SPTKのコマンドもパスが通ったところに置く必要がある。SPTKのインストール方法は、SPTKの使い方 (1) インストール・波形描画・音声再生(2012/7/1)を参照。あとパソコンに接続したマイクも必要。

スクリプトを起動する(-uをつけないと出力がバッファリングされて表示されない場合があるので注意)と、*** Now recording ... (10 sec)と出てくるので適当に10秒しゃべるとしばらくして変換された音声がスピーカーから流れるようにしてみた。

$ python -u easy_vc.py
*** Now recording ... (10 sec)
*** extract pitch ...
*** extract mel cepstrum
*** modify parameters ...
*** play!

コードの下の部分はどれか1つコメントを外しておくといろいろな声が出せる。

     # どれか一つしか有効にできない
     # modify_pitch(0.3, pitch_file, mcep_file, output_file)
     # modify_speed(300, pitch_file, mcep_file, output_file)
     # hoarse_voice(pitch_file, mcep_file, output_file)
     # robot_voice(100, record_seconds, mcep_file, output_file)
     # child_voice(pitch_file, mcep_file, output_file)
     deep_voice(pitch_file, mcep_file, output_file)

管理人の声で試してみた

元の音声は恥ずかしくて投稿できないので変換後の音声だけ・・・

ロボット声

太い声

子供声

えー、管理人は男です(笑)

これから実験していく統計的声質変換は先の図のパラメータ変換のところを統計的な変換モデルにした場合にあたる。具体的に言うと混合ガウスモデル。今回作ったようにピッチを上げたり、αパラメータでメルケプストラムをいじるような単純な変換ではなく、Aさんの声のメルケプストラムをBさんの声のメルケプストラムに変換するモデルを音声データから学習するというのがポイント。というわけで次回から始めたい。

実はもうほとんどできているので次の投稿は早いと思う。

*1:実は今でもフィルタの原理が理解できていない・・・@r9y9さんのこちらの記事が参考になりそう