LINEのAI技術を総称して「CLOVA」

橘健太郎氏(以下、橘):まず自己紹介をします。私は橘健太郎と申します。2008年に東芝に入りまして、2014年から17年までNICTに出向しまして、そのあとディー・エヌ・エーを経て、2020年8月にLINEに入社いたしました。

今LINEでは、音声合成技術のR&D組織であるVoiceチームのマネージャーをしています。研究分野としてはText-to-speechのTTSや、音声変換Voice Conversion、あとSpeech Separation、音源分離などを担当しています。本日はよろしくお願いします。

まず発表に入る前に、LINEのAI事業に関して少し紹介したいと思います。LINEは、よりよいユーザー体験を実現するべく、さまざまな分野でのAI技術の研究開発を行なっています。具体的には、我々のチームが担当しているような音声合成であったり、他にも画像処理、自然言語処理などが挙げられます。

LINEのAI技術を総称して「CLOVA」と呼んでいて、「CLOVA」を用いたプロダクトとしてさまざまなものをリリースしています。ここにあるような、プロダクトやソリューション、デバイスなどいろいろなものがあります。

デバイスに関して1つ例を挙げると、最初に「CLOVA WAVE」をリリースして、それ以降いくつかデバイスをリリースしてきました。

もう1つソリューションにもフォーカスしますと、今我々として注力しているのが、「LINE AiCall」「LINE eKYC」「CLOVA OCR」といったサービスです。特に「LINE AiCall」に関しては、音声認識や音声合成といった音声に関連する技術が使われています。

このように、LINEでは音声技術を活用したプロダクトを開発しています。ここまでが、事業紹介になります。続いて発表パートに移ります。まずはTTS、Text-To-Speechというものはどういうものかを説明しまして、そのあとに音声合成において多様な話者やスタイルを実現する方式について紹介します。

Text-To-Speechとはどういうものか

まずText-To-Speechなんですけど、おそらくご存知の方が多いと思いますが、任意のテキストから音声を生成するといった技術になります。この任意のテキストに関して、望んだ声で音声を生成できます。「今日もめっちゃいい天気ですね」みたいなテキストを入れたら、それに対応する音声を生成できます。

それでは、このTTSの部分に関して、もう少し詳細に説明したいと思います。TTSは、主に3つのモジュールから構成されます。

まずは、入力されたテキストから読みやアクセントといった言語特徴量を抽出する「Text Normalizer」。「今日もめっちゃいい天気ですね」みたいなテキストを入れますと、こんな感じでローマ字やアクセントの情報を含んだものを出力します。

この出力された言語特徴量に対して、メルスペクトルグラムや声の高さを示すF0といった音響的な特徴量へ変換する部分は、この「Synthesizer」という部分になります。このように出力された音響的な特徴量から音声波形を生成する部分が「Vocoder」になります。

このテキストを入れたときに生成された音声はこのようなものになります。

(音声再生)「今日もめっちゃいい天気ですね」。

こんなふうに、音声を生成できます。

近年、みなさんもご存知のように、ディープラーニングがどんどん発展していまして、音声技術に関してもそれに伴って発展してきています。特に音声合成を活用したプロダクトに関して着目しますと、このようなものが挙げられると思います。

1つは、我々もリリースしているようなスマートスピーカーであったり、あとはAIアバター、オーディオブックなどが挙げられます。特にオーディオブックやAIアバターは、多様な声質であったりスタイルで読み上げることによって、臨場感や没入感を醸すことが期待できます。

よって、こういった多様な声質であったりスタイルへのニーズがどんどん高まることが見込まれています。そうしたときに、多様な話者で音声合成を実現する手法とはどういうものかを、ここで紹介したいと思います。

多様な話者で音声合成を実現する2つの手法

大きく2つ考えられると思います。まず1つは、単純に複数の話者の音声合成モデルを準備して、順次状況に応じてこのように切り替えていくといった手法です。このモデルの利点は、各モデルに対して十分に細かく調整できるといったことが挙げられます。

デメリットとしては、単純に話者数分のモデルが必要になってきますので、管理コストが非常に増えてきます。

もう1つは、1つのモデルでいろいろな話者を表現する手法です。この手法の利点としては、モデルが1つになるので非常に管理は楽になりますが、各話者によって細かくチューニングするのはけっこう難しいと言えます。

また、後者の手法に関しては、いろいろな手法が存在しています。それに関して少し紹介していきたいと思います。

まず話者表現、1つのモデルでいろいろな話者を表現するというやり方なんですが、ざっくり言うとこういうかたちになります。

まず各話者の音声データから、その音声話者を示すような埋め込みのベクトルを取り出します。それと言語特徴量とを条件づけすることによって、出てきている音響特徴量と元の音響特徴量とのロスを最小化にして、各話者の特徴を持った音響特徴量を学習していきます。

ここにはSpeaker embeddingをうまく調整してやることによって、任意の話者であったり、読み上げであったり朗読であったり、映画調であったりというさまざまな任意のスタイルに切り替えることができます。

ですので、このSpeaker embeddingの学習方法がかなり重要になってきます。ここに関しては、いろいろなアルゴリズムが提案されています。今回の発表の主題もここのアルゴリズムに関するものを紹介します。

大きく3つの項目に分けて説明します。1つは話者表現モデル、先ほどあったSpeaker embeddingに関して、TTSを同時に学習する手法。2つ目は、事前に話者表現のモデルを学習して、それをTTSにくっつけるような手法。3つ目が、1個目と2個目をハイブリッドさせたような手法になります。

話者の表現にフォーカスしてTTSを同時に学習する手法

それでは1つ目から説明していきます。同時に学習する手法に関しても、3つに分けて説明します。まず最初に話者の表現にフォーカスしたもの、次にスタイルの表現にフォーカスしたもの、最後は両方にフォーカスしたものになります。

最初の手法としては、Lookup embeddingが挙げられます。これは一般的によくやられている手法です。このように目標とする話者のidを、1回one-hot vectorを通すことによって、目標話者を1、それ以外を0というベクトルにします。

そのあとに、このベクトルに対して固定値を持ったLookup tableというのを通して、これで話者の表現というのをこの固定値で話者を表現します。それと言語特徴量を条件付けさせることによって音響特徴量を学習するようなやり方になっています。

ここでLookup tableの固定値部分が音響特徴量の学習によってどんどん更新されていきます。この手法は、比較的簡単にできるという反面、もともと持っている話者以外に対応するのは基本的にはできません。

Lookup embeddingに関しても、Synthesizerのどこの部分に関してLookup embeddingで条件づけするかに関しても、いろいろ手法があるので、いくつか例を紹介したいと思います。

1個はBaiduから提案されているDeep Voice 2という手法です。上の図に示しているのがパイプラインです。まず音素の長さを予測する「Durationモデル」、そして「Frequency」という部分が音素の長さや音素系列から音響特徴量を予測する部分。最後の音響特徴量から音声波形を生成する「Vocal」部分。この3つのモジュールになります。

このピンクのものが話者embeddingのモジュールです。このように3つ、それぞれに線が出ていて、それぞれに対して全部条件づけしてある手法です。

下の図にはDurationモジュールとFrequencyモジュールがありますが、各処理に関して全部条件づけしています。あらゆるモジュール、あらゆる位置に関して挿入する手法になっています。

もう1つ紹介いたしますと、これはMultiSpeechという手法で、TransfomerベースのTTS手法です。ですので、このEncoderの部分と、Decoderの部分、あと音素情報をEmbeddingする部分から構成されます。

音素情報は、Embedding部分とEncoder部分を通して出てきます。そこに対してこのオレンジの部分はSpeaker embeddingを示す部分なんですが、そこにConcatするかたちになっていまして、Encoderから出力に対してConcatします。

もう1つは、Decoder部分に関して、実際この前の時刻出力になるんですが、スピーカー情報をConcatする手法になっています。

一般的には、Encoderから出ている出力と、前の時刻のDecoderの出力に対して条件づけするのが一般的によく用いられるものになります。ですが、正確にちゃんとこういう条件が良いと客観的に調査した論文がありますので、少し紹介します。

これはattention構造をもつencoder-decoderネットワークのTacotronをベースにしているTTS手法なんですが、いろいろなところに、左下の赤い、これはSpeaker embeddingなんですが、これを差し込んで、どういったときにどれくらいよくなるのかを客観指標で評価した論文です。

実際の提案はちょっと別なんですけれども、客観指標として、一部の実験としてこういうのをやっています。ここで示しているのは、Encoder部分の出力にConcatするattention、attnといわれるものですが、それと先ほどあった前の時刻のDecoderに関して差し込むもの、preという部分であったりします。

Decoderから出ている出力に対して、最後post処理のネットワークを加えている部分がありますが、そこに対してpost処理のpostっていう、この3つに対して条件づけしてどのように変化するかを示したものがこちらです。

こちらはコサイン類似度を示すものなので、値が高ければ高いほど、よいということになります。この結果として、dev setなのでこちらを見ればいいんですが、dev setの中で最も値が高いのは、pre+attn。この結果が最もよいということになっています。

Encoderの出力値と、1個前のDecoderの出力値に対して差し込むというのがよさそうだろうとここで示しています。さっきのこの手法も、同じようなことをしているので、このやり方が一番良いだろうと今のところ言えると思います。ここまでがLookup embeddingの手法に関してです。

さらにこのLookup embeddingから性能を改善するためにfine-tuningを行う手法があります。それに関して説明します。

目標話者のデータ以外に関して、1回複数話者でSpeaker embeddingを、Lookup embeddingを使って学習しておいて、学習されたSpeaker embeddingに対してターゲット話者を入力して、fine-tuningさせます。

ですので、ここのSpeaker embedding自体は1つの話者のみを示します。つまり、話者ごとにモデルを用意する必要があります。

そのLookup embeddingに、さらに目標話者でfine-tuningした手法の例を1つ紹介いたします。こちらです。fine-tuningする手法に関して3つやり方を試しています。

これは先ほどの1番の処理ですね。それをやったという前提で説明いたします。複数話者で学習したEmbedding vector、ここに関して目標話者を入れ込んでパラメータをチューニングする手法になります。ピンクの部分がパラメータをチューニングする部分になっています。

この手法はちょっと特殊なんですが、Vocoderにこういう条件づけをして直接学習させている手法です。Embedding部分のみを学習するのが左の手法になっていて、真ん中は、EmbeddingはSpeaker embeddingとさらにVocoder部分両方のパラメータチューニングするという手法で。

一番右はのちほどの紹介にはなるんですが、事前学習したモデルを使ってここで話者表現をしているベクトルを出してきて、それとVocoder部分のみを学習する手法になっています。

これらを比べた結果が、下の表で示されています。上が自然性で、下が話者類似度になっていまして。SEA-ALLというのが真ん中の手法なんですが。EmbeddingしているものとVocoder両方ともパラメータチューニングしているものが最も良いといった結果になっています。

次に良い結果はSEA-EMBという手法で、左側の手法ですね。Speaker embeddingのみの部分をfine-tuningした手法になります。一番下の手法というのはSEA-ENCで。のちほど紹介にしますが、話者表現を使った手法でVocoder部分のみをパラメータチューニングしているのが一番結果が良くないということになっています。

のちのご紹介のやつをいきなり悪いと言うのもあれなんですけど、Embeddingのほうがこの論文では良いという結果が出ています。

スタイル表現にフォーカスしてTTSを同時に学習する手法

今までは話者の表現に関してフォーカスした手法になっていましたが、次はスタイルですね。読み上げであったりとか、朗読調といったスタイルに関して表現を学習する手法を1つ紹介します。

これはTacotron-GSTと言われる手法です。スタイル表現を学習する手法としては一番有名な手法ですね。このやり方は、音響特徴量、メルスペクトルグラムを取り出して、そこに関してrecurrentベースのEncoderを通して、そのあとにMulti-head Attentionを使います。

このMulti-head Attentionを通すことによって、スタイル埋め込みのベクトルを生成しています。それを条件づけすることによってEncoder部分の出力に対して条件づけしています。こうすることによって元の音声からスタイルを学習します。

実際音声を生成するときは、元の参照とする音声からスタイルを取り出したりとか、ここのMulti-head Attentionのスタイルベクトルに関して調整することによって、スタイルを調整して音声を生成することになります。

これがPreferenceテストの結果で、今回はスタイルの部分ですので、話者に関しては表現を固定するという意味で、この論文では単一話者で実験をされています。その結果、ベースラインはもともとAttentionベースのTacotronという手法と、今回スタイルベクトルを取り入れたTacotron-GSTという結果を示しています。

もともと音声を合成するために参照となる音声が必要になってくるんですが、2種類変えたときの結果でも、GSTが良いという結果が出ています。

話者とスタイル両方にフォーカスしてTTSを同時に学習する手法

スタイルと、先ほど説明している話者両方の表現を獲得する手法として、GMVAE-Tacotronが提案されています。これは、2種類のVAEを使って、それをEncoderの出力に関して条件づけすることによって学習する手法になっています。

上がlatent encoderと言われるもので、発話ごとのスタイルを表現するものを学習するVAEです。下がobserved encoderで、こちらは話者の情報を学習するようなVAEです。

これをそのまま入れると、2つとも学習が走っちゃうのでうまく分けられないということがあります。話者の情報は普遍的なので、発話によって別に異なることはないので。

observed encoderのVAEの分散のほうを小さくしちゃって、latent encoderの分散を大きくしてやることによって、発話で変わらない普遍的な情報として話者情報を取り出すというような条件をつけてやることによって、この2つを学習します。

ですのでobserved encoderの文には話者情報、latent encoderには韻律といった表現情報、あとは環境の情報が入ります。

これは音声を聞いたほうが手っ取り早いと思いますので、ちょっと音声を流したいと思います。実際の音声を流すと、これはVAEの部分の条件を変えることによって、男性であったり女性であったりを変化させられます。

(音声再生)

あとノイズの情報であったり、きれいな音声の情報をごちゃまぜに学習することによって、VAEのほうでクリーンな音声の空間の部分であったり、ノイズの音声部分を分けることができます。

(ノイズ再生)

こういうノイズの音声を入れていたとしても、クリーンな条件で、かつ、話者Aを再現させる条件でVAEの部分のベクトルをサンプリングすると、

(音声再生)

というかたちで、かなりノイズを低減させた音声を生成できるようになります。

これは、先ほど載せていなかったものなので、参考というかたちで紹介します。先ほどのVAEでは、発話ごとのスタイルというのを学習していましたが、より細かく音素ごとのVAEを適用する手法がのちに提案されていて、QFVAEと名づけられています。

その手法だと、このGlobal VAEは先ほどのGMVAEの手法ですが、それよりも客観指標の結果にはなるものの、良いという結果が出ています。今回は客観評価のみの紹介にはなりますが、主観評価に関してもちゃんと論文には載っていて、良いという結果が出ています。

さらにもう1個進んだ発表がされていまして、音素だけじゃなくて、もともとあった発話であったり、さらに単語など、いろいろな区切りによってVAEを適用することによって、より細かい制御が可能になってきています。

Fully-hierarchial fine-grained VAEという手法は、Global VAEや先ほどのPhone-levelで操作しているVAEよりも、今回客観評価の結果だけではありますが、良いという結果が出ています。

音声に関しては、URLを貼っていますので、のちほど確認していただければと思います。ここまでが、TTSと同時に話者表現のモデルを学習するといった手法です。

事前に話者表現のモデルのを学習する手法

次は、事前に話者表現のモデルを学習する手法について紹介します。

先ほどLookup embeddingのところでもちょっと触れたのですが、上の手法という未知話者、学習音声データがないようなものに関しては、基本的には非対応なんですが、下の手法は音声データが大量にない場合でも、うまく表現できるようになります。

これに関してなんですが、まずはSpeaker verificationとSpeaker recognition。いわゆる照合と認識に関して少し違いを説明します。

まずSpeaker verificationは、Speaker authenticationとも呼びますが、対象としている話者Aが本当に話者Aなのかどうかを判定するタスクが、このSpeaker verificationです。出てくる答えもゼロイチになります。

Speaker recognitionは、誰かわからない音声に対して、対象とする話者が誰なのかを予測するタスクです。これは、対象とする話者の中からどれかというのをゼロイチで出します。

Speaker verificationに関しては、Transfer learning from speaker verificationの論文が非常に有名です。これはGeneralized end-to-end lossを用いたSpeaker verificationアルゴリズムを採用しています。

これは、Speakerごとに特徴量を取り出して、Similarity Matrixを作ります。左側のe11が話者1のEmbedding、c1が話者1の特徴と思ってもらってよいです。

ですので、話者1の特徴に関して、c1は話者idなので、話者idの情報がそうなっている場合はポジティブ、それ以外はネガティブというラベルを付けます。話者2に関しても同じようなかたちで付けてやって、こういう行列を学習します。この学習のための規範としてGeneralized end-to-end lossを用いています。

その概念を説明しますと、この丸が各ベクトル、埋め込みベクトルに相当します。この真ん中の三角がcentroidを表現しています。色が各話者のidを示しています。この埋め込みベクトルは、三角にどんどん近づくようにlossをかけていきます。

それと同時に、赤の三角やほかの話者の三角から遠ざかるようにlossをかけます。ですので、同じ話者は同じ話者同士で固まって、異なる話者とはどんどん遠ざかるようにlossが組まれます。

この手法のパイプラインですけれども、先ほどのSpeaker verificationのモデルをSpeaker Encoder部分に付け加えることによって、Speaker埋め込みを行うことになります。

そのSpeaker埋め込みを行なった結果を左下に示しています。話者ごとにちゃんとこのようなかたちで遠ざかっていて、同じ発話は色で示していますが、これが近づいています。ですので、うまく学習ができているという結果になっています。

これが主観評価結果です。このEmbedding tableが先ほどのLookup embeddingと同じ手法です。Proposedが、今回のSpeaker verification手法との比較になっていますが、これは値が高ければ高いほど良いものになり、Embedding tableは全体的に良いという結果になっています。

類似度に関しても、同じように、ちょっとここで逆転はしていますが、基本的にはEmbedding tableのほうがいいという結果が出ています。ただ、Embeddingは未知話者に対して作れないので、そこに関しては、こちらの手法は作ったとしても比較的性能が落ちないようになっています。

次にverificationに関してです。主観評価や客観評価は載せていませんが、手法だけご紹介します。Speaker recognitionタスクで有名なx-vectorがよく用いられます。x-vectorはTime delay neural network(TDNN)を利用したネットワーク構成がメインのアーキテクチャの構成になっています。

TDNNはこのような構成になっていて、1つ飛ばし、4つ飛ばしみたいなかたちで効率的に時間構造を情報を集約させて表現しているモデルになります。これを使ってSpeaker embeddingのvectorを作る手法です。

もう1個、これが事前学習するモデルとしては最後ですね。これは2話者間の、話者A、話者Bがどれくらい似ているかを主観評価で出した相対的知覚類似度を出して、それを総当たりで全部出した手法です。

そうすることによって、どの話者がどれくらい近いのかとを調べたものになっていて。それをスコア化している行列になります。これを正解データとしてニューラルネットを学習しておくことによって、話者表現のベクトルをそこから取り出します。

主観評価の結果は下に載せています。d-vectorは話者認識タスクです。それよりもProposedメソッドのほうがよい結果が出ています。ですので、話者認識のタスクで使うよりも知覚類似度を使ったほうがよいという結果になります。

ですが、これ全部に対して付けないといけないので、非常にコストがかかります。そういう意味では、使いどころが難しいかなと思います。

1個目と2個目をハイブリッドした方式

最後に、1個目と2個目をハイブリッドした方式として提案されているものがあります。Pretrained speaker representation model(PSR)モデルが、事前学習したモデルと、先ほど説明したGST、Speaker embedding、これを全部足し合わせた手法になっています。

このPSRに関しても、この論文では、Pretrainedのモデルをいくつか選択するようなかたちで性能評価をしています。客観評価は時間がないのでスキップします。

主観評価の結果です。x-vector、いわゆるSpeaker recognitionの手法ですね。それとVCと書いてあるのは話者表現をVAEで行なった手法になります。それと先ほどから出ているLookup embedding、それとVCとVAEベースのSpeaker表現とを足し合わせたものとの表現結果がこれになっていて。

Embeddingでやるのがやはりいいという結果が基本的には出ています。ただこの2つを足し合わせることによってsimilarityの部分に関しては、少しよい結果が出ています。

個人的に興味深かったのは、この埋め込みベクトルの結果です。d-vectorは話者verificationの結果、真ん中がrecognitionで、VCがVAEの手法の話者埋め込みの結果になっています。

やはりverificationの結果は遠ざけるように学習していくので、一番遠ざかって学習されます。recognitionは、ちょっと重複するようなかたちで埋め込みベクトルが構成されるのが、これから見てとれて興味深かったです。

Multi-speaker TTS

まとめに移ります。音声合成において多様な話者の表現をするための手法を紹介しました。話者表現は事前学習のモデルを用いるよりも、TTSと同時学習する手法のほうが精度がよい傾向が出てきました。

ですので、目標話者の音声がある場合、各モデルで用意していいのであればLookup embeddingをしてfine-tuningをする。1個のモデルで表現するのなら、GMVAEーTacotronといった階層的な表現を用いるのがよさそうです。さらに、その発展である2つの手法を試すのもいいだろうという結論です。

セッションは以上です。

司会者:橘さんありがとうございました。参加者から質問をいただいていますので、回答をお願いします。「今回話者のおそらく声質をベクトル化されていますが、同様に方言、イントネーション、なんなら言語情報を含め、ベクトル化するような研究はありますか?」

:方言というよりは、言語情報という意味ではマルチリンガルTTSは提案されていて、中国語、英語、日本語を全部混ぜて学習するようなモデルはいくつか提案されています。ですので、同じような流れで方言もできるのかなとは思います。

司会者:ありがとうございます。それでは本セッションは終了となります。橘さん、ありがとうございました。