<p><a href="http://sesenosannko.hatenablog.com/about">神野さんに言われました。</a></p>

神野さんに言われました。

AIの勉強をしています @sesenosannko

自分の声を水瀬いのりさんの声にする他対1声質変換

僕は水瀬いのりさんになりたいのですが、まずは声から水瀬いのりさんになることにしました。

まだまだ満足とは言えない結果ですが一応音がでたのでまとめておきます。以下、変換の結果です。

元の音声(僕の声です)

変換後

合成音感がかなりありますが、言われてみれば水瀬さん・・・・と思ってもらえると嬉しいなぁ。むしろさとうささらへの変換だと思ったら良さそう・・・。強調したい点としては、僕の声は学習時には全く使っていないということです。この手法では学習に使っていない人でも誰の声でも水瀬いのりさんの声に変換することができます。

仕組みは下に書いてありますが、音声認識を応用した手法です。現状では学習データ量などの問題で音声認識の精度が低いので、ゆっくりはっきり話さないといけないし苦手な音が多いです。合成の質が低い理由もほとんどはデータ量の問題だと思います。


ちなみに、声コスプレという概念は既に提案されています。この川奈さんの記事は僕が音声分析を学び始めるきっかけになったものです。


参照した論文

2016年に発表されたパラレルデータが必要ない他対1声質変換の手法を提案した論文です。

http://www1.se.cuhk.edu.hk/~lfsun/ICME2016_Lifa_Sun.pdf

内容を簡単にスライドにまとめました。


音声処理の基礎的な話

このブログにいろいろと書いてあります。検索したら直ぐに出てくるし、有名なので紹介するまでもないですがかなり参考にさせていただいているので紹介します。


使ったもの

目標音声

ラジオ番組「水瀬いのり MELODY FLAG」第1回〜第5回、水瀬いのりさん発話部(音楽などが被っているものは除いてあります・約50分)。私的に録音したものです。原論文ではPPGからMCEPの変換の学習に100文の音声を使用したと書いてありますが音源の長さが明記されていません。


言語

自分で書いた部分は基本的にPythonです。


音声分析システム

MFCC・MCEPの抽出、MCEPからの音声生成にはSPTKという音声分析システムを使いました。提案論文ではSTRAIGHTが使われており、特に音声合成の方法は異なります。STRAIGHTの方が音声合成は高質ですが、STRAIGHTが僕のPCで動かなかったのとSPTKに慣れているため使いました。

Speech Signal Processing Toolkit (SPTK)


ニューラルネットワークライブラリ

提案論文では音素認識ではKaldi、音声生成ではCURRENNTというものが使われていますが、そもそも提案論文では設定がそれほど詳しく書いてあるわけではなく合わせる必要もないのでKerasを使います。Kerasは簡単に実装できることと、Bidirectional-LSTMが標準で実装されていることも大きいです。

Layer wrappers - Keras Documentation


コーパス

音素認識(PPGを生成する場合)では音声に対して時間ごとに発せられている音素のデータが必要になります。このようなデータは日本語でも存在しますが、私が知る限りは取得に数万円かかります。そこで、音声認識システム用ツールキットJuliusの「音素セグメンテーションキット」を活用します。日本語向けに開発をされていることが非常にありがたいです。

ちなみにJuliusは公式にはMac非対応ですが、一応使えます。

これを使えば、音声ファイルと音声をひらがなで書き起こしたファイルから、時間ごとに発せられている音素のデータを生成してくれます。スペースを入れる場合はテキストで明示する必要があること、音声ファイルの長さは30秒程度が限界ということは面倒な点です。結果で出力されるlab形式はWaveSurferという音声分析アプリのファイル形式ですので、WaveSurferで結果と音声を照らし合わせることができます。

以下は結果の一例です。有名な「あらゆる現実を」の文章です。幾つかの例を見た限りでは良い精度だと思います。

f:id:sesenosannko:20170319234404p:plain

音声ファイルと書き起こしのみのデータなら無料でも入手することができます。今回は音声資源コンソーシアムより研究用に配布されている「 重点領域研究「音声対話」 対話音声コーパス (PASD)」を使わせてもらいました。この記事の内容は所属しているサークルでの研究活動の一環なので、その名目で申請・取得したものです。およそ100分の音声を使用しましたが、空白部が多いので発話時間はおよそ50分程度でしょう。原論文で用いられているTIMITは630名の各10文(計6300文・約5.4時間)によって構成されるコーパスであることを考えても、これは明らかに不足です。コーパスには6時間程度の音声が含まれているのですが、学習に都合が悪いものや会話音声で二人の音声が被っている音源を除いたことなどが原因です。

PASD - 音声資源コンソーシアム


実装

データを除いてGitHubで公開しています。あんまり丁寧に説明とかはしていなくてすいません。

音韻モデル

提案論文ではPhonetic PosteriorGrams(PPGs)のクラスとして131個のセノンを用いています。セノンという言葉自体は日本ではあまり使われないようですがHMM音声認識で良く使われるもので、簡単に言えばトライフォンをクラスタリングしたものです。Juliusで論理トライフォンと呼ばれているものと同じだと思います。通常は数百個以上にクラスタリングされるようです。下記資料の「コンテキスト依存モデル」で基礎的な説明がされています。

https://www.gavo.t.u-tokyo.ac.jp/~mine/japanese/nlp+slp/IPSJ-MGN451003.pdf

しかし、今回の実装では音素をそのまま扱っています。この理由は、Juliusの音素セグメンテーションで認識される日本語の音素は空白を含めて36種類と多く、当初は音声生成はLSTMで行われることから効果が薄いのではないかと考えていたからです。しかし、音素認識がネックだと分かった現在ではセノンを使ったほうが精度が向上するだろうと考えているので、できれば替えたい思っています。

SI-ASR(音素認識)

提案論文ではKaldiの中間層4つ、全1024ノードのDNNモデルを使用しています。何を使っているのか明記されていないので良くわかりませんが、原論文には拘らずSI-ASRもBLSTMで作ることにします。

入力は39番目までのMFCC+エネルギー、出力は36種類の音素で試行錯誤の結果4層のBSLTM[40-128-128-128-128-36]に落ち着きました。全層に0.3のDropout層を加えています。入力サイズは40×2000フレーム(10秒分)にしていますが、適切な長さが良く分からないので適当に設定しています。単純に全ての音源を連結して10000フレームごとに切り分けています。バッチサイズは32ですが適当です。

PPGsからのMCEP生成

こちらもSI-ASRと構造に大きな違いはありません。提案論文では[131-64-64-64-64-40]というBLSTMが用いられています。いろいろと試した結果、入力は音素事後確率とlogF0(平均0、分散1に標準化)、出力は0〜39番目のMCEPとして[37-64-64-64-64-40]としています。なお、変換目標のMCEPは標準化しており、僕の学習では分散が過小評価されてしまっていたので出力の分散を1に変換した上で正規化の逆操作をしています。無理やりの手法なので、ここは本質的な改善をしたいとは思っています。Dropout率は全層で0.3、バッチサイズ32です。MCEPの数を変更した点についてはSPTKの仕様上の都合で特に意味はありません。

日誌

LSTMのあたりから日誌を書いていました。ただのメモですが、詳細を知りたい方はどうぞ。


これから

もっと精度を向上したい。