概要
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リポジトリをダウンロードしてきます。
加えて、ModelとVocoderをダウンロードしてローカルに保存しておきます。
必要なライブラリをインストールします。
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をそれぞれ作成します。
学習用データリストの作成用プログラム
|
f = open("Data/train_list.txt","w") f2 = open("Data/val_list.txt","w") for i in range(1,100): for k in range(1,20): if i < 80: f.write("./Data/jvs"+str(k).zfill(3)+"/parallel100/wav24kHz16bit/VOICEACTRESS100_" + str(i).zfill(3)+".wav|"+ str(k-1) + "\n") else: f2.write("./Data/jvs"+str(k).zfill(3)+"/parallel100/wav24kHz16bit/VOICEACTRESS100_" + str(i).zfill(3)+".wav|"+ str(k-1) + "\n") if i < 80: f.write("./Data/myvoice/" + str(i).zfill(4) + ".wav|19\n") else: f2.write("./Data/myvoice/" + str(i).zfill(4)+".wav|19\n") f.close() f2.close() |
あとはConfigs/config.ymlの内容を確認して学習開始です。
確認する内容は、学習用データリスト、モデルの保存先、epochあたりです。
学習再開時には、pretrained_modelも変更します。
学習を下記コマンドで開始します。
python train.py –config_path ./Configs/config.yml
結果
学習結果がこちらです。90epochを半日程度かけて学習しました。
まずは筆者(男)の声です、、、「はじめまして、もちおといいます」
変換後①(男性)
学習用データ
変換後
変換後②(女性)
学習用データ
変換後
どうでしょうか?まあまあ自然ではないでしょうか。
ちょっとノイズみたいなのも聞こえるので、さらにノイズ除去とかもしてあげるといい感じになりそうです。
ここまでできるとは思ってなかったので感動しました。
いろいろな使い道がありそうです。
学習について
学習の途中でASR(Automated Speech Recognition,音声認識)を行っていますが、そのモデルは英語用のものを使っています。
これでも日本語などの他言語の学習ができますが、よりよい精度のためには、やはりその言語のモデルを用意した方がいいみたいです。
コメント