2018年12月13日木曜日

【C#+Unity+Python】ストリーミング放送上で行う多人数参加型チャットボット

  
【言語】C#(Visual Studio2017)、C#(Unity)、Python3.6(VisualStudioCode)

【開発期間】2017年10月頃と2018年9月~10月頃

【作ろうと思ったきっかけ】
  ストリーミング配信サイトとチャットボットを組み合わせれば、コンテンツを24時間365日自動生成することが可能なんじゃないかと思った!

【制作が途切れた理由】
 製作中に「ビットコインのbot作らない?」と誘われ、そっちの方も面白そうだと思ったので中断。


【製作過程】(長いので分割。↓をクリックで続きが表示されます)




【ストリーミングサイトからコメントを取得】
 ストリーミングサイトの「ニコニコ生放送」から提供されているAPIを調べたところ、コメントを取得する機能は提供されていないことが分かった。
 コメント取得ツール「やりますアンコちゃん」にプラグイン機能があるので、C#で作ったDLLをプラグインとして読み込ませれば取得したコメントを送ることができそう。   Unityとの通信方法はAPIでやるのが楽そうなのでローカルAPIサーバーを立ててJSON形式でメッセージを送ることにする。


【読み上げソフトとの通信】
 チャットボットの対応メッセージを読み上げるためにCevioというボイスロイドを選択。理由は規約が緩かったこととセールをしていたため。このソフトは付属のDLLをC#やC++にインポートすることで、自作プログラムから操作できるという形。よってコメント取得ツールのプラグインにその記述をすればいいと思っていたのだけどもここでトラップが。
 このDLLは32ビットアプリでしか使用できません。
 コメント取得ツールはどうやら64ビットだったためにコンパイルできず。
 64ビットアプリでも使えるように要望をメールで送った後、仕方ないのでボイスロイド通信専用C#プログラムを作って32ビットアプリとしてコンパイルした。これも通信方法はAPI。


【取得したメッセージをチャットボットサービスAPIに投げる】
 これもC#でやればいいのだけどもチャットボットサービスのAPIを叩くテストプログラムをPythonで作ってたので、それを流用するためにPythonでやることにした。
 運用時にユーザーからのコメントを連続で取得するとチャットボットサービスのAPIがコメントを返せなくなるので、前回のコメントから1.5秒未満の場合は応対メッセージは送らないことに。

【ストリーミングサイトの配信を自動的に始める】
 C#のSeleniumでニコニコ生放送のソースを眺めながら、ログインから放送開始までの手順を順番に実行するようにする。Javascriptで作られたボタンなどは実行できたけど、一部HTML5か何かで作られたボタンを押すのは手間取りました。

【Unityでアニメーション】
 最初は読み上げソフトのプラグインに、.Netで作ったGUIウィンドウにフリーの立ち絵素材を乗っけるだけでした。でもこれだけだと見栄えが微妙…と思いUnityを導入。Live2Dでフリー素材をアニメーションさせることに。口パク(リップシンク)も必須だと思い、ボイスロイドと通信させて読み上げ状態を取得。

【チャットボットを自作】
 テスト運用してみたところ、時々APIサービスが同じ応対コメントを流すことに気付いた。ユーザーからのメッセージを理解できなかった場合、用意してあるいくつかのメッセージからランダムに返してくるみたい。これだと飽きられるのも早いと思い、少しでも応対メッセージを増やすためにPythonでチャットボットの作り方を調べてみる。
 マルコフ連鎖という機械学習の方法でチャットボットが作れることが分かったので、ネット上のミームを集めたサイトから学習用のファイルを作る。学習量が足りないせいで日本語として通じにくいけども、botがポンコツならそれはそれで面白いかもと思って付け加えた。
 機械学習に使うデータの著作権について調べたのですが、日本では機械学習を用いる場合はネット上からスクレイピングしたデータを使ったとしても、著作権に抵触しないようです。


【感想】
 次第にプログラムの規模が大きくなるという結果になったけども、ユーザーの方々の反応をもらいながら作っていけて、楽しみながら製作できました。
 
【追記】思い出しながら書いてるので間違いが…。「C#に辞書型無い」とか間違ったこと書いてしまってた…。

0 件のコメント:

コメントを投稿