pythonで自分の声を変換する~StarGAN~

概要

pythonで音声の変換をやってみました。

音声変換(VC:Voice Conversion)とは、人の音声を入力として、異なる人の音声を出力する技術です。
バーチャルが流行している現在、この技術も大事になってくると思います。

今回は深層学習ベースの音声変換をやっていきます。
敵対的生成ネットワーク(GAN: Generative adversarial networks)の一つであるStarGan v2を用いた音声変換です。
StarGANはこのサイト↓で説明されてますが、「単一のgeneratorとdiscriminatorで複数のドメイン変換を可能としたモデル」です。

論文まとめ StarGAN: Unified Generative Adversarial Networks for Multi-Domain Image-to-Image Translation - Qiita
はじめにStarGANをざっくりまとめてみた。literature Y. Choi, et. al. "StarGAN: Unified Generative Adversarial Networks for M...

これを使って自分の声を色々な声に変換しよう、ということですね。

以下のgithubのコードを使ってます。
デモが公開されていますが、とても自然な声質で変換ができています。

GitHub - yl4579/StarGANv2-VC: StarGANv2-VC: A Diverse, Unsupervised, Non-parallel Framework for Natural-Sounding Voice Conversion
StarGANv2-VC: A Diverse, Unsupervised, Non-parallel Framework for Natural-Sounding Voice Conversion - GitHub - yl4579/StarGANv2-VC: StarGANv2-VC: A Diverse, Uns...

当方の環境は下の通り。

  • windows 10
  • Python 3.7.7
  • GeForce GTX 1080 Ti

音声変換

上記のGitリポジトリをダウンロードしてきます。

加えて、ModelVocoderをダウンロードしてローカルに保存しておきます。

必要なライブラリをインストールします。

pip install SoundFile torchaudio munch parallel_wavegan torch pydub pyyaml click librosa

今回は、自分の声とJVS (Japanese versatile speech) corpusの話者の声を利用しています。

自分の声は、マイクで録音して学習用に整理しています。(参考:pythonで自分の声を使って音声合成する)

自分の声とJVSコーパスから19人分の声をそれぞれ100ずつ用意して、80を学習用、20を検証用にして学習します。train_list.txtとval_list.txtをそれぞれ作成します。

学習用データリストの作成用プログラム

あとはConfigs/config.ymlの内容を確認して学習開始です。
確認する内容は、学習用データリスト、モデルの保存先、epochあたりです。
学習再開時には、pretrained_modelも変更します。

学習を下記コマンドで開始します。

python train.py –config_path ./Configs/config.yml

結果

学習結果がこちらです。90epochを半日程度かけて学習しました。

まずは筆者(男)の声です、、、「はじめまして、もちおといいます」

変換後①(男性)

学習用データ

変換後

変換後②(女性)

学習用データ

変換後

どうでしょうか?まあまあ自然ではないでしょうか。

ちょっとノイズみたいなのも聞こえるので、さらにノイズ除去とかもしてあげるといい感じになりそうです。

ここまでできるとは思ってなかったので感動しました。

いろいろな使い道がありそうです。

学習について

学習の途中でASR(Automated Speech Recognition,音声認識)を行っていますが、そのモデルは英語用のものを使っています。

これでも日本語などの他言語の学習ができますが、よりよい精度のためには、やはりその言語のモデルを用意した方がいいみたいです。

コメント