Python
機械学習
DeepLearning
人工知能

ディープラーニングを使って自分を模した人工知能を作って会話してみた

ディープラーニングを使って自分を模した人工知能を作り、会話しました。

デモ動画

僕のような言い回しで、僕のような声で、会話してくれます。

仕組みの概要

実現したいものは音声対話です。音声対話の主な要素は

  • 音声認識
  • 会話応答
  • 音声合成

の3つです。今回は、音声認識に既存APIを用い、残り2つは自分のデータを集めてディープラーニングしました。それぞれの概要と、苦労した点を書いていきます。

音声認識

音声をテキストに変換するタスクです。今回はchromeに備わっているWeb Speech APIを用います。このAPIは、音声が進むと、途中でも推定結果のテキストをコールバックしてくれます。途中の推定は少々不正確ですが、次々表示されるとリアルタイム感があって楽しいので、これを用いました。

リアルタイムに表示できるので、生放送の字幕とかにも便利です。

デモ動画


会話応答

なんらかの入力文に、なんらかの応答文を返すタスクです。そもそも会話とは何かなのか定義が難しいのですが、今回は「問いかけの文章を、自分なりの文章にして返す」ものとしました。要約とか、言い換えをして会話を成立させる狙いです。

こうすると、学習タスクは簡単になります。自分の発言テキストを特徴量化し、元に戻すよう学習します(オートエンコード)。学習に必要なデータが自分のテキストだけなので、簡単に用意できます。

特徴量化が十分に汎化できていれば、任意のテキストに対してそれっぽく応答できるはずです。そのため、特徴量化には、大量のデータで学習されたモデルを用います。今回は、文章を特徴量にするdoc2vecを、pixiv小説で学習したモデルをお借りしました。

特徴量からテキストにするディープラーニングモデルは、LSTM2層の自己回帰モデルにしました。データは、僕がSNSで発言した約10万のテキストを用いました。リプライ文中のユーザーIDを消したり、一部の固有名詞を消したりなどの事前処理を行いました。

面白かったこととして、過学習させたモデルの方が会話していて面白いなと思いました。10万テキスト程度の少ないデータでは、頻出単語を使って当たり障りのないことを言います。代名詞が頻出単語なので、「こういうときは、それはそうですね」といった面白くない回答が多く現れました。過学習させたほうが、バリエーション豊かに感じられたので、会話していて楽しいんだと思います。

音声合成

テキストを音声に変換するタスクです。今回の音声合成では、テキスト→テキスト特徴量→音声特徴量→音声と変換しました。この2つの特徴量変換にディープラーニングを用いました。

テキストの特徴量化にはOpenJTalkを、ディープラーニングには音声合成論文の追実装を、ボコーダはWorldをお借りしました。学習データは、自分の声を録音した490文を用いました。

テキストの特徴量化がなかなかややこしいです。正しくできているのか正直わかりません。音声合成は自然言語処理と音声信号処理の総合格闘技だと聞いていましたが、身をもって体感できました。(勉強にあたってr9y9さんにとてもお世話になりました。ありがとうございます。)

デモ動画


音声対話のフロントエンド

音声対話の3つの要素をまとめる部分はwebフロントにして、chromeブラウザ上で動かしました。webフロントにしたのは、googleのAPIを雑に使いたかったのと、オーディオ周りのOS依存を吸収してほしかったためです。

ソースコード

今回実装したディープラーニングやフロントエンド周りのコードは、音声合成の学習を除いて全部githubで公開しています(ドキュメントはまだ整備できていません)。

また、この記事には間に合いませんでしたが、自分の人工知能を手軽に学習できるコードを整備したいと考えています。続報をお楽しみに!(下にツイッターアカウントがあります。)

これから(ポエム)

今回は間に合わせのために、自分のデータのみを用いてできるものを作りました。次はちゃんといろんなデータを用いて会話応答をちゃんと応答にしたいです。

この成果は、ここで終わりじゃないです。いろいろやりたいことのうちの1手目です。この辺のことをやろうとしてる人を多く観測しています。なにか面白いことがあったらぜひ気軽に声をかけて頂ければと思います。

Twitterアカウント → https://twitter.com/hiho_karuta

(この記事は、ドワンゴ Advent Calendar 2018の1日目の記事です。)