AIスタックチャンミニマルとわたくし
https://scrapbox.io/files/674ba7035b658f39237ca597.svg
2024/12/03 スタックチャン(Stack-chan) Advent Calendar 2024
むとうたけし /610t/610t
この文章は、スタックチャン(Stack-chan) Advent Calendar 2024の3日目のエントリとして作成されました。
はじめに
みなさん、スタックチャン(Stack-chan)愛でてますか?
この文章では、A-Utaさんの作られているAIスタックチャン - ミニマル(AI Stack-chan Minimal)を使ってむとうが遊んでいる内容をご紹介します。
むとうの作業に関する詳細を知りたい方は、ProtoPediaのAIスタックチャンミニマルProto化版とtoioの素敵な関係もご覧ください。
AIスタックチャン - ミニマル
https://scrapbox.io/files/674ba7035b658f39237ca597.svg
AIスタックチャンミニマルの構成は図のようになります。この構成は、他の普通のAIスタックチャンと同じ構成になっており、同じようにAIすることができます。
作者によるスタックチャン(Stack-chan) Advent Calendar 2024での解説は、18日目をご覧ください。
公開後リンク追加
AIスタックチャンミニマルの標準的な構成では、以下のような部品が用いられます。これだけで、AI動作ができるスタックチャンを手に入れることができます。
ハードウエア構成は、以下の通りです。
ATOM Echo - スマートスピーカー開発キット(¥2,475)
SSD1306
ジャンパーケーブル
ソフトウエア/サービスの構成は以下の通りです。サービスによっては利用登録や課金が必要なので、注意してください。
Google Speech to Text:音声テキスト化
ChatGPT: AI機能
VoiceVox: 発声
むとうの構成では、上記の部品以外に以下のものを利用しています。
AIスタックチャンミニマル構成用(必須)
ATOMICプロトキット (¥605)
バッテリーとtoioとの接続
Atom Mate for toio (¥5,060)
toio(スイッチサイエンス,¥7,128)
toio操作用
M5Stack Core(Basic) (¥6,941)
Joystick(以下のどれか)
M5Stack用 I2Cジョイスティックユニット (¥2,376)
I2C Joystick 2 Unit (STM32G030) (¥880)
M5Stack Faces用ジョイスティックパネル (¥1,023)
Proto Kit版筐体
https://gyazo.com/852adc617c86cdaf1353a8eb7177632d
むとうは3Dプリンターを持っていないので、ATOMICプロトキット(¥605)を使って、筐体を作成しました。
写真のように、簡単なハンダ付で、AIスタックチャンミニマルが構成できます。
https://gyazo.com/b49272c3fff521eebe385db38e684043
うれしい副作用として、Atom Mate for toio(¥5,060)と接続可能なLEGO穴が付いているので、簡単にtoio(スイッチサイエンス,¥7,128)と接続できるようになります。
https://gyazo.com/0fedb39c6599eabcdb3088f17366c5f1
Atom Mate for toioはバッテリーを積んでいるのですが、Grove端子から5VとGNDを接続してあげることで、Atom Echoを動かすことができます。
手元では、Atom Mate for toioのバッテリーを使うと、90 mAh版では30分程度、160 mAh版では1時間程度、利用することができました。
toioとの連携
はじめにごめんなさいなのですが、ここで紹介する構成では、Atom Echoからtoioを操作しているわけではありません。他のM5Stackシリーズからtoioを操縦するという構成になっています。
https://www.youtube.com/watch?v=-lgxvZjHF7A
toio(スイッチサイエンス,¥7,128)は小型のロボットで、専用マットを使うと位置や向きをきっちりと決めたりすることができます。その他に、フルカラーLEDが光り、音も出せるようになっています。
toioには、toioDoと呼ばれるScratchのようなブロックプログラミング環境が提供されており、簡単にプログラムを作ることができます。toioDoでは、様々な拡張機能が利用できる仕組みが用意されており、ChatGPTやPoseNetなどの機能も利用可能になっています。
M5StackToioは、M5Stackを使ってtoioを操作するためのライブラリです。このライブラリのexampleとして、Joystickでtoioを動かすプログラムが提供されています。今回は、これを使ってAIスタックチャンミニマルProto版を動かしてみたいと思います。実際の動作の様子は、上のYouTube動画をご覧ください。むとうは、このプログラムをM5Stack Faces用ジョイスティックパネル(¥1,023;EoL)とI2C Joystick 2 Unit (STM32G030) (スイッチサイエンス(¥880))で使えるようにしました。
(2024/12/09追記):Joystick以外にも、M5Stackシリーズの中には加速度センサー(IMU)が付いたものがあるため、これで操縦することも可能です。
この例は、M5StackToioとわたくしのおまけとして紹介していますので、興味のある方はご覧ください。
(2024/12/09追記):さらに、UIFlowから加速度センサーを使って操縦することも可能です。以下のコードを参照してください(動作の様子)。
https://gyazo.com/91b20c1a64aa37ee66617aebf21af851
Web質問インターフェース(テキストで会話)での応答表示
https://gyazo.com/b5665ecb98ef8b69979b39d49551117a
AIスタックチャンミニマルには、Webインターフェース(テキストで会話)が用意されており、ここから質問を入力することができるようになっています。話しかけて答えてもらうのは素敵なのですが、こちらも便利に利用することができます。
今回、むとうは、このUIに質問と答えの内容を表示するように改造してみました。
これで、スタックチャンの答えを聞き逃しても大丈夫です!!
実際の改造点は、Web質問インタフェース(テキストで会話)で、質問内容とその答えを表示するようにした。をご覧ください。
Xのpostを呟いてもらう
X APIを使うと、JSONで特定のユーザーのPostを取得することが可能です。
このようにして取得したデータから、文章だけを取り出して、スタックチャンにしゃべってもらおうと思いました。
以下のようなコマンドで、ユーザー610tのPostを取得することができます。
<bearer>部分は、自分のBearer IDを使ってください。
$ curl --request GET --url 'https://api.x.com/2/tweets/search/recent?query=from:610t' --header 'authorization: Bearer <bearer>' > tweet.json
取得したデータを整形すると、以下のようになります(✂️snip✂️部分で一部省略しています)。
code:tweet.json
{
"data": [
{
"id": "1863903391929561095",
"edit_history_tweet_ids": [
"1863903391929561095"
],
"text": "いつものネコちゃんピンズ。 https://t.co/Dy4atZT0YH"
},
{
"id": "1863859092772806770",
"edit_history_tweet_ids": [
"1863859092772806770"
],
"text": "すげえ、またか!!\n9月号も載ってたのに!! https://t.co/4DCTtPrENO"
},
{
"id": "1863852363397943787",
"edit_history_tweet_ids": [
"1863852363397943787"
],
"text": "うーん、10個もいらんくて、1個だけPost取りたいんだけどなぁ。Free版の制限もあるし。\n\"The max_results query parameter value 1 is not between 10 and 100\""
},
=========✂️snip✂️==========
],
"meta": {
"newest_id": "1863903391929561095",
"oldest_id": "1863792245889269848",
"result_count": 10,
"next_token": "b26v89c19zqg8o3frr3s57s0qpdho0ajqobzedsu7c2v1"
}
}
以下のようなコードで、ランダムにPostを選んでスタックチャンに尋ねることができます。192.168.11.126部分はあなたのスタックチャンのIPアドレスに置き換えてください。
code:StackChan.py
# coding: utf-8
import random
import json
import requests
import time
IP = '192.168.11.126'
POST_URL = 'http://'+IP+'/text_chat_set'
HEADER = {'Content-Type': 'text/plain;charset=UTF-8'}
file = open('tweet.json','r')
tweet = json.load(file)
num = len(tweet'data')
while True:
pos = random.randrange(num)
msg = tweet'data'pos'text'
print('msg:{}'.format(msg))
try:
requests.post(POST_URL, headers=HEADER, data=msg)
except requests.exceptions.RequestException:
print("Maybe Response Error.")
time.sleep(60)
おわりに
AIスタックチャンミニマルは、とてもちっさくてかわいく、その上AIを使って答えてくれる頭のかしこい、良い子です。
https://gyazo.com/c0fa36dc03725a67d110ad70be0b37be
むとうの机の上には、この子とBluetoothスピーカー版が鎮座し、癒しと驚きを与えてくれています。
みなさんも、AIスタックチャンミニマルしませんか?
Enjoy スタックチャン life with AIスタックチャンミニマル!!
謝辞
以下のプロジェクトを利用させていただいています。
ありがとうございました。
- AIスタックチャン - ミニマル(AI Stack-chan Minimal)
- M5StackToio