1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MetaのパーソナルAI「muse」を持ち歩けるポケットデバイスを作ってみた

1
Last updated at Posted at 2026-10-25

約4,000円のマイコン1本、はんだ付けなしで、Meta の AI「Muse」をポケットに入れて持ち歩けるようになりました。 ボタンを押して話しかけると、返事が画面に日本語で表示されます。
IMG_6639.jpeg

Meta のパーソナル AI「Muse」は、一昨日(2026年10月23日)から日本でも使えるようになりました。せっかくなので、スマホを開かなくてもボタンを押して話しかけるだけで Muse に頼みごとができる、手のひらサイズの端末を作ってみました。

使ったのは、以前ロボット制作で使っていた小型マイコン M5StickC Plus2 です。ハエの脳で動くロボットの「頭」にしていたものを、今回は Muse 専用の端末にしています。

この記事でわかること

  • Muse と、自作の機器から Muse を使える「Muse Gadgets」とは何か
  • M5StickC Plus2 を Muse 端末にする手順(Windows)
  • 公式 SDK のままだと出る LOST CONNECTION TO MUSE / CAN'T REACH MUSE と、文字化けの直し方(設定2行)

Meta 公式の開発キットは StickC Plus2 に対応していますが、そのままでは話しかけた瞬間に通信エラーになり、返事も文字化けしました。 設定を2行足すと直ります(§4-3)。

コードを書くのも、エラーの原因を調べるのも、ほぼ Claude Code に任せています。


1. Muse とは

Muse は、Meta が2026年9月に米国で公開した パーソナル AI エージェントです。ChatGPT のように質問に答えるだけでなく、メールの送信、旅行の予約、フォームへの入力など、頼んだ用事を代わりに片付けてくれるのが特徴です。

  • Muse アプリ、WhatsApp、Web 版(muse.ai)から、人にメッセージを送るように話しかけて使います
  • アプリを閉じたあとも作業を続け、承認が必要になると知らせてくれます
  • 前に話した内容を覚えていて、次の提案に使います
  • メール送信や買い物など大事な操作は、実行する前にかならず確認を求めてきます
  • 多くの基本機能は無料で、もっと使いたい人向けに有料プランがあります

詳しくは Meta の公式発表を見てください:すべての方のために構築された世界初のパーソナルAIエージェント「Muse」

Muse Gadgets:自作の機器から Muse を使う

2026年10月、Meta は「Muse Gadgets」を公開しました。ESP32 というマイコンを積んだ機器(M5Stack など)や Raspberry Pi から Muse と会話できる仕組みで、そのための開発キット(SDK)とファームウェアが GitHub でオープンソース公開されています。今回はこれを使いました。


2. M5StickC Plus2 とは

M5StickC Plus2 は、中国の M5Stack 社が作っている画面・ボタン・マイク・バッテリーが全部入ったスティック型のマイコンです。Wi-Fi と Bluetooth も使えます。手のひらに収まる大きさで、プログラムを書き込めば時計にも、センサーにも、ロボットの頭脳にもなります。

項目 内容
マイコン ESP32-PICO-V3-02(Wi-Fi / Bluetooth)
メモリ フラッシュ 8MB、PSRAM 2MB
画面 1.14インチ カラー液晶(135×240)
音声 マイク(PDM)、ブザー
ボタン 3つ(正面・側面・電源)
電源 バッテリー内蔵、USB-C で充電

Muse Gadgets に必要な「マイク」「ボタン」「画面」「Wi-Fi」が最初から全部そろっているので、部品を買い足さず、はんだ付けもせずに Muse 端末にできます。

どこで買えるか

M5StickC Plus2 は生産終了しています。 販売店に残っている在庫がなくなった時点で、手に入らなくなります。後継機の M5StickS3 も Muse Gadgets SDK が対応しているボードの一覧に入っていますが、私は試していません。この記事の手順は Plus2 で確認したものです。


3. 作ったもの

ボタンを押している間だけ話を聞いてくれる、ポケットサイズの Muse 端末です。

[M5StickC Plus2] --Wi-Fi--> [Muse(クラウド)]
  ボタンを押している間だけ録音(トランシーバーと同じ使い方)
  内蔵マイクで録音 → Muse に送る
  返事 → 画面に日本語で表示 + ブザーから音声

IMG_6629.jpeg

ボタン 動作
正面の大きいボタン(BtnA) 押している間だけ録音して話しかける
側面のボタン(BtnB) メニュー
電源ボタン(2秒長押し) 電源オフ

待っている間、画面には READY と表示されます。ボタンを押して「明日の天気を教えて」のように話しかけ、指を離すと、Muse の返事が画面に1行ずつ流れます。

ブザーは音が小さいので、返事はおもに画面で読むことになります。


4. 作り方(Windows)

ここから先は手を動かす人向けです。

4-1. 準備するもの

  • M5StickC Plus2
  • データ通信ができる USB-C ケーブル(充電専用のケーブルは使えません)
  • Windows の PC(Windows 11 で確認しました。Git を入れておきます)
  • Muse アプリが入ったスマホ。アプリの Settings > Devices > Developer mode をオンにしておきます
  • SDK トークン(mgst_ で始まる文字列):gadgets.muse.ai の Account > SDK tokens で発行します。自作の機器を Muse につなぐための合言葉のようなものです。先に利用規約(Gadget SDK Terms)を読んでおいてください
  • 2.4GHz の Wi-Fi(このマイコンは 5GHz に対応していません)

以前の私のように StickC Plus2 にロボット台車(Hat BugC2)を付けている場合は、外してから使ってください。 BugC2 が使う G0 ピンは、Muse のファームウェアではマイクが使っています。下の Grove ポートにつないだ ToF センサーは使うピンが重ならないので、付けたままで問題ありません。

4-2. 開発環境(ESP-IDF)を入れる

ESP-IDF は、ESP32 用のプログラムを作るための開発環境です。この SDK は v6.0.1 しかサポートしていません。

git clone -b v6.0.1 --recursive --shallow-submodules --depth 1 https://github.com/espressif/esp-idf.git C:\esp\esp-idf-v6
C:\esp\esp-idf-v6\install.ps1 esp32

git clone https://github.com/facebookincubator/muse-gadget-sdk.git C:\esp\muse-gadget-sdk

ダウンロードの量が多いので、時間に余裕があるときに始めてください。

4-3. Plus2 用の設定に2行足す(ここが一番大事)

C:\esp\muse-gadget-sdk\esp32\devices\sdkconfig.muse-m5stack-stickc-plus2 をテキストエディタで開き、末尾に次の行を追加します。

# The voice session's full buffers would leave 2 MB of PSRAM nearly empty once
# connected, and chat turns run out of memory.
CONFIG_MUSE_HATCH_COMPACT_BUFFERS=y
# Japanese replies: ~850 KB of flash, no RAM.
CONFIG_MUSE_CJK_FONT=y

1行目:LOST CONNECTION TO MUSE / CAN'T REACH MUSE が出るときの直し方

足す前は、ペアリングも Wi-Fi もうまくいったのに、話しかけると LOST CONNECTION TO MUSE(Muse との接続が切れた)、2回目からは CAN'T REACH MUSE(Muse に届かない)と表示されました。

マイコンが出力するログ(動作記録)を見ると、Wi-Fi は正常につながっていました。問題は、PSRAM(作業用のメモリ)の空きが 2KB しかなかったことです。

I (144246) link.heartbeat: hb t=143s setup=done wifi=up ws=up ... psram=2K ...
E (149210) muse_chat_session: send failed
W (149222) muse_chat_session: turn failed: LOST CONNECTION TO MUSE
E (157600) muse_voice: no memory to keep a note
E (172113) muse_chat_session: handshake msg1 failed
W (190127) muse_chat_session: turn failed: CAN'T REACH MUSE
E (194343) HTTP_CLIENT: Allocation failed

画面には「接続が切れた」「届かない」と出ますが、実際にはメモリが足りなくて処理できなかったのが原因です。

SDK の変更履歴を調べると、同じく PSRAM が 2MB の別のボード(Waveshare LCD-1.28)で、この問題を直した記録が見つかりました。音声のやりとりには PSRAM を約830KB使いますが、この設定を入れると約220KBに減ります。LCD-1.28 の設定ではこれがオンになっているのに、同じ 2MB の Plus2 の設定には入っていませんでした。

足す前 足した後
接続中の PSRAM の空き 2K 405K
Muse との暗号化通信の確立 failed session established
話しかけたとき LOST CONNECTION 返事が来る

2行目:Muse の返事が文字化けするときの直し方(日本語フォント)

もともとの画面のフォントには英数字しか入っていないので、日本語の返事は文字化けします。この設定を入れると、ひらがな・カタカナ・漢字・全角文字の 16×16 ドットのフォントが組み込まれます。

  • 増えるのはフラッシュ(保存領域)約850KBで、作業用のメモリは使いません。プログラムは 2.10MB から 2.95MB に増えましたが、書き込み先の領域は約3.9MB あるので収まります
  • 画面が小さいので、日本語の返事は 16px の文字で1行ずつ表示されます

4-4. ビルドして書き込む

SDK に付いているスクリプトは Linux や Mac 向けなので、Windows 用の PowerShell スクリプトを用意しました。ビルド(プログラムをマイコン用に変換する)、書き込み、ログ表示の3つができます。

C:\esp\muse_plus2.ps1
# Muse Gadget firmware for M5StickC Plus2 - build / flash / monitor on Windows
#   .\muse_plus2.ps1 build
#   .\muse_plus2.ps1 flash COM5
#   .\muse_plus2.ps1 monitor COM5
param(
    [Parameter(Mandatory)][ValidateSet('build', 'flash', 'monitor')][string]$Action,
    [string]$Port
)

# export.ps1 and CMake write progress and warnings to stderr, so don't use
# $ErrorActionPreference = 'Stop' here; the exit code of idf.py decides.
. C:\esp\esp-idf-v6\export.ps1 2>$null | Out-Null
Set-Location C:\esp\muse-gadget-sdk\esp32

$build = 'build-muse-plus2'
$common = @(
    '-B', $build,
    '-DIDF_TARGET=esp32',
    "-DSDKCONFIG=$build/sdkconfig",
    '-DSDKCONFIG_DEFAULTS=sdkconfig.defaults;devices/sdkconfig.muse;devices/sdkconfig.muse-m5stack-stickc-plus2'
)

switch ($Action) {
    'build' { idf.py @common build }
    'flash' {
        if (-not $Port) { throw 'Port is required, e.g. COM5' }
        # The CH9102 bridge drops out above 230400 baud.
        idf.py @common -p $Port -b 230400 flash
    }
    'monitor' {
        if (-not $Port) { throw 'Port is required, e.g. COM5' }
        idf.py @common -p $Port monitor
    }
}
exit $LASTEXITCODE

StickC Plus2 を USB でつなぎ、デバイスマネージャーの「ポート (COM と LPT)」で USB-Enhanced-SERIAL CH9102 (COMx) の番号を確認します。私の環境では COM5 でした。

C:\esp\muse_plus2.ps1 build
C:\esp\muse_plus2.ps1 flash COM5

初回のビルドは十数分かかりました。書き込みの速度は 230400 baud にしています。これより速いと USB の接続が切れる、と SDK の説明に書かれているためです。

一度ビルドしたあとで §4-3 の設定ファイルを書き換えても、変更は反映されません。 設定ファイルの値が使われるのは、まだ決まっていない項目だけだからです。ビルドフォルダ build-muse-plus2 を消してからビルドし直すか、build-muse-plus2/sdkconfig の中の # CONFIG_MUSE_HATCH_COMPACT_BUFFERS is not set の行を CONFIG_MUSE_HATCH_COMPACT_BUFFERS=y に書き換えてください。

4-5. SDK トークンを入れる

書き込みが終わったら、§4-1 で発行した SDK トークンをマイコンに送ります。マイコンは USB のシリアル通信で >sdk_token=mgst_... という1行を受け取ると、トークンを保存して再起動します。

ログ表示(idf.py monitor)の画面から打ち込めるはずでしたが、VS Code のターミナルではキー入力がマイコンに届きませんでした。 そこで、送るだけの小さなスクリプトを書きました。トークンは画面に表示されない形で入力するので、画面にもコマンド履歴にも残りません。

set_token.py
# Send the Muse SDK token to the gadget over serial, without idf monitor.
#   python set_token.py COM5
import getpass
import sys
import time

import serial

port = sys.argv[1] if len(sys.argv) > 1 else "COM5"
token = getpass.getpass("SDK token (mgst_...): ").strip()
if not token.startswith("mgst_"):
    sys.exit("The token should start with mgst_")

s = serial.Serial()
s.port = port
s.baudrate = 115200
s.timeout = 0.2
# Keep DTR/RTS low so opening the port doesn't reset the board.
s.dtr = False
s.rts = False
s.open()
time.sleep(0.5)
s.reset_input_buffer()
s.write(f">sdk_token={token}\n".encode())

buf = ""
deadline = time.time() + 10
while time.time() < deadline:
    buf += s.read(512).decode("utf-8", "replace")
    for line in buf.splitlines():
        if line.startswith("@sdk_token"):
            print(line)
            s.close()
            sys.exit(0 if " ok" in line else 1)
s.close()
sys.exit("No answer from the board. Is idf monitor still open on this port?")
# シリアル通信用のライブラリ(pyserial)が入っている、ESP-IDF の Python で実行する
C:\Users\<ユーザー名>\.espressif\python_env\idf6.0_py3.10_env\Scripts\python.exe set_token.py COM5

@sdk_token ok と表示されれば成功です。ログ表示の画面を開いたままだと送れないので、先に閉じてください。

4-6. スマホとペアリングする

  1. Muse アプリで Settings > Devices > Add Device を開く
  2. 一覧から MuseGadget-XXXXXX を選び、家の Wi-Fi を設定する
  3. StickC Plus2 の画面に確認が出たら、正面のボタンを押す

画面に READY と出たら完成です。正面のボタンを押しながら話しかけてみてください。

一度ペアリングすれば、プログラムを書き込み直してもトークン・ペアリング・Wi-Fi の設定は残ります。実際に、設定を変えて書き込み直したあとも、ペアリングし直さずにそのまま使えました。


5. つまずいた点(Windows 環境)

install.ps1 が pip の設定で止まる

以前入れた NVIDIA 関連のツールの影響で、pip(Python のパッケージ管理ツール)の設定に、今はつながらない取得先 https://pypi.ngc.nvidia.com が残っていました。そのせいで、パッケージを1つ取るたびに再試行で待たされていました。

pip の設定ファイルは変えずに、インストールするときだけ環境変数で上書きしました。

$env:PIP_EXTRA_INDEX_URL = 'https://pypi.org/simple'
$env:PIP_TRUSTED_HOST = 'pypi.org'
C:\esp\esp-idf-v6\install.ps1 esp32

先に試した PIP_CONFIG_FILE=NUL では回避できませんでした。設定ファイルが読まれ続けて、同じ再試行が出続けました。なぜ効かないのかまでは調べていません。

PowerShell 5.1 で $ErrorActionPreference = 'Stop' を使うと、警告で止まる

ESP-IDF の準備スクリプトや CMake は、進み具合や警告を stderr(エラー出力)に書き出します。Windows に標準で入っている PowerShell 5.1 は、外部コマンドが stderr に書いた行をエラーとして扱うので、Stop にしているとそこで止まります。成功したかどうかは終了コード($LASTEXITCODE)で判断するようにしました。

初回のビルドで WinError 32(lvgl)

画面表示用のライブラリ lvgl を展開しているときに、「別のプロセスがファイルを使用中」というエラーで止まりました。ビルドの処理は残っていなかったので、展開した直後のファイルをウイルス対策ソフトが検査していたのではないかと思っていますが、確認はしていません。managed_components/lvgl__lvgl と build-muse-plus2 の2つのフォルダを消してビルドし直したら通りました。

原因を突き止めるには、ログを取る

PSRAM 不足に気づけたのは、ログの psram=2K を見たからです。idf.py monitor はポートを開いた瞬間にマイコンを再起動させてしまうので、再起動させずにそのままの状態を記録するスクリプトも書きました。

capture_log.py
# Record the gadget's serial log for a while without resetting it.
#   python capture_log.py COM5 60 out.log
import sys
import time

import serial

port, secs, out = sys.argv[1], float(sys.argv[2]), sys.argv[3]
s = serial.Serial()
s.port, s.baudrate, s.timeout = port, 115200, 0.2
s.dtr = s.rts = False  # opening the port must not reset the board
s.open()
end = time.time() + secs
with open(out, "wb") as f:
    while time.time() < end:
        f.write(s.read(4096))
        f.flush()  # keep what was read if the capture is stopped early
s.close()

5秒ごとに出る link.heartbeat の行を見ると、接続の状態と空きメモリがわかります。

hb t=9s setup=done wifi=up ws=up raw=up ble=off int=44K/16K min=18K dma=28K/12K psram=453K ...
表示 意味
setup=advertising スマホからのペアリング待ち
setup=done wifi=up ws=up ペアリング済みで、Muse につながっている
psram= 作業用メモリの空き。数KBまで減っていたらメモリ不足を疑う

6. まだわかっていないこと

  • 設定を直している途中で一度だけ、話しかけたあとに画面が固まりました。そのときのログは取れておらず、原因はわかっていません。日本語フォントを入れてからは、今のところ起きていません

まとめ

  • Meta の Muse は、10月23日から日本でも使えるようになりました。Muse Gadgets を使うと、自作の機器から話しかけられます
  • M5StickC Plus2 にはマイク・ボタン・画面・Wi-Fi がそろっているので、部品を買い足さずにポケットサイズの Muse 端末になります
  • ただし、Plus2 用の設定に CONFIG_MUSE_HATCH_COMPACT_BUFFERS=y(メモリ不足の対策)と CONFIG_MUSE_CJK_FONT=y(日本語表示)の2行を足す必要があります
  • LOST CONNECTION や CAN'T REACH MUSE と表示されたら、まずログの psram= を確認してください
1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?