コナンくんのアレを作る技術

皆さんおはようございます、ネフロックの@siwazaki1 です。

ネフロックではただいま絶賛「リアルタイムで声質を変換するハードウェア KUROFUNE」 を開発中です。 KUROFUNE は FPGA を搭載したイヤホンで、FPGA 部分で声質を変換する処理を行います。 今回はこの声質を変換するアルゴリズムについてのブログを書きたいと思います。

といっても、自分は特に音声処理に関して詳しいわけではないので、声質変換に関して広く浅く調査したことを記録もかねてつらつら書きたいと思ってます。

ディープラーニング到来

突然ですが、いま音声処理に大きなブレイクスルーがおきてます。

@hiho_karutaさんのこのツイートの合成音声を聞いてみてください。

自分の声を他の10人の声に変換していますが、よくあるありがちな機械的な音声と比較して 物凄い自然に聞こえます。

またこの「AI きりたん」というソフトは物凄い自然な声で歌ってくれます。

AIきりたんは、NEUTRINOという@shachi_krtnさんが開発した、 AIを使って歌わせる東北きりたん音声合成ソフトウェアです。

楽曲データをmusicxmlというフォーマットで書き出し、その情報をもとに今まできりたんが歌ってきた曲を参考に歌う(ボコーダーで音声化する)ソフトです。

これらの新しめの音声処理に共通して使用されているのが、やはりというか、やっぱりというか、ディープラーニングです。 画像処理の分野でブレークスルーをもたらしたディープラーニングが数年前から音声処理にもやってきたわけです。

声質変換とは?

声質変換とは「音声を別の個人あるいはキャラクターの音声に変換する手法」で、これについては次の DeNA の方のスライドがわかりやすかったです。

f:id:nefrock-nefrock-nefrock:20200317102448p:plain
声質変換の概要と最新手法の紹介より引用

人の声というのは、3 つの要素

  • 声の高さ(F0)
  • 声質(スペクトル包絡)
  • かすれ具合(AP)

で構成されていて、声質変換は上記のうち主に声質を変換する処理です。 声質変換の手法は変換対象の人数や、学習に用いるデータの種類によって細かく分類されます。

変換対象による分類

変換元、変換先が単数なのか複数なのかによる分類です。主に3つに分かれます。

  • one-to-one ある特定の人の声を、ある特定の人の声に変換する。e.g. のび太くんの声をドラえもんの声に変換

  • many-to-one 複数の人の声を、ある特定の人の声に変換する。e.g. のび太くんとしずかちゃんの声をドラえもんの声に変換

  • many-to-many 複数の人の声を、複数の人の声に変換する。e.g. のび太くんの声をドラえもんの声に変換し、しずかちゃんの声はのび太くんの声に変換

さらにあらかじめ学習データにない人の声を変換するzero shotの変換などもあります。

学習データによる分類

学習に使用するデータによっても2つに大別されます。

  • パラレルデータ 全ての人が同一の文を読んでいる音声が必要
  • ノンパラレルデータ なんの文でもいいので、各人の音声データがあればいい

パラレルデータは入手しづらいですが学習が比較的容易で、ノンパラレルデータはその逆で、手に入りやすいですが学習が難しい傾向にあります。

声質変換の手法

上記の分類に基づいて、自分が調べて良さげだった手法を表にまとめました。

パラレルデータ ノンパラレルデータ
one-to-one たくさんあるので割愛 CycleGAN-VC
many-to-one NNだとない? Deep Voice Conversion
many-to-many NNだとない? AutoVCStarGAN-VC

ニューラルネット(NN)を使った手法だと、パラレルデータよりノンパラレルデータを使用した手法の方が多かったです。 大量のデータが必要なディープラーニングでは、パラレルデータを用いるのは難しいのかもしれません。

試作してみた

調べただけではあれなので、まずはFPGAではなく、PC上で声質変換をやってみました。

KUROFUNE では任意の人の声をあるターゲットに変換したいので、上の分類でいくとmany-to-one、もしくはmany-to-manyの手法をノンパラレルなデータを用いて学習させたいです。

ただいきなりそれらを作るのは大変なので、今回は one-to-one でノンパラレルなデータで学習するCycleGAN-VCを実装してみました。 CycleGAN-VCの詳細は上記リンクを見ていただければと思いますが、参考までに、音声の生成を行うGeneratorのネットワーク構造は結構シンプルでこんな感じです。

f:id:nefrock-nefrock-nefrock:20200317133046p:plain
CycleGAN-VCより引用

この手法を使って自分の声を、ある有名人の方の声に変換してみました。

変換前の声がこれで、

この声を変換した声がこれです。

みなさん、誰の声に変換したかわかったでしょうか?

この声はなかなかうまいこと変換できたと思っているのですが、長文や雑音が入った音声だとまだまだ品質的に改善の余地がありました。

今後の予定

AutoVCなどmany-to-oneの手法について調査をしていきたいと思います。

また、ボコーダーとしてWaveNet、もしくはその高速化したWaveGlowParallel WaveNet を使う予定なので、これらをFPGA上になんとか実装したいと思ってます。

いやーまだまだやることいっぱいあるぞー

なにか進展があればまたブログに書きます