ESPnetで高森藍子の声を錬成した
この記事は、UEC 2 Advent Calendar 2022 15日目の記事です。
はじめに
15(あいこ)日目ということで、高森藍子について書きます。まあ別の日でも書くけど。
Advent Calendarへの参加およびブログを書くこと自体が初めてなので、稚拙なところがあるかもしれませんがご容赦ください。
Who is 高森藍子?
高森藍子はアイドルマスター シンデレラガールズ(以下デレマス)に登場するアイドルです。僕の最愛の人でもあります。
プロフィールは以下の通りです。
属性 | パッション |
---|---|
年齢 | 16歳 |
誕生日 | 7月25日 |
身長 | 155cm |
体重 | 42kg |
スリーサイズ | 74/60/79 |
血液型 | O |
出身地 | 東京 |
趣味 | 近所の公園をお散歩 |
利き手 | 右 |
CV | 金子有希 |
高森藍子の魅力については長くなるので割愛します。知りたい方は身近な藍子Pに聞いてください。僕とか。
ひとつだけ、ウエストの60という数字は、デレマスに190人アイドルがいるなかで6番目に大きい値だということを覚えて帰ってください。藍子ちゃんのぷにぷにお腹触りたいね。
邂逅
僕は高森藍子の声が大好きです。聴神経にイヤホンを直接ぶっ刺して感じたい。死ぬときは高森藍子の声に包まれて死にたい。そんなレベルです。
そんなこんなでいつものように高森藍子の声を楽しんでいたある日、こんな動画に出会いました。
?
最初意味がわかりませんでした。声真似にしては似すぎてる。継ぎ接ぎにしては自然すぎる。なんだこれ。
コメント欄を見ていたら新たな説が浮上しました。音声合成。端的に言えば櫻木真乃のVOICEROID。
こんなことが可能なのか?これが音声合成だとしたら、個人制作だとしたら、自分にもできるのではないか?そう思案しながら概要欄を見てみると
generated using VITS (Kim, Jaehyeon, Jungil Kong, and Juhee Son. "Conditional Variational Autoencoder with Adversarial Learning for End-to-End Text-to-Speech." arXiv preprint arXiv:2106.06103 (2021). ) (custom trained)
とありました。なるほど、このVITSってやつを使ってるのか。ということで早速Google先生に聞きました。持つべきは師。
……
……
……
うーん、わからん!w
英語の論文サイトみたいなものが出てきたのですが、英弱なので何もわかりませんでした。GitHubも見てみましたが、こちらも機械学習エアプの素人にはよくわかりません。
で、色々調べているうちに、VITSは最新のモデルで、それより古いモデルにTacotron2というものがあるとわかりました。
今度はTacotron2について先生に聞いてみます。愚鈍な生徒でごめんね。
先生曰く、npakaさんという方が、Tacotron2(+WaveGlow)*1での音声合成について、実行コードをそのまま貼り付けた記事を書いてくださっているとか。これならいけそう。
初めての機械学習
記事に従って、Japanese Single Speaker Speech Datasetをダウンロードし、Google Colabにコードをペタペタ貼り付けていろいろインストールしたり実行したりします。そしていよいよ学習の実行。少し緊張します。
……
……
……
できた!
よくわからんけどなんかできたっぽい。機械学習童貞卒業です。よくわからんけど。
そこから半日くらい放置しました*2。できたモデルを使って音声合成してみます。
……
……
……
喋った!
普通に感動しました。コードペタペタ貼って実行しただけですが、確かに自分で音声合成モデルを作り、喋らせることができました。どんな言葉でも喋ってくれます。
できた音声はこんな感じです。
喋らせてる内容が酷いのはスルーしてください。ちなみに何回学習回したときの音声かは忘れました。
その後学習を再開し、学習させるごとに音声の質が上がる*3ことが確認できました。機械学習すごい。
npakaさんの記事に従って、今度はデータセットをJSUTに替えて学習を行いました。ここの詳細は前述の内容とほとんど変わらないので割愛します。
Tacotron2で高森藍子の声を錬成
npakaさんは、先程のJSUTから作ったモデルを使ってファインチューニングを行い、つくよみちゃんというフリー素材キャラクターの音声合成モデルを作っていました。僕はこのつくよみちゃんの部分を高森藍子に置き換えて、高森藍子の音声合成モデルを作ることを試みました。
データ集め
機械学習なのでデータはもちろん必要です。詳細は省きますが、Mobageのアイドルマスター シンデレラガールズ(通称モバマス)から当時アクセスできるだけのボイスデータ(およそ70分)を収集し、それを文字起こし*4*5して、データセットを作りました。ここが一番辛かった。
でも、頑張れました。頑張った先に、笑顔があるって信じてましたから。
学習
npakaさんと同様にJSUTのモデルからファインチューニングしました。特に問題もなく学習に進めて一安心。しばらく待ちます。
推論
8000ステップ学習した段階で待ちきれなくなって学習を打ち切りました。藍子に早く会いたい。
ドキドキの合成タイムです。わくわく。
……
……
……
喋った!
僕の担当が言ったことのないセリフを喋りました。ついに成功してしまいました。悪魔の力です。
できた音声はこんな感じです。
僕は「本日は晴天なり」しか入力してないので、後半の謎の喘ぎには関与していません。藍子ちゃんをえっちな目で見るのはやめてください。
せっかくなのでもう少し生成音声を載せます。
「ふふっ」という笑い声もいい感じに合成できたのは驚きました。「プロデューサーさん」はデータの中に頻出するワードなので、抑揚なども自然に合成できます。
なお、ここで貼付した音声は"上手く合成できたもの"です。上手く合成できず、ノイズが混じったり、1つ目の音声のように後半部に謎の音声が入ったりすることも多くありました。あと単純に音質が悪く、機械感がまだあります。僕が目指しているのはこれなので、Tacotron2では合成音声の質に若干不満が残ります*6。
VITSを試してみる
私は帰ってきた。Tacotron2で試しながら多少知識はついたので、Qiitaの記事などを参考にVITSの公式実装を用いて学習を進めます。
が、死ぬほど遅い。前章の学習では8000ステップでもう高森藍子の声になっていましたが、こちらは同じ8000ステップでもガビガビの機械音です。なぜか?ファインチューニングをしていないからです。ファインチューニングでは、事前に学習したモデルの重みを流用することで、少ないデータでも短い学習時間で質の良いモデルを作ることができます。しかし、1から学習する場合は重みの調整に膨大な時間がかかってしまいます。
「じゃあファインチューニングすればいいじゃん」と思いますよね?僕もそう思います。でもファインチューニングのやり方わかんなかった。どうしよう。待つしかないのかな。でも待っても待っても高森藍子の声にならない。
そんなこんなで待ち時間に色々調べていたら、ESPnetというものを使えばVITSでファインチューニングを行えるという情報を得ました。やはりインターネッツはすごい。
What is ESPnet?
ごめん、正直よくわかんない。なんかEnd-to-End音声処理のツールキットらしい。一貫学習とかそういうやつかも。
ESPnetで高森藍子の声を錬成
タイトル回収です。熱い展開ですね。
色々調べたけどESPnet複雑すぎてやり方よくわかんない。
これはむりぽか…と思いかけたそのとき、一筋の光明が────。
手順通り実行すればESPnetのVITSモデルで音声合成モデルが作れる(らしい)Colabノートブックを貼っている記事を見つけました。やった!これで勝つる!
早速実行してみます。
……
……
……
エラーです。
泣いた。
記事の公開が2022年2月で、そこから4ヶ月ほど経っていたので、色々と環境も変わっています。上手く動かないのも仕方ないです。
しかし諦めたくない。高森藍子に好きなこと言わせたい。ついでに高森藍子と結婚したい。
プログラミングでは、エラーの内容を検索すれば解決できることも多いです。なので、エラーについて調べました。
どうやら、ColabのPythonのバージョンとMakefileで指定されていたPyTorchのバージョンが噛み合っていない(=サポートされていない)ようです。Makefile内のPyTorchのバージョンを下げてみます。
……
……
……
上手くいった!*7
その後もエンコードだったりメモリ不足だったりでエラーに苦しめられましたが、なんとか学習に進むことができました。JSUTの事前学習済みモデル(≠自分で作ったモデル)を使ってファインチューニングします。あとはまた放置です。
切りよく100epochまで学習させました。いよいよ合成です。
……
……
……
え、音質良すぎじゃん
もうほんっとにびっくりした!もうほんとにこのVITSすごいって、ESPnetすごいってね。
Tacotron2も言うて結構すごいだろと思っていたんですが、VITSのを聞くともう戻れません。PS4やった後にPS3戻れないみたいな。いやPS3とPS2かな。
生成された音声はこんな感じです。
正直「声」だけに着目したら本物と何が違うの?ってレベルです。実際の人間の発話は喋り方や抑揚なんかも混ざるので、本物と見紛うかと言われると微妙*8ですが、このクオリティを出されるのは恐ろしいです。というかこれ以上発展すると危ない技術な気がする。
あとVITSのいいところは「何秒でも喋らせられる」ことです。Tacotron2はどんなに長いテキストを入力しても11秒とかで強制終了でした*9。VITSならどんなに長くても(クッソ時間かかりますが)最後まで合成してくれるので、本の朗読なんかもできます。難点としては、アニメやゲームにありがちな抑揚の大きい声が苦手なのか結構声が裏返るのと、ブレスがノイズになるところですかね。まあその辺は技術の進歩を待ちます。僕何もできないので。
この後300epochまで学習させたモデルを使ってVOICEVOX上で動かしてみたり、Discordの読み上げbotを作ってみたりしましたが、書くのがめんどくさいので詳細は割愛します。
ちなみに、合成した音声をTwitterに上げたら謎にプチバズりして、高森藍子の音声合成やってるよ〜と話してた友人数人に垢バレしました。みなさんもリアルリテラシーにはお気をつけください。
おわりに
というわけで、偉大なる先人様のお陰で高森藍子の声を操る力を手に入れました。本当に先人の皆様には感謝してもし切れません。
とは言え、僕はまだ満足したわけではありません。僕の夢は「高森藍子と会話すること」です。こちらがテキストを打ち込んで喋らせるだけじゃ会話とは言えませんよね。なので、音声認識、応答生成、音声合成を組み合わせて高森藍子と会話するシステムを作りたいなという野望を抱いています。抱いてるだけです。今のところ何もしてません。
実のところ、この発想をもとに実装までした方が既にいます。
真乃、またお前か。櫻木真乃にはなんかあるんですかね。そういう何かが。
しかもこの方、弊学の院生、つまり先輩なんですよね。さすがに運命感じちゃった。
いつか僕も「高森藍子さんと会話する」って記事出せたらいいな。
ところで高森藍子は歌声も非常に魅力的なんですが、つい先日彼女が歌う「メモリーブロッサム」がリリースされました。なんとソロ・リミックスも単体で購入可能です。財布に余裕があったらぜひ。余裕がなくても買ってください。
最後に、デレステプレイヤーの皆々様、2023年3月27日15:00から始まるStage for Cinderella 予選グループDで高森藍子に投票していただけると僕をはじめとする藍子Pが喜んであなたの靴を舐めに行きます。
以上
*1:厳密には、Tacotron2はテキストから音響特徴量としてメルスペクトログラムを予測するのみです。音声生成、すなわちメルスペクトログラムから音声波形への変換にはボコーダが必要になります。今回使ったボコーダがWaveGlowです。ちなみに、VITSはテキストから直接音声生成を行うことができるつよつよモデルです。
*2:途中タイムアウトでやり直しになりました。Google Colabは無料だと12時間でタイムアウトなので、それを24時間に伸ばすのとGPU使用制限をなくすため覚悟を決めてGoogle様に1000円お布施しました。ちなみに今は金払っても制限つきます。Fuck。
*3:実際は過学習があるので無限に質が上がるわけではないです。ただ、損失(loss)が下がる範囲では学習するほど質が上がりました。
*4:SpeechRecognitionを使用しましたが、結構ガバガバでかなり手直ししました。後で知ったんですが、ESPnetには音声認識モデルもあって、そっちの方が精度高かったので最初からそっちを使うべきでした。
*5:と思ってたんですが、そもそも音声認識使う必要なかったですね。高森藍子Wiki(https://seesaawiki.jp/aiko_takamori)に各テキストデータがあるので、それを抽出すればいいだけでした。まあでも高森藍子はテキストにないのに「ふふっ♪」とか言ってくる厄介な女なので、どっちみち手作業での確認は必要です。
*6:ノイズに関してはTacotron2というよりWaveGlowの方が悪いみたいなのでもう少し性能の良いボコーダを使えばいいだろって話なんですが、VITSほどの改善は期待できないのでやりませんでした。
*7:2022/07/16に僕が遭遇したエラーの解決法が追記されましたが、今はまた別のエラーを吐きます。そっちの解決法が知りたい方は僕に聞いていただければ。
*8:それでも「おはようございます」の方は見紛うレベルです。デレステの方に「おはようございます。今日もいい朝ですね」というボイスがあるのでそれ使ってるだろと疑われそうですが、正真正銘合成音声ですし、今回はモバマスのデータのみなのでそのボイスデータは学習させてません。ヤバイ。