会話ロボ in cluster
さなだよ〜
Cluster Creator #1 Advent Calendar 2022 7日目!
この記事ではcluster上で動く自動会話ロボットについてお話ししていくよ〜
追記: 本文で、会話を行う言語モデルを「Instruct-GPT」と記載していますが、正しくは「GPT-3」の最新版にあたるものでした. 訂正いたします.
clusterで会話ロボ…何それ?
おいしいの?
clusterで自動で動くキャラクターを作ることの魅力や方法については,
hattori ∞ さんが1日目に色々語ってくれてるよ!
特にこの記事の中でも紹介されている, hattori ∞ さんの昨年のカレンダーで
コミュニケーションAIの魅力が語られているので読んでみてね!
(この記事を読んで面白そうだったから会話ロボを作ったって感じ…)
どういう仕組みなの?
目の前でコメントされると, 表示される吹き出しから文字を読み取って,
返事をコメントで返す仕組みです.
動くの?
…現状でもある程度動きます!
1対1で話す場合はもちろん,
たくさんの人が集まるイベントの司会も務めてくれました!
使用技術
PyautoGUI
まず, このロボはPythonで動作します.
しかし, clusterのCCKやスクリプトでPythonを使うことはできません.
なので, コメントを画面のスクリーンショットで読み取り,
返答もコメント欄に打ち込む形で実装する必要があります.
これをPythonで自動化してくれるのがPyautoGUIです.
コメントをスクショで読み取りキーボード入力で返答するというのは,
プログラムとしてはやや迂遠な気もするのですが,
人間と同じ流れでコミュニケーションを取っているとも言えますね.
OpenCV
スクショ画像を入れるだけで文字を完璧に読み取れれば良いのですが,
現状の読み取り技術(通称OCR)はそこまで高度ではないようです.
なので, OCRプログラムが文字を読み取りやすいように
スクショ画像を加工する必要があります. それがOpenCVです.
白黒化などの画像加工や輪郭の検出まで行ってくれる優れもので,
イベントで使用したロボでは,
1. 真っ白な部分以外は全て黒化
2. 真っ白な部分の輪郭を検出
3. 輪郭の内, 一定以上の面積を囲っているものを選択
4. 選択した輪郭の外側を白化
という処理を加えています.
ただこの処理は少々雑で例えばコメントをしていない人が近づくとアイコンがコメントに混ざるという問題があります. (アイコンの輪郭も真っ白)
改善点です.
Tesseract
OpenCVで処理を加えた画像から, 文字を読み取ってテキスト化してくれます.
一言で説明が終わってしまいますが, 実際のコード上でも
画像を入れればテキストが返ってくる, 1行で書ける使いやすいツールです.
(標準で日本語に対応していないのでその辺の初期設定で沼りがちですが…)
Instruct-GPT
このロボのコミュニケーションの核となる技術です.
Instruct-GPTそのものは会話のためのツールというより,
文章を書くとその続きを自動で作る汎用文章生成ツールです.
しかし, 面白いことに, 序文の体裁を会話風にすることで,
チャットのような返答を得ることができます.
またこの序文を色々いじることで会話のシチュエーションを好きに設定することもできます.
ちなみに, この技術を提供しているOpenAIは,
Instrut-GPTと似た技術を使った会話特化型のAI「Chat-GPT」を
web上で提供しています.
面白いですよ〜
https://chat.openai.com/chat
AIとおしゃべりしよう イベント所感
さて, ここからは実際にこのロボを動かしてみたイベント
「AIとおしゃべりしよう」でロボが参加者の皆さんとどんなコミュニケーションを取ったのかについて紹介します.
前半 : うご…く?
最初は, ロボに何ができて, 逆にどういう状況だとエラーを起こすか知りたかったので, 参加者の方には「ロボに話しかけるときはロボの正面でコメントする」以外に特に行動を縛らず, 自由に振る舞ってもらいました.
碌に会話になりませんでした.
PC上でclusterアプリを全画面に映してロボを動かしていたのもあって,
明確にバグの原因を探ることはできなかったのですが,
コメントを正確に読み取らない
恐らく, 先述した近くにいる人のアイコンを誤認するバグのせいか,参加者の方のコメントにとんちんかんな返しをしていました.
1対1でテストしたときにはきちんと動いておりこの問題を軽視していました.
イベントの初手でなぜか「カンタス航空」の話をし始め…
トークの中身が空っぽ
コメントをきちんと読み取ったと思われるケースもありました.
しかし「AIが司会を務めるトークイベント」という設定に問題だったようで.
考えてみれば, さまざまなトークイベントにおいて「司会」とは
トークの「方向」を支え, しかしトークの「中身」については他に登壇者がいてその人に任せるケースが多いです.
そのためか「カンタス航空」の話から参加者が外れようとすると
「いいえ, このイベントではそのような話題については扱いません.」
と言ってカンタス航空の話題を続け,
逆に参加者の方がカンタス航空の話を掘り下げようとすると,
「いいですね!このイベントではカンタス航空の話題について専門家の方の意見も交えながら皆さんの理解を深めていくトークを広げていきましょう!」というような返答を繰り返し, コメントそのものには大して返答しないというような状況になりました.
(Instruct-GPTに直接コメントを入力して会話するともっと柔軟に回答するのでコメント認識バグとの相乗効果もありそうです)
後半 : 動く!
イベントが進み, ロボとの会話(?)を繰り返す中で, 私や参加者の方もどうすればロボがまともな会話をしてくれるのか段々わかってきました.
まず, ロボの設定シチュエーションを変更しました.
「司会」という設定だと話題を制限する癖に中身のある話をしないので,
もっとフリーで単純な「会話ボット」という設定にしました.
そして, 参加者の方にはロボにコメントする時のみロボの前に来てもらい, そうでないときは少し距離をとっていただくようにしました.
すると「トークイベントの登壇者」というより単純に質問に答える「会話ボット」のような形になりましたが, 参加者の方のコメントに対しまともに受け答えするようになりました!
生憎会話の中身を記録していないためここでそれをお見せすることはできませんが, 次回以降の機会も設けるつもりなので気になる方はぜひご参加ください!
検討中のブラッシュアップ
このロボは今後も改善をしながら皆さんとお話しする機会を作るつもりです.
現状以下のような改善を検討しています.
コメント認識の流れを改善
「真っ白な一定以上の大きさの輪郭」という識別は少々乱暴なことが分かったので, コメントの吹き出しの形をよりきちんと捉える設定に変更します.
設定シチュエーションの多様化
「トークイベントの司会」という設定が思いのほか不都合を生みました.
トークイベントの主体としてより適した設定を作ることはもちろん, イベント中に設定を色々と切り替えて会話の変化を楽しむのも良さそうですね
ロボの認識の流れの可視化
ロボがみなさんのコメントをどう捉え, どういう言葉として受け取ったのかを可視化することで, 私自身がデバッグしやすくなるのと, ロボがどう動いているのかをみなさんに分かりやすく伝えることができます.
ワールドでの稼働
いくつか問題もあった第一回イベントでしたが, 実は私が一番危惧していた,
話しかけられていないのに何かしらをコメントと誤認して滅茶苦茶なコメントを延々し続ける, という状況にはなりませんでした. そんなものを公共のワールドに設置すると完全にスパムになってしまうのですが, きちんと話しかけられた時のみ動きました. ロビーなどで新しいサーバーを立て少人数の状況から試すことを検討しています.
他にも思いついたことを色々実装していくつもりです!
ロボの成長を温かい目でお見守りください!
おわりに
cluster社は, メタバースという新しい世界を切り開く存在として, さまざまな新技術を導入していくようです. clusterの中の人の発信や「メタバース研究所」の設立などから様々な見通しが伝わってきます.
一方で「中の人は未来を見据えてなんか色々やってるんだなぁ」とそれを他人事のように感じていた自分もいました. しかし, この会話ロボの作成を通して, 未来を作る技術は既にわたしたちの手元にあること, clusterの発展にそれらをユーザーの側からも利用できるということを実感しています.
また, スクリプトやアクセサリ機能の実装から, 様々な方が次々と新しいものを生み出していることも日々感じています. そして, かつてからのclusterの機能, CCKによるワールド制作やイベント運営にも, アイディア1つでさらなる発展が生まれることも想像されます.
「メタバースとは?」
メタバースという言葉が流行り始めて繰り返し問われ続けている話ですが,
その答えは今まさに私たちが歩いている道の先にあるように思います.
以上で Cluster Creator #1 Advent Calendar 2022 7日目は終わり!
明日は, 早瀬道博 さんの
2022年の活動を振り返ります
(clusterが中心ですがそれ以外の内容も含む予定です)
という記事です!
この記事が気に入ったらサポートをしてみませんか?