GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

andabi

deep-voice-conversion – Tensorflowにおける音声変換(音声スタイル転送)のための深いニューラルネットワーク

投稿日:

Tensorflowにおける音声変換(音声スタイル転送)のための深いニューラルネットワーク

非パラレルデータによる音声変換

字幕:Kate Winsletのように話す

著者:Dabi Ahn( andabi412@gmail.com )、 Kyubyong Parkkbpark.linguist@gmail.com

サンプル

https://soundcloud.com/andabi/sets/voice-style-transfer-to-kate-winslet-with-deep-neural-networks

イントロ

有名な有名人の声を真似たり、有名な歌手のように歌えたらどうですか? このプロジェクトは、誰かの声を特定のターゲット声に変換するという目標から始まりました。 いわゆる、ボイススタイルの転送です。 私たちは、誰かの声を有名な英国の女優ケイト・ウィンスレットの声に変換することを目指すこのプロジェクトに取り組みました。 我々はそれを達成するために深いニューラルネットワークを実装し、ケイト・ウィンスレットによって読み込まれた2時間以上のオーディオブック・センテンスがデータセットとして使用されています。

モデルアーキテクチャ

これは多対1の音声変換システムです。 この作業の主な意義は、<sourceのwav、targetのwav>、<wav、text>、<wav、phone>のようなパラレルデータを使わずに目的の話者の発声を生成できることです。 これらのパラレルデータセットを作るには、多くの労力が必要です。このプロジェクトで必要なのは、対象とする話者の発声の波形の数だけであり、多くの匿名のスピーカーからの<wav、phone>ペアの小さなセットです。

モデルアーキテクチャは2つのモジュールで構成されています。

  1. Net1(音素分類)は、誰かの発声を音韻クラスの1つにタイムステップ毎に分類する。
    • 音素は話者に依存しないが、波形は話者に依存する。
  2. Net2(音声合成)は、電話機から目的の話者の音声を合成します。

Tacotronで言及されているCBHG(1次元畳み込みバンク+ハイウェイネットワーク+双方向GRU)モジュールを適用しました CBHGは、順次データからフィーチャをキャプチャするのに適していることが知られています。

Net1はクラシファイアです。

  • プロセス:wav→スペクトログラム→mfccs→音素dist。
  • Net1はスペクトログラムを毎時60音の音素からなる音素に分類します。
    • 各タイムステップについて、入力は対数振幅スペクトログラムであり、ターゲットは音素distである。
  • 目的関数はクロスエントロピー損失です。
  • TIMITデータセットが使用されました。
    • 類似の文章を話す630人の発言者と対応する電話が含まれています。
  • 70%を超えるテスト精度

Net2はシンセサイザーです。

Net2には、サブネットとしてNet1が含まれています。

  • プロセス:net1(wav→スペクトログラム→mfccs→音素dist)→スペクトログラム→wav
  • Net2は、ターゲットスピーカーのスピーチを合成します。
    • 入力/ターゲットは、ターゲット話者の発話の集合である。
  • Net1は既に前のステップで訓練されているので、残りの部分だけがこのステップで訓練されるべきです。
  • 損失は​​入力とターゲットの間の再構成誤差です。 (L2距離)
  • データセット
    • Target1(匿名の女性): 北極のデータセット(公開)
    • Target2(Kate Winslet):2時間以上のオーディオブックの文章を読んでいる
  • スペクトログラムからwavを復元するときのGriffin-Lim再構成

実装

要件

  • Python 2.7
  • テンソル流= 1.1
  • numpy> = 1.11.1
  • librosa == 0.5.1

設定

  • サンプルレート:16,000Hz
  • ウィンドウの長さ:25ms
  • ホップ長:5ms

手順

  • 列車フェーズ:Net1とNet2は逐次訓練されるべきである。
    • Train1(トレーニングNet1)
      • train1.pyにはeval1.py 、testにはtrain1.pyを実行します。
    • Train2(トレーニングNet2)
      • 列車にはeval2.pyを、テストするにはtrain2.pyを実行します。
        • Train1が完了したらTrain2を訓練する必要があります!
  • 変換フェーズ:Net2にフィードフォワード
    • convert.pyを実行して結果サンプルを取得します。
    • Tensorboardのオーディオタブをチェックしてサンプルを聞きます。
    • 音素distを見てください。 テンソルボードの画像タブでの視覚化。
      • x軸は音素クラスを表し、y軸はタイムステップを表す
      • x軸の第1のクラスは無音を意味する。

ヒント(このプロジェクトから学んだこと)

  • ウィンドウの長さとホップの長さは、音素のみに収まるように十分小さくなければなりません。
  • 明らかに、サンプルレート、ウィンドウの長さ、およびホップの長さは、Net1とNet2の両方で同じでなければなりません。
  • ISTFT(スペクトログラムから波形)の前に、1.0〜2.0の累乗を適用して予測スペクトログラムを強調することは、騒音を除去するのに役立ちます。
  • Net1のソフトマックスに温度をかけることはあまり意味がないようです。
  • IMHO、Net1(音素分類)の精度は完全である必要はありません。
    • Net1の精度がある程度正しい場合、Net2はほぼ最適に近づくことができます。

参考文献







-andabi

執筆者: