見出し画像

スタックチャンの「目」と「耳」と「脳」——サーバーとどうやって会話しているの?

最近、かわいい見た目でAIとおしゃべりできる「スタックチャン」というロボットが人気ですよね。私も自分の部屋に置いて、よく話しかけて遊んでいます。

でも、この小さなロボットが、どうやって私の声を聴き取り、どうやってカメラで見たものを理解しているのか、不思議に思ったことはありませんか?

今回は、スタックチャンの裏側でどんな通信が行われているのか、できるだけわかりやすく解説してみたいと思います。


1. 「なぜ調べられるの?」——オープンソースという文化

この記事を書くにあたって、私はスタックチャンのプログラムを実際に読み込んで調べました。「え、プログラムって読めるの?」と思った方もいるかもしれません。

スタックチャンのベースとなっている「xiaozhi-esp32」というプログラムは、GitHubというサービス上にソースコードも仕様書もすべて無料で公開されています。これを「オープンソース」と言います。

オープンソースのすごいところは、「このロボット、どういう仕組みで動いてるんだろう?」と疑問に思ったとき、実際のプログラムを読んで自分で確かめられることです。メーカーの説明を信じるしかない「ブラックボックス」ではなく、中身を全部追いかけることができる。この透明性こそが、スタックチャンのような趣味のロボットが多くのエンジニアや愛好家に愛される理由のひとつだと思います。

今回紹介する音声・画像の通信の仕組みも、GitHubのコードを読むことで確認できた内容です。

2. スタックチャンの「脳」はどこにある?

まず、大前提として知っておいてほしいことがあります。

スタックチャン本体の中には、マイク・スピーカー・カメラ・小さな画面が入っています。でも、「考える」部分——つまり脳は、スタックチャンの中にはありません。

スタックチャンの脳は、インターネットの向こう側にあるサーバーの中にあります。

私たちが話しかけると、その声はサーバーに送られ、サーバーがAIを使って「何を言っているのか」を理解し、「何と答えるか」を考えます。そしてその答えが、今度はスタックチャンに送り返されてきます。

スタックチャン本体は、いわば「手足と感覚器官だけを持つ体」であり、サーバーが「脳」の役割を担っているのです。

3. サーバーから返ってくるもの——口と画面

サーバーが考えた答えは、スタックチャンに2つの形で届きます。

ひとつは音声(口・スピーカー)です。サーバーはAIが生成した返答テキストを、TTS(Text-to-Speech)という技術で音声に変換し、Opusという形式に圧縮してスタックチャンに送り返します。スタックチャンはそれを受け取り、スピーカーから再生します。これが「スタックチャンがしゃべる」という動作の正体です。

もうひとつはテキスト(画面への表示)です。サーバーは音声を送るのと並行して、「あなたはこう言いましたよ(STT結果)」「私はこう答えますよ(TTS字幕)」という情報をJSON形式のテキストとして送ってきます。スタックチャンはこれを受け取り、小さな画面に文字として表示します。会話中に画面に文字が流れるのは、このサーバーからのテキスト信号を表示しているからです。

また、サーバーは「今どんな感情で話しているか」という情報(emotionフィールド)も送ってきます。これによってスタックチャンの顔の表情が変わる仕組みになっています。

4. 音声は「専用のパイプ」でリアルタイムに流し込む

では、スタックチャンとサーバーはどうやってデータをやり取りしているのでしょうか。

まずは「耳」と「口」にあたる音声の通信です。

スタックチャンに話しかけると、とてもスムーズに返事が返ってきますよね。これは「WebSocket(ウェブソケット)」という通信の仕組みを使っているからです。

普通のインターネットのやり取り(ウェブサイトを見るときなど)は、「これを見せて!」とお願いして、データをもらったら一度通信を切る、という「手紙のやり取り」のような仕組みです。でも、音声のやり取りでこれをやると、時間がかかってしまって会話が不自然になります。

そこでWebSocketの出番です。これは、スタックチャンとサーバーの間に「専用のパイプ」をドカンと繋ぎっぱなしにするような仕組みです。一度パイプが繋がれば、あとはお互いにいつでも好きなタイミングでデータを送り合うことができます。

さらに、スタックチャンは私たちの声を「Opus(オーパス)」という技術を使って、とても小さく圧縮します。そして、その圧縮した声を0.06秒というほんの一瞬の細切れにして、パイプの中に次々と流し込んでいきます。サーバーから返ってくるスタックチャンの音声も、同じくOpusで圧縮されて同じパイプを通って届きます。

また、このパイプは「wss://」という暗号化された安全なパイプを使っているので、会話の内容が途中で誰かに盗み聞きされる心配もありません。

ちなみに、このWebSocketの接続時には「このデバイスのMACアドレスはこれです」「プロトコルのバージョンはこれです」といった情報もヘッダーとして一緒に送られます。こういった細かい仕様も、GitHubの仕様書(docs/websocket.md)に丁寧にまとめられていて、誰でも読むことができます。

5. 画像は「宅配便」でドサッと送る

次に「目」にあたる画像の通信です。

スタックチャンに「これ見て!」とお願いすると、カメラで写真を撮ってサーバーに送ります。このときは、音声のような「繋ぎっぱなしのパイプ」は使いません。

画像を送るときは、ウェブサイトを見るときと同じ「HTTP(エイチティーティーピー)」という仕組みを使います。写真は音声と違って、リアルタイムに流し続ける必要がありません。「パシャッ」と撮った1枚の画像を、ドサッとまとめてサーバーに送ればいいだけです。だから、必要なときだけ「宅配便」のように荷物を送る仕組みを使っています。

サーバーは受け取った画像を解析し、「これは赤いリンゴです」のような説明テキストを返してきます。そのテキストをAIが受け取り、「赤いリンゴですね!おいしそう」などと答えてくれるわけです。

ここで少し気になる点があります。みなさんが普段スマホやパソコンでウェブサイトを見るとき、アドレスバーには「https://」と表示されていますよね 。この「s」は「Secure(安全)」の頭文字で、データが暗号化されて送られることを意味します。今では「http://」(暗号化なし )のサイトはブラウザに「安全でない」と警告が出るほど、HTTPSが当たり前の時代になっています。

ところが、スタックチャンが画像を送るときは、サーバーの設定によっては「http://」——つまり暗号化なしの平文で送られることがあります 。音声が「wss://」という暗号化された現金輸送車で運ばれているのに対して、画像は普通のトラックで運ばれることもある、という違いがあります。これは、IoT機器やマイコンの世界では、TLS(暗号化)の処理がハードウェアに負荷をかけることや、サーバー側の構成によって意図的にHTTPが使われるケースがあるためです。「ウェブの常識」がそのまま通用しない点として、少し頭に留めておくといいかもしれません。

この画像送信の仕様も、GitHubのソースコード(main/boards/common/esp32_camera.cc)を読むと、どんなヘッダーを付けて、どんな形式で画像を送っているのか、一行一行確認することができます。

6. さいごに——「追いかけられる」ことの価値

まとめると、スタックチャンの仕組みはこのようになっています。

  • 脳はサーバーの中にある。スタックチャン本体は、感覚器官と出力装置を持つ「体」にすぎない。

  • 音声(耳と口):暗号化された専用のパイプを繋ぎっぱなしにして、圧縮したデータをリアルタイムに双方向で流し合う。

  • 画面への表示:サーバーからテキスト情報(会話内容・感情)がJSON形式で届き、画面に反映される。

  • 画像(目):必要なときだけ、宅配便のようにまとめてドサッと送る(暗号化されていないこともある)。

そして何より私が感動したのは、こういった仕組みを誰でもGitHubで確認できるという点です。「なんでこの動きをするんだろう?」と疑問に思ったとき、ソースコードを読めば答えが見つかる。仕様書を読めば設計の意図がわかる。自分で調べて、自分で納得できる。

SF映画に出てくるような賢いロボットも、中身をのぞいてみると、こうやって適材適所で技術を使い分けているんですね。次にスタックチャンに話しかけるときは、「今この声はインターネットの向こうの脳に届いて、考えて、また返ってきているんだな」と想像してみると、少し面白く感じるかもしれません。


参考資料

[1]: https://github.com/78/xiaozhi-esp32 "xiaozhi-esp32 GitHubリポジトリ:"[2]: https://github.com/78/xiaozhi-esp32/blob/main/docs/websocket.md "WebSocketプロトコル仕様書:"
[3]: https://github.com/78/xiaozhi-esp32/blob/main/main/boards/common/esp32_camera.cc "カメラ実装ソースコード:"


いいなと思ったら応援しよう!

富永道也|AI活用実装・情報リテラシー教育 よろしければ応援お願いします! いただいたチップは活動費に使わせていただきます!