今日からはじめるAI文芸実践入門:朗読編
今回のテックブログは、前回に続きM研の浦川さんの登場です。「言語モデルによる物語生成+音声合成」から、夜眠りにつく際の朗読データを作ってしまおうという試みです。一体、どんな物語が生まれるのでしょうか?
はじめに
こんにちは、メディア研究開発センターの浦川です。
「今日からはじめるAI文芸実践入門」の第2回です。第1回では短歌を取り上げました。
今回は、朗読編と題して、主に睡眠導入のための朗読、その物語生成から音声合成までを試していきたいと思います。
「今日からはじめる」とある通り、この記事は最近の研究や公開されている情報を元に、今できることを中心に書きます。また「実践」として、実際に使ってみることを主眼において、事例紹介や技術に関する説明は簡単に紹介するか、省いています。最後に公開されているモデルを扱った事例も紹介します。
なお、朗読音声は別記事として以下でお聴きいただけます。
なぜ、朗読
以前、センター内で言語モデルを応用した物語生成の可否について話をしていたことがありました。前回も登場したGPT-2を用いて物語を執筆するようなことはできないか、という話です。
その中で、モデル単体で筋の通った物語を一挙に生成することは難しいが、モデルと協業することで物語をつくることはできるかもしれない、またそこから話は飛んで、気軽に物語を生成する場として子や自分を寝かしつけるための物語生成器があればおもしろいかもしれない、という話になりました。
では、それを実際にやってみましょうということで、以降で言語モデルを用いた朗読データ作成の手法を提案していきます。
やってみましょう
さっそく、朗読データをつくっていきます。
今回は、はじめに台本となる物語を生成し、それを音声合成エンジンに読み上げさせるという手順を踏んでいきます。
ということで、まずは物語生成について見ていきましょう。
・終わらない物語を書く
先述のとおり、前回と同様にGPT-2と呼ばれる言語モデルをfinetune(新たなデータでモデルのパラメータを調整)することで、欲しいテキストの生成を行なっていきます。
言語モデルとは、入力として与えられた文をもとに、それに続く語を生成するものでした。下図では、例として「現在、私は物語」という入力から次に来る単語を生成する様子を図示しています。
今回は朗読台本としての物語ということで、小説や童話といったテキストを学習データに据えます。
いろいろな選択肢があるでしょうが、今回グリム童話のデータによってモデルをfinetuneしました。
学習を終えたモデルに「今日もまた眠れなかった。」という入力を与え、生成結果を見てみます。
今日もまた眠れなかった。むりもありません。胃袋のなかは石のようにかたくこおりついて、のどがかわいてたまりませんでした。それで、むりやり寝床のなかにもぐりこみました。...
太字が入力、以降がモデルによる生成です。内容の良し悪しはさておき、童話らしい語の並ぶテキストが生成されているように見えます。
一方で、このモデルには問題点があります。今回のテーマでも最も大きな問題は、物語が途中で終わってしまうということです。
言語モデルは、テキストを無限に続く一筋の流れとして取り扱っているのではなく、文書の始まり(BOS:Beginning Of Sentence)、そしてその終わり(EOS:End Of Sentence)を明示的に学習しています。
例えば、「物語が一段落したところでさらにその続きを生成したい」といった場合に、すぐさま終わりを迎えてその続きが得られない、といったことがありえるでしょう。
今回は睡眠導入のための朗読台本ということで、眠りに落ちる前に物語が終わってしまうことを避けたいといった要請があります。
そこで、上の問題に対処した終わらない物語を書くための学習データを用意してみます。
ある日、ふたりはいっしょに散歩にいったかえりに、女のほうの家へよりました。_すると、女が男のほうのむすめにむかっていいました。
上のように、段落を1つの文書とした上で、文の間に「_(アンダースコア)」を挿入したデータを作成しました。このようにすることで、「 _ 」は文書がそれ以降も続くことを意味するようなトークンになるでしょう。
このフォーマットのデータでfinetuneすることで、言語モデルの入力末尾に「 _ 」を入れれば、その続きのテキストを生成する(ことを促す)モデルをつくりたいと思います。
そしてこのモデルの使い方ですが、例えば、「 今日もまた眠れなかった。_ 」と末尾に「 _ 」をもつ入力を与えます。出力としてその続きのテキストが得られるわけですが、その末尾に再び「 _ 」を移動してモデルに入力することで、そのさらに続きのテキストを得ます。これを繰り返すことで、逐次的に文章を生成していきます。
上は、モデル入出力の例。黄字がアンダースコア、青字がモデルの出力。
なお、「 _ 」以前の内容が長くなった場合には、先頭を削るという操作を行なっています。
このようにして、以下のようなテキストが得られました。
今日もまた眠れなかった。
むりもありません。それに、おなかがすいてたまりませんでした。
朝になって、ようやく目がさめてみると、地べたの上にばかりいる光が、ひるのようにきらきらしていました。 しかも、それはほんとうにみごとなものでした。
おかみさんは、もうさっそく針と糸とをとりだして、豆のからだをぬいあわせてやりました。
それから、ひとつぶの糸を止め針のほうは、豆のからだをぬいあわせて、その豆のからだを、豆のからだを、まっぷたつにひきさいてしまいました。
それから、その豆は食卓にのせました。
豆は食卓をかけますと、ふたつに切ってあり、その豆のからだは、豆のからだのあいだにはいるよりもずっと大きくなっていました。
(つづく)
いかがでしょうか。入力文から始まる、童話らしいテキストが生成されていることが確認できるでしょう。またこの続きを、逐次生成することが可能となっています。
・選者になる
ここまで、終わらない物語を書くための学習データについてみてきました。
しかし、先ほどの生成例をよくよく読んでみますと、ところどころ意味の取りにくい箇所や不思議な表現が見られます。
これは今回、学習データが少ないこと、また、詳しくは紹介しませんが、文のバリエーションを豊かにするためあえて確率の低い語も採用する生成手法を取っていること、などが影響していそうです。
加えて今回のモデル学習では、段落=数個の文のあつまりを1文書として扱っています。よって、長い文脈での整合性は保証されないという問題があります。
そこで、逐次生成されたテキストに対して採用・不採用を利用者が判断する=選者になるという手順をとります。
人手で毎回の生成を確認することにより、なるべくおかしな展開がないような物語をつくることができるでしょう。
実際に、毎回の確認をはさみながら、3つの書き出しをつくってみました。
今日もまた眠れなかった。
むりもありません。それに、おなかがすいてたまりませんでした。
お姫さまはほんのすこしばかり糸くりの音を耳にしていましたが、その音をきくのが、いやでたまらなかったのです。
それで、むりやり寝床にはいって、カーテンをあけてみました。すると、そこには魔法使いのばあさんがいて、こういいました。
「わたしは、森のなかの住人ではありません。あなたにお見せするなんて、とんでもないことをしでかしたものです。わたしを、魔法使いのばあさんだなどとは思わないで。あなたを、はかりごとでつれだしたのも、あなたをおしたいするあまりにやったことなのです。あなたの絵姿をはじめて見ましたとき、わたしは気をうしなってたおれたほどなのです。」
今日もまた眠れなかった。
むりもありません。それになにしろ、胃袋のなかは石がいっぱいで、のどがからからからにかわいてたまらないので、一日じゅう、 ごろごろ寝がえりばかりして、朝になっても、どうしてもおきようとはしませんでした。
で、そのたびに、小鳥がまたどなりました。
けれども、それはやはり、お姫さまが、いつものようにうるさくせめたてるのとおなじようなありさまでした。
ただ、あのように、うるさくせめたてるひまに、王さまはあたまをゆすぶりゆすぶり、かわいらしい、美しい髪の毛で、いつもとちがった、身のこなしをしていました。
ひたいの上には、金の星をひとつつけていました。
今日もまた眠れなかった。
そのうちに晩もすぎましたが、かわいそうなこどもたちのところへ、たれもくるものはありません。せめて、妹たちをたすけてやれるだけの勇気がほしいと思いました。
そうして、やっとのことである方法を思いついて、寝床にはいって、神さまにもうしあげました。
それから、妹たちのいるところへいくことにしました。
ところが、妹たちは、 魔法使いのばあさんのいうことはうけようと思って、そんなことをちっともかまうものではありません。
いかがでしょう。先ほどよりは、筋が通っていると言えるのではないでしょうか。
・眠るまで終わらない物語を書く
これまで、終わらない物語を書く、という話をしてまいりましたが、今回は無限に続くテキストをリアルタイムに生成し読み上げるようなシステムは想定していません。どこかで終わりを設定し、それを音声合成エンジンへ渡すという手順が必要です。
そこで、希望の朗読時間を設定し、それに達するまでテキストを生成するようにしてみます。
ここでは仮に、1分間に300文字を読み上げる想定として、設定した時間(分)×300文字に達するまで生成を続けるような制限を加えました。
このようにして、欲しいだけの時間を満たす朗読台本生成を行なっていきます。
以下は、グリム童話で学習したモデルに「 今日もまた眠れなかった。_ 」を入力し、10分の時間設定で生成した台本データの、前半部分です。
今日もまた眠れなかった。
むりもありません。それに、おなかがすいてたまりませんでした。お姫さまはほんのすこしばかり糸くりの音を耳にしていましたが、その音をきくのが、いやでたまらなかったのです。
それで、むりやり寝床にはいって、カーテンをあけてみました。すると、そこには魔法使いのばあさんがいて、こういいました。
「わたしは、森のなかの住人ではありません。あなたにお見せするなんて、とんでもないことをしでかしたものです。わたしを、魔法使いのばあさんだなどとは思わないで。あなたを、はかりごとでつれだしたのも、あなたをおしたいするあまりにやったことなのです。あなたの絵姿をはじめて見ましたとき、わたしは気をうしなってたおれたほどなのです。」
それで、 それからというものは、まい日森のなかをあるきまわって、森のおくにぽつねんと立っている一本の木の上に、すわって、肌着をぬいつづけています。
ただもういっぽう、お姫さまは、昼まのうちに、ほんのすこしずつ山の上にすわっては、あそびつづけて来ました。
そのとき、ふと見ますと、そこには大きな石のお城がそびえています。
その城のなかには、大理石をしきつめた、大きな入り口の間がありました。そして、そこには召使いたちがおおぜいいて、自由に出入りを許されるようになっていました。
そして、そこらじゅうに、おおぜいの兵隊がいて、中にはその家来が六つもひかえていていました。
そして、その兵隊のなかに、純金でできている大きな旗があがりました。
それは、まことにみごとにできていて、それがいかにも大すきに思えるすばらしいものでした。
ですから、若者は勇気をだして、それをはげしくむかえました。そして、そのすばらしいことといったらびっくりするほどで、かりうどが、すぐそのまに、お城にかえってきました。
若者は、よろこびに胸をはずませて、むかしどおりの元気なじょうぶな毛皮のずきんをすっぽりかぶって、馬にのって、お城をでかけました。
そして、ひとり、大きなポケットに金の星をひとつ、つめこみました。
そして、これをぐいとにぎりしめましたので、お星さまがすぐ目のまえにあらわれたときには、それがとてもきれいに見えました。
しかも、それがまったくの、ちっともあたたかくはありませんでした。そのとたんに、お星さまは命をかけて、もとの人間のすがたにもどりました。
そのお星さまは、あしたの朝までぐっすりねむっています。そして、金のまりを口にくわえています。
これがお姫さまのしるしになるのだから、そのまりを泉のなかへほうりこんで、 やがてそのまりがほのおにうつったときに、お姫さまは目をパッチリ見ひらいて、さけびました。
そのおかげで、お姫さまは十二のお星さまたちといっしょに、あそびに行けるようになりました。
そして、みんなにたいへんかわいがられて、お姫さまのお城のお庭をとびまわっていました。
そのとき、ふと見ますと、 その中に、ひとりの美しいむすめがはいっています。むすめは、王さまがわるものだということをちっとも知りませんでした。
いかがでしょうか。お姫さま、魔女、若者、かりうど、お星さま、そして美しいむすめと、次々に童話らしい人物が登場しながら展開する物語(のようなもの)を生成しています。退屈しているお姫さまが、あるもののある働きによって自由を手にして、新たな登場人物と出会うまでと読める、かもしれません。
上のテキストには全体として一貫したテーマがあったり、物語の起伏が巧妙に展開されているといったことはありませんが、なるべくお姫さまを主人公として読めるような形での生成にこだわっています。そして後半では、ヒロインを交代しながら、前半の終わりに登場した美しいむすめが対立関係や事件を生むような展開を意識しています。この、生成文の取捨選択が、モデルと協業する人間の創作行為と言えそうです。
また、どんな展開が選び取られたかということは、それがそのまま選者がどんな物語・出来事を評価しているかと等しいと言ってよいでしょう。例えば、童話の持つ残酷な部分が必ず入っていたり、次々と起こる偶然の出来事により読者を煙に巻いたり......選者の顔が見えてくる手法と言えるかもしれません。
加えて、この記事では特に話題にはあげませんでしたが、モデルによる生成と人による執筆を代わる代わる行うような創作行為もありうるでしょう。
さて、この物語の続きは、以降の朗読でお楽しみいただければと思います。
・読み聞かせをねだる
ということで、最後に、実際に物語を読んでもらいます。
今回、利用規約に従うことで営利・非営利を問わずフリーで利用できる音声合成エンジンとして、CoeFont STUDIOを用いました。
読み上げ速度や声の高さに加えイントネーションなど自由に設定できる上、音声データの連なりをひとまとめにすることも可能です。今回のような生成に向いているでしょう。
以下のリンク先で、朗読音声を聞くことができます。
では、先ほどの物語を、音声でお楽しみください。
実際に手元でやってみるには
これまでに挙げた方法は、社内で学習した言語モデルを用いて行ったものですが、オープンなデータ/モデルを用いて同様のアプローチを取ることも可能です。
例えば公開されている日本語GPT-2の一つに、rinna株式会社によって公開されているモデルがあります。
このモデルを先ほどのグリム童話データによってfinetuneし、「 今日もまた眠れない。_ 」から続く系列を生成してみます。
今日もまた眠れない。だって、もうお日さまが上がって、三が日も終わろうとしているのだから。そうだよね、お月さまが出てくるからね。だけどまだお月さまが顔を出してこないで、まん丸なお月さまが、真ん底から照りつけるように、地面の石のところまできていて、そしてその石の上を、まるでお月さまが横切って行くように、指をお月さまのそばまでひっかきつけるんだよ。それでようやく、お月さまが顔を出すんだよ。...
先ほどと同様にして、テキスト生成ができることを確認できました(選別は行なっていません)。
おわりに
今回、朗読編と題して、言語モデルを用いた物語生成から朗読音声データの作成までを行う手法を提案しました。
今回は終わらない物語の生成を文単位で行う、という試みでしたが、ここには様々なやり方がありそうです。
また生成結果を人手で確認する部分では、何らかのルール/判別機構などを用意することで、これを自動化することもできるでしょう。
実際に生成された音声を聞きながら睡眠を取ろうと試してみますと、いい意味で筋の曖昧な、注意して展開を追う必要のない、でも雰囲気には浸れるくらいのゆるい物語感が睡眠導入にふさわしいかもしれないという感触がありました。この文脈の緩さを逆手に取りながら、エリック・サティの家具の音楽やブライアン・イーノのアンビエント・ミュージックならぬ、家具の物語/アンビエント文学としての機能を見いだすことができるかもしれません。
我々メディア研究開発センターでは、TSUNAに代表される見出し生成といったタスクのほか、今回のような言語モデルの創造的な応用に関しても日々研究を行なっております。興味を持たれた方は、ぜひこちらまでご連絡ください。
(メディア研究開発センター・浦川通)
中途採用実施中!
朝日新聞社メディア研究開発センターでは、現在、中途採用を行っています。このブログで紹介している仕事内容に興味のある方は、ぜひ下記ページにアクセスしてみてください。また、メディア研究開発センターのメンバーのエントリは、マガジン「M研のおしごと」でまとめて読めます。