ニートがプログラミングするブログ(はてな出張所)

ニートがプログラミングするブログです。今は主にコンピュータビジョンに関することをやっています。

ボイスチェンジャー1

統計的声質変換 (1) ロードマップ を参考にしつつボイスチェンジャーを作っていました。
先に結果を載せておきます。
データはsoftalkの女性01と男性(m4b)を使いました。
トレーニングデータは外郎売でテストデータは平家物語の冒頭です。
ただ音声の分解コマンドのオプションが良く分からなかったので、合成した結果が元の音声と違って聞こえます。
ソース(変換前の声)

ターゲット(正解の声)

変換結果(男の声を女の声に変換)


変換結果を正解データと比べるとまだまだ精度が低いですが、いろいろ試行錯誤した結果でこれなので、これ以上ボイスチェンジャーはやりたくない気分です。

トレーニングに使った外郎売は6分程度だったので、もう少しデータ数を増やせば精度が上がるかもしれません。
というか音声ファイルってaudioってタグで貼り付けられるんですね。


まだサウンドプログラミングを勉強し始めて1週間くらいなのでよく分かりませんが一応解説を書いておきます。
wavファイルはパワー・メルケプストラムとピッチに分けられるようです。
パワーは振幅なので(?)たぶん声の大きさを表します。
メルケプストラムは話している内容と声質を表します。低周波数部分が話してる内容で、高周波数部分が声質らしいです。
ピッチは声の高さです。
なので、メルケプストラムとピッチを変換すればボイスチェンジャーが出来ます。
(パワーは声の大きさなので変換しませんでした。)
上のサイトではピッチを変換していませんが、リアルタイムトーキングアバターの実現に向けたキャラクタ依存声質変換の研究ではピッチも変換しているので、僕も変換してみました。


方法:
1.上のサイトを参考にして、pythonとSPTKを使えるようにします。
2.上のサイトを参考にして、wavファイルからmcepファイルとpitchファイルを作ります。
3.上のサイトを参考にして、ソースとターゲットの音の位置あわせをします。
4.ピッチを変換する方法は、単純な行列による変換です。
[pitch_1 pitch pitch1 1]という縦4次元ベクトルを横方向につなぎ合わせます。
ここでpitch_1は1フレーム(?)前の値、pitchは現在の値、pitch1は次の値を指します。
そしてターゲットの行列にソースの行列の擬似逆行列を掛けると、変換行列が出来るのでこれを保存しておき、テストデータに掛けます。
5.メルケプストラムを変換する方法は、入力層→隠れ層(ニューロン数は100)→出力層の2層構造ニューラルネットワークを使います。
SPTKのmcepコマンドは0次元目にパワー(たぶん振幅の大きさ?)が入ってきますが、これは変換せずそのまま使うので学習時には除外します。
そしてソースのメルケプストラムを入れると、ターゲットのメルケプストラムが出てくるようにトレーニングします。
テスト時にはメルケプストラムをこのニューラルネットワークにいれ、除外しておいたパワーを先頭に付け加えて出力します。
6.上のサイトを参考にして、パワー・メルケプストラムとピッチを合成してwavファイルを作り完成です。