
Muse Gadget SDKをM5Stack Core2 for AWSで試す
はじめに
2026年10月23日、MetaのパーソナルAIエージェント「Muse」が日本で提供開始されました。
さっそく試してみたところ、手持ちのデバイスをMuseにつなげられる「Muse Gadget SDK」も公開されていました。今回は、しばらく使っていなかったM5Stack Core2 for AWSにファームウェアを書き込み、音声で話しかけられるようにしてみます。
実際に「今日の予定は?」と話しかけている様子です。
今回はSDKに含まれるESP32向けのファームウェアを使います。Core2向けには画面表示やタッチ操作、ボタンを押している間の音声入力が用意されていて、書き込んだ後にスマートフォンのMuseアプリとペアリングします。
今回の構成
ペアリング時は、iPhoneのMuseアプリからBluetooth(BLE)でCore2へ接続し、Wi-Fiやアカウントの設定を渡します。設定後の音声入力は、Core2自身が自宅のWi-Fiからインターネット経由でMuseへ送信します。

返答はCore2の画面とMuseアプリの会話履歴で確認できます。スマホにプッシュ通知が届くことも確認できました。
久しぶりに起動した本体の状態
USBで接続すると、画面には次のエラーが繰り返し表示されました。
Wi-Fi error. Attempting reconnect...

以前使っていたときから自宅のWi-Fi環境は変わっており、ソースコードも残っていません。今回は本体のプログラムをMuse用に入れ替えるため、既存プログラムのWi-Fi設定を直す作業は行いません。
Core2の対応条件を確認する
2026年10月23日に確認したSDKの対応条件は次のとおりです。
| 項目 | SDKのCore2用設定 |
|---|---|
| SDKのリビジョン | e6fe517 |
| 対応機種 | M5Stack Core2 v1.0 |
| 電源管理IC | AXP192 |
| マイコン | ESP32-D0WDQ6-V3 |
| フラッシュ / PSRAM | 16MB / 8MB |
| 対象外 | AXP2101を使うCore2 v1.1 |
SDKのCore2対応説明とボード設定を参照しています。
M5StackのCore2 for AWSの仕様にはAXP192、16MBフラッシュ、8MB PSRAMが記載されており、この構成はSDKのCore2用設定と一致します。SDKの対応表での名前は「Core2 v1.0」です。今回、手元のAWSモデルではMuseの起動、キャラクター表示、Wi-Fi接続後のREADY表示に加え、音声で質問してMuseアプリで返答を確認するところまで進められました。
セットアップの全体像
まずMacでMuseのファームウェアをビルドして、USB経由でCore2へ書き込みます。その後、スマホのMuseアプリでペアリングし、接続先のWi-Fiを設定します。

MuseアプリとSDKトークンを用意する
ペアリングには、スマートフォンのMuseアプリとSDKトークンが必要です。まずWebの管理画面でトークンを準備します。
SDKトークンの管理画面を開く
SDKトークンの管理画面を開きます。ログイン前は「Your tokens」に、トークンの確認や発行にはログインが必要という案内が表示されます。

Museにログインする
画面右上の「Log in」をクリックします。「Your tokens」の下にある「Log in」からも進めます。

「Log in or create an account」が表示されたら、電話番号またはメールアドレスを入力し、「Continue」から画面の案内に従ってログインします。画像上部の「Sign in」は、この環境のパスワードマネージャーによる表示です。

利用規約を確認してトークンを発行する
ログインすると、右上の表示が「Account」に変わり、「Your tokens」に利用規約への同意欄と「Generate token」ボタンが表示されました。この時点ではトークンは未発行です。

「Muse Gadget SDK Token Terms of Use」のリンク先を確認し、同意する場合はチェックを入れます。「Generate token」ボタンが有効になるので、クリックします。

トークンが発行され、「Copy your new token」が表示されました。「Copy」でコピーし、後のSDK設定で使えるようにパスワードマネージャーなどへ保存してから「Done」を押します。

画面の案内では、トークンの全文が表示されるのはこの一度だけです。紛失した場合は「Revoke」で失効させ、新しく発行します。記事やスクリーンショットにはトークンの値を載せません。
Museアプリの開発者モードを有効にする
Museアプリでは、コミュニティデバイスとのペアリングを許可する「開発者モード」を有効にします。公式のセットアップ説明での表記はSettings → Devices → Developer modeですが、今回のiPhoneアプリでは「設定 → デバイス → 開発者モード」でした。
まずMuseアプリのサイドメニューを開き、左下の歯車アイコンをタップします。

「設定」画面で「デバイス」を開きます。

「デバイス」画面の下部に「開発者モード」があります。初めはオフになっていたので、スイッチをタップします。

スイッチが青色になり、オンになったことを確認できました。これで開発者モードの設定は完了です。本体とのペアリングは、Museファームウェアを書き込んでから行います。

ESP-IDFの開発環境を用意する
Core2用ファームウェアはSDKからビルドします。
SDKが指定するESP-IDFのバージョンはv6.0.1です。公式の環境構築手順を、macOSのターミナル(zsh)で順に実行できる形にまとめます。Homebrewが導入済みの環境を前提にしています。
各コードブロックを上から順に実行し、エラーが出た場合は、その箇所を解消してから次へ進みます。確認できた結果は各手順の下に記録しています。
前提ツールをインストールする
まずCommand Line ToolsとHomebrewを確認します。
xcode-select -p
brew --version
今回の環境では、次の出力を確認できました。Command Line ToolsとHomebrewは導入済みでした。
/Library/Developer/CommandLineTools
Homebrew 7.0.10
xcode-select -pでパスが表示されれば、Command Line Toolsは導入済みです。未導入というエラーが出る場合だけ、次を実行し、表示される案内からインストールを完了させます。
xcode-select --install
xcode-select: note: Command line tools are already installed. Use "Software Update" in System Settings or the softwareupdate command line interface to install updates
続いて、公式手順の前提ツールをHomebrewでインストールします。
brew install cmake ninja dfu-util python3
export PATH="$(brew --prefix)/bin:$PATH"
rehash
python3 --version
cmake --version
ninja --version
インストール後のバージョン確認の実行結果です。
Python 3.15.0
cmake version 4.4.4
CMake suite maintained and supported by Kitware (kitware.com/cmake).
1.13.2
ESP-IDF v6.0.1はPython 3.10以上を要求します。macOS付属の古いPythonを拾わないよう、上のexport PATHでHomebrewのコマンドを優先しています。
今回のHomebrewでのインストールは完了し、次のバージョンが入りました。
| ツール | インストールされたバージョン |
|---|---|
| CMake | 4.4.4 |
| Ninja | 1.13.2 |
| dfu-util | 0.11 |
| Python | 3.15.0(Homebrewのパッケージ表記は3.15.0_1) |
ESP-IDF v6.0.1を取得してインストールする
ESP-IDFの保存先は、公式例と同じ~/esp/esp-idf-v6にします。転送量を減らすため、--depth 1と--shallow-submodulesで本体・サブモジュールの履歴を浅く取得します。次の取得コマンドは初回のみ実行します。
mkdir -p "$HOME/esp"
git clone --branch v6.0.1 --depth 1 --recursive --shallow-submodules \
https://github.com/espressif/esp-idf.git \
"$HOME/esp/esp-idf-v6"
取得中の出力の抜粋です。
Cloning into '/Users/shuntaka/esp/esp-idf-v6'...
remote: Enumerating objects: 21692, done.
remote: Counting objects: 100% (21692/21692), done.
remote: Compressing objects: 100% (15274/15274), done.
Receiving objects: 26% (5640/21692), 2.55 MiB | 305.00 KiB/s
取得には約10分25秒かかりました。
Core2のマイコンに合わせて、esp32用のツールチェーンをインストールします。公式例では複数のマイコンを指定していますが、今回はCore2だけを使うためesp32に絞ります。
"$HOME/esp/esp-idf-v6/install.sh" esp32
この処理でコンパイラやESP-IDF用のPython環境、必要なパッケージがダウンロードされます。
完了時の出力の抜粋です。
All done! You can now run:
. /Users/shuntaka/esp/esp-idf-v6/export.sh
インストールは約14分11秒で完了しました。
今のターミナルでESP-IDFを有効にする
. "$HOME/esp/esp-idf-v6/export.sh"
Checking "python3" ...
Python 3.15.0
"python3" has been detected
Activating ESP-IDF 6.0
Setting IDF_PATH to '/Users/shuntaka/esp/esp-idf-v6'.
- Checking python version ... 3.15.0
- Checking python dependencies ... OK
- Deactivating the current ESP-IDF environment (if any) ... OK
- Establishing a new ESP-IDF environment ... OK
- Identifying shell ... zsh
- Detecting outdated tools in system ... OK - no outdated tools found
- Shell completion ... Autocompletion code generated
Done! You can now compile ESP-IDF projects.
Go to the project directory and run:
idf.py build
上の有効化ログにはActivating ESP-IDF 6.0と表示されています。パッチ番号を含むバージョンは、次のコマンドで別途確認します。
idf.py --version
ESP-IDF v6.0.1
ESP-IDF v6.0.1を確認できました。これで開発環境の準備は完了です。
新しいターミナルを開いたときも、ビルド前に次を実行します。インストール自体をやり直す必要はありません。
export PATH="$(brew --prefix)/bin:$PATH"
. "$HOME/esp/esp-idf-v6/export.sh"
Core2用のMuseファームウェアをビルドする
Muse Gadget SDKを取得する
ここではSDKを~/repos/github.com/facebookincubator/muse-gadget-sdkに置きます。全履歴のダウンロードを避けるため、この記事で確認したコミットを--depth 1で取得します。次の初期化と取得は初回のみ実行します。
mkdir -p "$HOME/repos/github.com/facebookincubator"
git init "$HOME/repos/github.com/facebookincubator/muse-gadget-sdk"
cd "$HOME/repos/github.com/facebookincubator/muse-gadget-sdk"
git remote add origin https://github.com/facebookincubator/muse-gadget-sdk.git
git fetch --depth 1 origin e6fe5174092702ffddae6f90759a38d55a4ebae1
git checkout --detach FETCH_HEAD
git submodule update --init --recursive --depth 1
cd esp32
Core2用の設定画面でSDKトークンを登録する
以降はSDKのesp32ディレクトリで作業します。Core2はesp32ターゲットで、ビルド先はbuild-muse-m5stack-core2です。
公式READMEの引数なしのidf.py buildはESP32-C5向けです。Core2ではビルドスクリプトと同じターゲット・設定ファイルを指定して、ターミナル内の設定画面を開きます。
idf.py -B build-muse-m5stack-core2 \
-DIDF_TARGET=esp32 \
-DSDKCONFIG=build-muse-m5stack-core2/sdkconfig \
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;devices/sdkconfig.muse;devices/sdkconfig.muse-m5stack-core2" \
menuconfig
初回は、設定画面が開く前に依存ライブラリの取得・解決が行われます。実行中のログの抜粋です。
NOTE: Skipping optional dependency: espressif/esp_lcd_st77916
NOTE: Skipping optional dependency: espressif/esp_lcd_touch_cst816s
NOTE: Skipping optional dependency: espressif/esp_lcd_gc9a01
NOTE: Direct dependencies have changed, solving dependencies.
..........................NOTE: Updating lock file at /Users/shuntaka/repos/github.com/facebookincubator/muse-gadget-sdk/esp32/dependencies.lock
NOTE: Processing 12 dependencies:
NOTE: [1/12] espressif/cjson (1.7.19~2)
NOTE: [2/12] espressif/cmake_utilities (0.5.3)
NOTE: [3/12] espressif/esp_codec_dev (1.5.11)
NOTE: [4/12] espressif/esp_lcd_ili9341 (2.1.0)
NOTE: [5/12] espressif/esp_lcd_touch (1.2.1)
NOTE: [6/12] espressif/esp_lcd_touch_ft5x06 (1.1.1)
NOTE: [7/12] espressif/esp_lvgl_port (2.9.0)
NOTE: [8/12] espressif/esp_websocket_client (1.2.3)
NOTE: [9/12] espressif/led_strip (3.0.3)
NOTE: [10/12] espressif/m5stack_core_2 (3.0.3)
NOTE: [11/12] lvgl/lvgl (9.5.0)
Skipping optional dependencyは、Core2の設定では使わない他のボード向けライブラリを省略したという表示です。今回は[11/12]の表示でしばらく待った後、設定画面が開きました。

↓キーでESP32 Device SDKを選び、Enterで開きます。

Muse Gadgets SDK tokenを選び、Enterを押します。

入力欄にWebで発行したSDKトークンを⌘Vで貼り付けます。次の画像は入力前の状態です。

貼り付けたらEnterで確定します。画像ではトークンの値を伏せています。

s(Save)を押し、保存先をbuild-muse-m5stack-core2/sdkconfigのまま保存します。保存後、q(Quit)で設定画面を終了します。
この項目はCONFIG_GADGET_SDK_TOKENに対応します。保存先のビルドディレクトリはSDKのGit管理対象外です。記事用のスクリーンショットではトークンの値を伏せます。
終了時には次の通知が表示されました。
NOTE: /var/folders/h7/z7w92ds95fz9f96dy6zp9fs40000gn/T/kconfgen_tmp8rwjkuwt:35: CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY was replaced with CONFIG_FREERTOS_TASK_CREATE_ALLOW_EXT_MEM
NOTE: unknown kconfig symbol 'ESP32C5_REV_MAX_FULL' assigned to '199' in /Users/shuntaka/repos/github.com/facebookincubator/muse-gadget-sdk/esp32/devices/sdkconfig.muse-m5stack-core2
NOTE: unknown kconfig symbol 'MBEDTLS_HKDF_C' assigned to 'y' in /Users/shuntaka/repos/github.com/facebookincubator/muse-gadget-sdk/esp32/devices/sdkconfig.muse-m5stack-core2
NOTE: Kconfig parser version: 1
NOTE: Kconfig defaults policy: use sdkconfig
NOTE: Status: Finished with notifications
NOTE: /Users/shuntaka/esp/esp-idf-v6/components/bt/host/nimble/Kconfig.in:614: BT_NIMBLE_EXT_ADV has user-set value n from /var/folders/h7/z7w92ds95fz9f96dy6zp9fs40000gn/T/kconfgen_tmpi4wy6wll but is not visible (disabled dependency)
NOTE: /Users/shuntaka/esp/esp-idf-v6/components/esp_driver_dma/Kconfig:3: GDMA_CTRL_FUNC_IN_IRAM has user-set value y from /var/folders/h7/z7w92ds95fz9f96dy6zp9fs40000gn/T/kconfgen_tmpi4wy6wll but is not visible (disabled dependency)
NOTE: /Users/shuntaka/esp/esp-idf-v6/components/esp_phy/Kconfig:40: ESP_PHY_DEFAULT_INIT_IF_INVALID has user-set value y from /var/folders/h7/z7w92ds95fz9f96dy6zp9fs40000gn/T/kconfgen_tmpi4wy6wll but is not visible (disabled dependency)
NOTE: /Users/shuntaka/esp/esp-idf-v6/components/esp_psram/Kconfig.spiram.common:48: SPIRAM_IGNORE_NOTFOUND has user-set value n from /var/folders/h7/z7w92ds95fz9f96dy6zp9fs40000gn/T/kconfgen_tmp8rwjkuwt but is not visible (disabled dependency)
NOTE: /Users/shuntaka/esp/esp-idf-v6/components/esp_wifi/Kconfig:117: ESP_WIFI_DYNAMIC_TX_BUFFER_NUM has user-set value 32 from /var/folders/h7/z7w92ds95fz9f96dy6zp9fs40000gn/T/kconfgen_tmpi4wy6wll but is not visible (disabled dependency)
NOTE: /Users/shuntaka/esp/esp-idf-v6/components/mbedtls/Kconfig:1303: MBEDTLS_HARDWARE_ECDSA_SIGN has user-set value y from /var/folders/h7/z7w92ds95fz9f96dy6zp9fs40000gn/T/kconfgen_tmpi4wy6wll but is not visible (disabled dependency)
Finished with notificationsは通知付きで設定処理が終了したことを示します。設定名の置き換え、現在の構成では未定義の項目、依存条件により無効になる項目の通知が含まれています。
保存されたbuild-muse-m5stack-core2/sdkconfigでは、トークンが空でないことと、ターゲットがesp32、ボードがm5stack_core2になっていることを確認しました。続いてビルドを実行します。
Core2用ファームウェアをビルドする
tools/muse/board.sh build core2
python -m esptool --chip esp32 -b 460800 --before default-reset --after hard-reset write-flash --flash-mode dio --flash-size keep --flash-freq 80m 0x1000 build-muse-m5stack-core2/bootloader/bootloader.bin 0x10000 build-muse-m5stack-core2/partition_table/partition-table.bin 0x1d000 build-muse-m5stack-core2/ota_data_initial.bin 0x20000 build-muse-m5stack-core2/muse-gadget.bin
or from the "/Users/shuntaka/repos/github.com/facebookincubator/muse-gadget-sdk/esp32/build-muse-m5stack-core2" directory
python -m esptool --chip esp32 -b 460800 --before default-reset --after hard-reset write-flash "@flash_args"
ビルドは約1分2秒で完了しました。
表示されたwrite-flashは、ビルド後の書き込み方法の案内です。本体への書き込みは、次の節で接続ポートを環境変数CORE2_PORTに設定してから、tools/muse/board.sh flash core2 "$CORE2_PORT"で行います。
ビルドスクリプトの詳細ログは/tmp/muse_build_core2.logに出力されます。進み具合を見たい場合は、別のターミナルで次を実行します。ログ表示の終了はCtrl+Cです。
tail -f /tmp/muse_build_core2.log
muse-gadget.bin binary size 0x201000 bytes. Smallest app partition is 0x400000 bytes. 0x1ff000 bytes (50%) free.
Project build complete. To flash, run:
idf.py flash
or
idf.py -p PORT flash
or
python -m esptool --chip esp32 -b 460800 --before default-reset --after hard-reset write-flash --flash-mode dio --flash-size keep --flash-freq 80m 0x1000 build-muse-m5stack-core2/bootloader/bootloader.bin 0x10000 build-muse-m5stack-core2/partition_table/partition-table.bin 0x1d000 build-muse-m5stack-core2/ota_data_initial.bin 0x20000 build-muse-m5stack-core2/muse-gadget.bin
or from the "/Users/shuntaka/repos/github.com/facebookincubator/muse-gadget-sdk/esp32/build-muse-m5stack-core2" directory
python -m esptool --chip esp32 -b 460800 --before default-reset --after hard-reset write-flash "@flash_args"
Project build complete.でビルド成功を確認できました。アプリ領域には約50%の空きがあります。tail -fはビルド完了後も待機し続けるので、Ctrl+Cでログ表示を終了します。
ビルドの終了後、元のターミナルで成果物を確認します。
ls -lh build-muse-m5stack-core2/muse-gadget.bin
Permissions Size User Date Modified Name
.rw-r--r-- 2.1M shuntaka 23 Oct 22:16 build-muse-m5stack-core2/muse-gadget.bin
muse-gadget.binが約2.1MBで生成されていることを確認できました。
本体をバックアップして書き込む
SDKのCore2向けドキュメントでは、初回書き込み前に16MBのフラッシュをバックアップする手順が案内されています。元の状態へ戻せるよう、保存してから進めます。
ESP-IDFを有効化したターミナルで、SDKのesp32ディレクトリから接続ポートを確認します。
cd "$HOME/repos/github.com/facebookincubator/muse-gadget-sdk/esp32"
python tools/muse/ports.py --list
/dev/cu.usbserial-023F1E0D CP2104 bridge 023F1E0D (core2)
今回の接続ポートは/dev/cu.usbserial-023F1E0Dで、CP2104のUSB変換チップとして認識されました。以降のコマンドではこのポートを使います。実際の値は接続環境に合わせて置き換えます。
Core2向けの接続先候補だけを表示する場合は、次のコマンドを使います。
python tools/muse/ports.py core2
/dev/cu.usbserial-023F1E0D
どちらの確認処理もシリアルポートを開かないため、本体をリセットしません。
確認した接続ポートを環境変数CORE2_PORTに設定します。以降のバックアップと書き込みは、同じターミナルでこの変数を使います。
export CORE2_PORT="/dev/cu.usbserial-023F1E0D"
ports.pyはUSB変換チップの識別情報を使って、Core2で使われるCP2104またはCH9102の候補を探します。この判定だけでは本体のv1.0/v1.1は区別できません。
現在のファームウェアをバックアップする
フラッシュ全体の16MB(0x1000000バイト)を読み出し、リポジトリ外の~/backups/m5stack-core2に保存します。ファイル名には実行日時を付けます。
mkdir -p "$HOME/backups/m5stack-core2"
core2_backup="$HOME/backups/m5stack-core2/core2-before-muse-$(date +%Y%m%d-%H%M%S).bin"
python -m esptool --chip esp32 \
-p "$CORE2_PORT" -b 230400 \
read-flash 0 0x1000000 "$core2_backup"
実行結果です。MACアドレスは省略しています。
esptool v5.6.0
Connected to ESP32 on /dev/cu.usbserial-023F1E0D:
Chip type: ESP32-D0WDQ6-V3 (revision v3.0)
Features: Wi-Fi, BT, Dual Core + LP Core, 240MHz, Vref calibration in eFuse, Coding Scheme None
Crystal frequency: 40MHz
MAC: (省略)
Stub flasher running.
Changing baud rate to 230400...
Changed.
Configuring flash size...
Read 16777216 bytes from 0x00000000 in 774.5 seconds (173.3 kbit/s) to '/Users/shuntaka/backups/m5stack-core2/core2-before-muse-20261023-221948.bin'.
Hard resetting via RTS pin...
バックアップは約13分で完了しました。保存先は~/backups/m5stack-core2/core2-before-muse-20261023-221948.binで、ファイルサイズも16MB(16,777,216バイト)であることを確認できました。
ログのrevision v3.0はESP32チップのリビジョンで、Core2本体のv1.0/v1.1とは別です。
読み出しが正常終了したら、同じターミナルで保存したファイルを確認します。
ls -lh "$core2_backup"
Permissions Size User Date Modified Name
.rw-r--r-- 17M shuntaka 23 Oct 22:32 /Users/shuntaka/backups/m5stack-core2/core2-before-muse-20261023-221948.bin
この環境では10進数の単位で丸められて17Mと表示されますが、実際のサイズは16,777,216バイト(16MiB)です。
Museのファームウェアを書き込む
対応機種と接続ポートを確認し、バックアップとビルドが完了したら、環境変数CORE2_PORTに設定したポートへ書き込みます。
tools/muse/board.sh flash core2 "$CORE2_PORT"
この処理ではブートローダー、パーティション表、OTA初期データ、Museアプリを書き込み、本体で動くファームウェアをMuseへ置き換えます。16MB全体を消去する処理ではなく、指定された領域を書き換えます。
スクリプトは書き込みログの最後の3行だけを表示するため、処理中はターミナルに進捗が表示されません。書き込みと検証の後、本体をリセットします。画面の点灯だけでは完了を判断できないので、終了ログと再起動後の表示を確認します。
board.shが、ポートの選択とesptoolによる書き込みをまとめています。core2を指定すると、ESP32向け・230400 baud・Core2用ビルドの設定が選ばれます。ポートの指定を省略した場合はports.pyで候補を探し、1台なら自動選択します。候補が複数ある場合はエラーになり、ポートまたはUSBシリアル番号の指定が必要です。
実機でMuseの起動を確認する
書き込み後、本体の画面がMuseのキャラクター表示に変わりました。上部にはSET UP WI-FIとMuseGadget-65FE14が表示され、Wi-Fiの設定を待っています。

キャラクターが動いている様子です。

Museアプリでペアリングする
ペアリングからWi-Fi接続までの流れです。本体の中央ボタンで承認してから、アプリの「次へ」に進みます。

Wi-FiはMuseファームウェアを書き込んだ後、スマートフォンのMuseアプリから設定します。バックアップと書き込みはUSB経由なので、この段階で本体をWi-Fiへ接続する必要はありません。
Museアプリの「設定 → デバイス」を開き、開発者モードがオンになっていることを確認して、右上の「+」をタップします。公式のセットアップ説明ではSettings → Devices → Add Deviceと表記されています。

「デバイスを接続」画面に、本体と同じ名前のMuseGadget-65FE14が表示されました。右側の「接続」をタップします。

続いてiPhoneに「MuseGadget-65FE14に接続しますか?」という確認画面が表示されます。この画面が出たタイミングで、M5Stack側にも確認用のポップアップが表示されます。

M5Stack側のポップアップにはMuse app / Press middle buttonと表示されます。iPhoneの「次へ」を押す前に、本体画面下の中央にある丸いタッチボタン(BtnB)を押して承認します。 写真の赤枠で示した場所です。

本体で承認してから、iPhoneの「次へ」をタップします。
続いて、コミュニティデバイスがMuseのすべての機能へアクセスできるようになるという確認画面が表示されました。メッセージの読み取りや送信、ファイルの変更など、許可される操作を確認します。今回書き込んだデバイスとファームウェアを信頼できることを確認し、「このまま続行」をタップします。

「Muse Gadgetを設定」画面にWi-Fiネットワークの一覧が表示されます。本体を接続したいネットワークを選びます。

Core2のWi-Fiは2.4GHz帯に対応しています。接続先には2.4GHzで利用できるネットワークを選びます。
選択したネットワークのパスワードを①の欄に入力し、②の「接続」をタップします。SSIDとパスワードはBluetooth(BLE)経由で本体へ設定されます。

接続後、本体上部の表示がSET UP WI-FIからREADYに変わり、Wi-Fiアイコンも表示されました。ここまでで、MuseアプリからのペアリングとWi-Fi設定を進め、本体が待機画面になるところまで確認できました。

menuconfigのWiFi SSID overrideとWiFi password overrideは開発用の上書き設定なので、今回は空欄のまま進めます。以前のプログラムの設定の引き継ぎを前提にせず、Muse用に現在のWi-Fiを設定します。一度Museで設定すると本体に保存され、次回起動時は自動で再接続する実装です。
ペアリング後の音声入力にも、同じ中央のタッチボタン(BtnB)を使います。押している間に音声を入力する操作です。Core2固有の操作説明を参照してください。
今回使ったSDKでは、音声で質問し、返答は本体の画面に文字で表示されます。M5Stack本体からMuseの効果音は聞こえましたが、返答の読み上げはありませんでした。本体で読み上げるには、SDKのstart_ttsにTTS(音声合成)APIとの連携を追加する必要があります。
「今日の予定は?」と音声で聞いてみる
本体下の中央のタッチボタン(BtnB)を押しながら、「今日の予定は?」と話しかけました。実際に操作している様子が次の動画です。
本体の画面も、音声入力から返答の表示まで順に切り替わりました。写真を撮影順に並べると、次の流れになります。
| 順番 | 画像 | 説明 |
|---|---|---|
| 1 | ![]() |
入力前の案内。 READYの下にHOLD LONGER TO TALKと表示されています。中央のタッチボタン(BtnB)を長押しして話しかけます。 |
| 2 | ![]() |
音声入力中。 ボタンを押している間はLISTENINGになります。写真ではLISTENING 2.5sと表示されています。 |
| 3 | ![]() |
送信して返答を待つ。 ボタンを離すとTHINKINGに変わり、NOTE SENT - WAITING FOR MUSEと表示されました。 |
| 4 | ![]() |
返答の表示開始。 状態がSPEAKINGに変わり、キャラクターの下に文字が表示されます。ただ、日本語は豆腐になっていますね。 |
| 5 | ![]() |
返答を表示中。 文字列は切り替わっていきますが、豆腐になっていて内容は読めません。 |
| 6 | ![]() |
続きの表示。 引き続きSPEAKINGで返答が表示されます。ここも豆腐のままです。 |
| 7 | ![]() |
待機に戻る。 返答の表示が終わると文字列が消え、READYに戻りました。 |
本体にも文字で返答が出ましたが、日本語が豆腐になっていて読めませんでした。返答の表示に使うフォントに、日本語の文字が含まれていないためです。SDKには日本語を表示するためのCONFIG_MUSE_CJK_FONTという設定がありますが、初期値は無効で、Core2用の設定でも有効になっていません。
Museアプリの会話履歴には、音声入力と予定についての返答が表示されました。撮影した時点では今日の予定はすでに終わっており、残りの予定はないという内容でした。

返答が「音声でもお答えしますね。内容はさっきと同じ」となっているのは、撮影前のテストでもすでに質問していたためです。動画では「今日の予定は?」と聞いており、返答にはそれまでの会話の文脈が反映されています。
スマホのMuseアプリには、返答のテキストと音声メッセージが表示されました。M5Stack本体では、画面にSPEAKINGと出ている間も返答の読み上げはありませんでした。本体から聞こえたのはMuseの効果音です。
さいごに
時代はパーソナルAIエージェント戦国時代になりました! Grok Bot、Dots、Claude Duet、そしてMuseと、各社のエージェントが次々に登場しています。
このあたりは、モデルとプロダクトを一緒に作り込んでいく過程も面白いですね。Alexandr Wangによると、Museの開発では、理想のパーソナルエージェントに必要な振る舞いや能力を100項目以上に整理し、それぞれの評価を作ったそうです。その評価で苦手な部分を見つけ、訓練とレビューを繰り返して改善していく。各項目には公開を止める水準と合格水準も設けていたといいます。
使いたい場面を評価に落とし込んで、モデルの訓練までつなげていく。こういう積み重ねが、毎日使ったときの差になってくるのだと思います。
ひとまず、手元で眠っていたM5StackからMuseに話しかけられるようになりました。次はSDKの中を覗いて、画面表示や操作を自分好みにカスタマイズしてみたいですね。


















