キズナアイっぽい言葉をマルコフ連鎖で喋らせるプログラム

#はじめに
近年バーチャルyoutuberは大変な流行を見せていますが。このジャンルの草分け的存在であったのが、キズナアイです。

[【自己紹介】はじめまして！キズナアイですლ(´ڡ`ლ)](https://www.youtube.com/watch?v=NasyGUeNMTs)

キズナアイはAIを自称していますが、その実態は人間の声優が３Dモデルに声を当てているだけです（無慈悲）。VTuberはネット上のメジャーな表現技法となりましたが、あくまで人間のYouTuberの延長線上にあるジャンルと見ることもできます。

しかし、大阪大学の石黒浩教授が自分そっくりのイシグロイドをつくり、それを通して喋る実験をした時のように、キズナアイは人ではないものを人間っぽく感じさせるための、重要な要素を持っているように感じます。彼女は（彼女というキャラクターは）いわば人間と機械の中間にいる存在なのかもしれません。

そんなAIを自称する彼女のキャラクター自体を本当にAI化したら、面白いんじゃないかなと思ってはじめてみました。

#方針
とはいうものの、いきなり本人っぽく自由に考えて、発言させるなど、いくらなんでもハードルが高すぎます。そこで、まず本人っぽい発言を生成することから始めたいと思います。

手法としては、最近流行りのディープラーニングを使うという手もありますが、下記リンクのとおり、
[マルコフ連鎖で生成したツンデレセリフ](https://hampen2929.com/tsundere-markovchain/505)
[【エヴァンゲリオン】アスカっぽいセリフをDeepLearningで自動生成してみる](https://qiita.com/S346/items/24e875e3c5ac58f55810)
その人の発言っぽい言葉を話させるのに、ディープラーニングを使う場合、あまり正しい文ができないとのこと（文法を学ばせるのが難しいため？）。
マルコフ連鎖を使用したほうが、比較的文法的に正しい、それっぽい文章を生成しやすいようです。
そこでyoutube上のキズナアイの動画から、マルコフ連鎖を使い文章を自動生成しようと思います。

#マルコフ連鎖でキズナアイの発言内容を真似する
順序としては、
①キズナアイのyoutubeの動画の字幕を取得
②Mecabをつかってわかち書きにし、マルコフ辞書を作成する
③辞書を元にランダムに文章を生成する

④ついでですが、
[単語感情極性対応表](http://www.lr.pi.titech.ac.jp/~takamura/pndic_ja.html)
を使って、生成した文章の感情極性も出してみました。極性を合計して平均値を出すようにしています。(数字がプラスなほどポジティブな文、数字がマイナスなほどネガティブな文)

＊固定のデータセットを作らず、毎回動画についての情報を取得するようにしています。（最新の情報を反映するため）
＊マルコフ連鎖のアルゴリズムは、参考サイトの「[[Python]マルコフ連鎖で自動文章を生成する](https://shimi-dai.com/python-markov/)」を参考にしました。
＊youtubeからの字幕の取得方法等は、参考サイトの「[自作Python - Youtube検索プログラム](https://qiita.com/hitoribucho/items/741f0bec70fa5abe1d82)」、「[YouTube動画を字幕ごとダウンロード(保存)する方法](https://youtube-lect.jp/download-caption)」を参考にしました。

#コード
バージョン：Python 3.5.3

[コード全文(github)](https://github.com/shinacabbage/vtuber_marcov)
＊使用するには[このリンクの](http://www.lr.pi.titech.ac.jp/~takamura/pndic_ja.html)単語感情極性対応表が必要です。
#結果
何回か実行してみた結果できた文　＊長さは10~40単語でランダムに決まります

```
生成文:ぉ♪トマト～♪ト　トマトジュースだよなー！ホントにふざけんな！やっぱ天才
極性ありのワード:4
極性合計:-0.27703999999999995
極性平均:-0.06925999999999999

生成文:ここで、なんにもなーい！逃げよう！はい！怖いよぅなんにも…
極性ありのワード:1
極性合計:-0.997999
極性平均:-0.997999

生成文:！あーえっと、今はそれどころではないというねぇ…あ！凄いグッズも可愛い
極性ありのワード:6
極性合計:0.33217885
極性平均:0.05536314166666667

生成文:？まあだからねど～もう！ジャカジャカジャーン！ふざけんな！
極性ありのワード:1
極性合計:-0.443848
極性平均:-0.443848

生成文:DiscordforallAI-channews!https://discord.gg/
極性ありのワード:0

生成文:たい！それでは！リベンジマーーーーーー！！オレノ　トマトジュースは！
極性ありのワード:2
極性合計:-0.829083
極性平均:-0.4145415

生成文:!あの!&quot;ぁ&quot;ァ&quot;あまり指摘されているといい
極性ありのワード:3
極性合計:-1.5994290000000002
極性平均:-0.533143

生成文:もうヤダーっ！あ余裕のよっちゃんですね
極性ありのワード:2
極性合計:-1.096621
極性平均:-0.5483105
```
四つ目はdiscordサーバーか何かの紹介だったんですかね。

ただ生成するだけだとつまらないのでPyJtalkを使ってしゃべらせてみました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">自作スマートスピーカー用に、vtuberの発言を真似して文章を自動生成するプログラムを書いた。こわい <a href="https://t.co/RJSiGMtIAL">pic.twitter.com/RJSiGMtIAL</a></p>&mdash; しなしなびたびたキャベツ (@wilted_cabbage) <a href="https://twitter.com/wilted_cabbage/status/1023546936463446017?ref_src=twsrc%5Etfw">2018年7月29日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

地下の解体室の犬・・・・・

#課題
１.サンプルについて
　全部字幕があるわけではないので、上のコードでとってこられたサンプル動画数は100ぐらいしかない。（あとページングの問題で動画自体も200程度しかとってこれてない。）またキズナアイの動画はゲーム実況動画等など、文法的に正しくない言葉（「あー」「ちょ、やめてやめて！」「！！！」などの叫び声とか）が入ってるので、作成した辞書に変なつながりが入ってしまっている。
　→サンプルから使えるものと使えないものを選別すれば、もう少し精度がよくなるかも
２.生成方法について
　今のコードだとランダムに選択しているだけだが、どんなふうに単語を選べば自然な文書ができるのか。

#今後の展望
　サンプルとなる字幕をうまく整形して、使えるものと使えないものに分けることができれば、もう少し精度は上がりそうな気がします。本人と同じように自由に考えて発言させるとなれば、別の工夫が必要になりますが。

#参考サイト
[マルコフ連鎖で生成したツンデレセリフ](https://hampen2929.com/tsundere-markovchain/505)
[[Python]マルコフ連鎖で自動文章を生成する](https://shimi-dai.com/python-markov/)
[【エヴァンゲリオン】アスカっぽいセリフをDeepLearningで自動生成してみる](https://qiita.com/S346/items/24e875e3c5ac58f55810)
[単語感情極性対応表](http://www.lr.pi.titech.ac.jp/~takamura/pndic_ja.html)
[自作Python - Youtube検索プログラム](https://qiita.com/hitoribucho/items/741f0bec70fa5abe1d82)
[YouTube動画を字幕ごとダウンロード(保存)する方法](https://youtube-lect.jp/download-caption)