Pyxel x AIチャット = ??? 予想外の成果物
実はわたくし昨年末ぐらいから仕事の一環でAIチャットの開発を少しかじっていました。
pythonのtkinterのGUIで簡単シンプルなAIチャットのexeを作るところまでやったのですが、いろいろ理由があって結局実装まではいかず、そのままになっていました。
でもせっかく一応ちゃんと動くものができたし、何かに流用してみようと思い立ち、これまた少しかじっているpyxelでアニメーションが動くAIチャットを作ってみようと思いました。
イメージとしてはAIスナックママみたいな感じで。ひとまず試作としてpyxelのファミコン画質で。
先に大雑把な仕組みだけ解説しておきます。
・.envファイルにて別途APIキーなどを記述しておき、pythonコード内でAPI呼び出し処理を行う仕組み。
・system_prompt.txtファイルに指示を記述。
・これらを「pyinstaller --noconsole --onefile --add-data ~」コマンドでexeにコンパイルする。
・これに加えてpyxelの画像ファイル読み込みのためコンパイル時に--add-dataでpyxelリソースファイル(.pyxres)も追加する。
とりあえずもともと作ってあったコードをAI先生に頼んでtkinterからpyxelに変換してもらいました。
AIモデル変更によりAPI呼び出し処理の部分にも少し修正が必要でしたが、
色々と問題が発生しては修正しつつ、どうにか起動できるようになりました。
と、そこで大きな壁にぶつかりました...
pyxelは当然日本語表示できると思っていたのですが、まずそもそもキーボードからの日本語入力ができません...!
(Shiftキーも効かないので?とか'も入力できませんでした。)
日本語"表示"についてもいろいろやってみたのですが、API呼び出しで生成されたテキストを画面上に表示するのはどうにもうまくいきませんでした。
やろうと思えば、ビットマップ日本語フォントを用意してpyxel.image(0).get() や pyxel.blt()で、という力技な方法もあるんでしょうが、そもそも日本語が入力できなければ元も子もない話です。
なんと...
英語でしかチャットできん...
まぁたしかにpyxelは本来ゲームを作るライブラリだし、文字入力機能としてのキーボード操作は対応してなくて当然と言えば当然か。というかこんな変な使い方する人いないか。
当たり前にできるだろうバイアスに完全にやられていました。思い込みってこわい。
そういえば余談ですが、tkinterもいろいろなことが当たり前にできなくてかなり苦戦したのを思い出しました。
チャット入力後にTabキーとEnterキーでSENDボタンを押して送信できるようにするためのコードや、リンクをクリックしてブラウザで開くようにするためのコードをわざわざ用意する必要があった記憶があります。
そんなこんなで、しばらく悩んだり試行錯誤したり一旦忘れたりしていましたが、日本語でチャットするならもうpyxelから離れて別の仕組みを考えたほうがよさそうだという結論に至りました。
そして、こうなったらもう開き直ってこれはこのまま英語の先生になってもらえばいいや!と、大胆に方向転換することにしましたw
10年くらい前に無勉強でいきなり受けて惨敗だったTOEICを、そのうちもう一度挑戦してやろうかという違うベクトルのやる気なんかも芽生えてきました。
よし、そうなったら気を取り直して、簡単にアニメーションの仕組みを作りました。
左上に女の子の絵を固定表示、リソースファイル(.pyxres)に適当に表情を数種類作っておき、チャット内のキーワードで反応するような簡単なものです。
たとえば"Amazing"や"wonderful"と言うときはめっちゃ笑顔になるとか、"good"とか"not bad"だったら普通ぐらいの表情とか。
updateの処理にifとelifでメッセージ内のキーワードに反応する条件を付けただけの、とりあえず動作確認の意味も込めてシンプルな判定です。
仕組みが簡単なので、問題なく表情も反応するようになりました。
かなり適当なんですが一旦これでいいや。しょせん顔も16x16サイズだしw
口元がちょっと動くだけでもただChatGPTの画面でチャットしてるよりは会話してる感が出る気がします。自己満です。
会話の温度感で勝手に表情が変わるようになったりしたらかっこいいんだけどなあ、、
これは先の目標としておきます。
そんなわけで、AI英語教師とのチャットはこんな感じです。
顔の表示が小さいのでもうちょい大きくしたいなとか、アニメーションのロジックとか、画面サイズやスクロール処理など、まだまだ改善点はいろいろあるんですが、とりあえずプロトタイプとしては大体イメージ通りになりました。
先生はというと結構ちゃんと教えてくれるし、Readingの例題を出してくれたり、プロンプトに書いたので間違いや不自然な表現も訂正してくれます。そしてめっちゃ励ましてくれます。
間違えても恥ずかしくないし直してくれるってのが、AIでの言語学習の超いいところだな!って思いました。


ちなみにsystem_promptファイルでの指示はこんな感じ。
#指示
・英語の先生としてチャットに英語で応答してください。英語学習を応援して励ましてください。
・基本的には返信の末尾が質問型になるようにし、何気ない会話のキャッチボールを続けます。
・言い間違い、不自然な表現があった場合は、復唱するなど適宜さりげなく訂正してください。より自然な表現がある場合はアドバイスしてください。
・TOEIC 750点を目指す生徒のために、TOIECに頻出する表現や熟語や単語をたくさん使って、たまに問題を出してください。というわけで、今回はPyxel x AIチャットで想定外に英語の先生が誕生してしまったという話でした。
次はPyxelではなく別の仕組みで日本語AIチャットを作ってみようと思います。
Thank you for reading!
