そぬばこ

備忘録とか、多分そんな感じ。

whywaitaの声で遊びたい (Tacotron2 + WaveGlow で音声合成で遊んだら失敗しました)

この記事は whywaita Advent Calendar 2020 12日目の記事です。

前日はid:Krouton さんの

krazy.tokinia.me

でした。

やっぱり、睡眠は大事ですよね。 ちなみに、私はじぶんまくらの頂を使っています。

jibunmakura.com

モチベーション

さて、whywaitaさんといえばISUCONですよね。 今年は運営側ということでお疲れさまでした。 私は特段参加はしていないのですが、本戦のYouTube Liveを流し見しながら作業をしていると、面白いものが流れてきました。

www.youtube.com

どこかで聞いたことがある声ですね。 ということで、このかっこいい声で遊びたいなと思いました。

データを集める

ところで、何をするにもwhywaitaさんの声のデータが無いと始まりません。 しかし、テキストデータと違って*1、whywaitaさんは自分の音声データを公開していませんでした。 なんてこった。

かといって、YouTubeの動画から音声を引っこ抜くのは、規約を見る感じダメそうです。 困ったなぁ……

f:id:nersonu:20201211232008p:plain:w600

やったぁ!!!

ということで、データが集まりました。 あまり負担をかけるわけにもいかないため、データ数としては124文録音してもらいました。 多分いろいろやるにはデータ数がかなり少ないです。

ちなみに読んでもらった文書は、夏目漱石の『こころ』の一部です。

github.com

青空文庫GitHub上にすべての文書データがあり、便利ですね。

(12/25 追記) 例えば、こんな感じの音声を撮っていただきました。

WIP

さて、本当はこのデータを使ってやりたいことがあったのですが、現状間に合っていません。 この記事のために音声処理を少し勉強したり、論文を読んだりしていましたが、結局修論でそんなに時間が取れませんでした。

ごめんなさい! :bow: :bow: :bow:

正直うまくいかない部分も考慮していたので、このデータを使ってプランBのほうをやろうかなと考えています。 数日以内にこちらのほうをひとまず公開出来たらなと考えております。 許してください〜〜〜

本題 (12/25 更新)

だいぶ遅刻ですね。 もう最終日ですよ。

申し訳ございませんでした! 代表してこちらの方に謝っていただきたいと思います。

なんて言ってるんでしょうね*2

これは何

音声合成を行って、whywaitaさんの声で自由に喋らせようとしましたが、失敗しました。 ひとまず今回は何を行ったのかと、反省点、いくつかの音声サンプルを見せて次回への課題(?)としようと思います。

今回やったことをざっくり話すと……
まず、whywaitaさんが喋った音声とそのテキスト情報を入力として、テキスト情報からwhywaitaさんらしい音声が生成出来るような特徴量の抽出を行っていきます。 これはいわゆる Text to Speech (TTS) と呼ばれているタスクです。 音声処理の知識がほぼ皆無なので雑ですが、具体的にはメルスペクトログラムと呼ばれる音声信号情報から得られる情報を抽出しているようです。

つまりこんな感じかもしれない。

f:id:nersonu:20201225110353p:plain:w500

今回はTacotron2というモデルを使いました。

arxiv.org

著名なモデルで、山程解説があると思うので、気になる方は論文とそちらを読んでみてください。

実装はいろんなところが作っていくつか公開されているので、公開されているものを使っていきます。 今回はNVIDIAの実装を使いました。

github.com

ところで、Tacotron2でその人の声で学習して実際にいい感じの特徴量が得られるまで、24時間ほどの学習データが必要なようです。 困りましたね。

そこで、今回は事前に別の音声で十分に学習されたモデルを使い、これをwhywaitaさんの音声っぽくなるように学習させていく……みたいなことをやっていきます。 事前学習モデルを用いた fine-tune ですね。

ちなみに学習はGoogle ColaboratoryでGPUを拝借して約7時間くらいかかりました*3。 たいへ~ん。

出来たやつを喋らせよう

さて、これでテキスト情報を入力すると、whywaitaさんの声っぽい特徴量を出力していてほしいモデルになったはずですが、ここからさらに音声に変換してもらう必要があります。 音声に変換してくれるモデルのことをボコーダーと呼び、ボコーダーくんが推論して初めてwhywaitaさんっぽい声が出てくる(ハズ)というわけです。

ボコーダーには丁度いいところに事前に学習してあるNVIDIAさんのモデルがあるので、WaveGlowを使います。

arxiv.org

github.com

本来であればこちらも fine-tune したほうがよかったりしなくてもよかったりするらしいですが、今回は時間の都合上カットです。

そして出来た音声がこちらになります。

入力「わたしは、くらうどのしごとをしています。」

入力「うらしまたろうは、かめにのってりゅうぐうじょうへいきました。」

入力「きのうは、おたくとあにくらでぶちあがった。」

入力「どうしてこうなった。」

そうしたかった?

はい。

反省点

なにやらはっきり聞こえたところと、はっきり聞こえなかった単語があったと思います。 例えば、学習データに大量に「わたくし」が含まれているので、過学習しているのか近い音素があると「わたくし」になってしまいました。 データの少なさと多様性の無さがかなり反映されていそうです。

また、入力の際にローマ字に変換しているのですが、こちらも一工夫必要そうです。 今回使った事前に学習されたモデルは(多分)元々英語で学習されているものなので、この辺はうまくやらないといけなさそうですね……*4

おわりに

今回はなんとかwhywaitaさんの声で遊ぶために、頑張って音声合成を行いました。 次回は反省点を踏まえて、whywaitaさんに自然言語を喋らせてデータを取るのはやめようと思います。 なんかどうにかして汎化性能の高い音声特徴量を提供してください。

明日は id:jackson58 さんです。 お楽しみに。

*1:whywaita Advent Calendar 2018 18日目 おいでませ!Chatbot whywaitaくん! - Coyote vs Loadbalancer を思い出す

*2:入力「きじこうしんがおくれてしまい、もうしわけありません。」

*3:バッチサイズ8、エポック数500で、イテレーションが7000いかないくらい回る

*4:参考: Tacotron2系における日本語のunidecodeの不確かさ - Qiita