Muse Gadget SDKをM5Stack Core2 for AWSで試す

Muse Gadget SDKをM5Stack Core2 for AWSで試す

2026年10月、Metaがパーソナルエージェント「Muse」を日本でも利用可能にしました。公開されたSDKを使って、昔のM5Stack本体をMuseに接続し、音声で質問できるようにしてみます。
2026.10.24

はじめに

2026年10月23日、MetaのパーソナルAIエージェント「Muse」が日本で提供開始されました。

さっそく試してみたところ、手持ちのデバイスをMuseにつなげられる「Muse Gadget SDK」も公開されていました。今回は、しばらく使っていなかったM5Stack Core2 for AWSにファームウェアを書き込み、音声で話しかけられるようにしてみます。

実際に「今日の予定は?」と話しかけている様子です。

https://youtu.be/z7D9kiFl4F0

今回はSDKに含まれるESP32向けのファームウェアを使います。Core2向けには画面表示やタッチ操作、ボタンを押している間の音声入力が用意されていて、書き込んだ後にスマートフォンのMuseアプリとペアリングします。

今回の構成

ペアリング時は、iPhoneのMuseアプリからBluetooth(BLE)でCore2へ接続し、Wi-Fiやアカウントの設定を渡します。設定後の音声入力は、Core2自身が自宅のWi-Fiからインターネット経由でMuseへ送信します。

Core2からWi-Fi経由でMuseへ音声を送り、本体とスマホで返答を受け取る構成

返答はCore2の画面とMuseアプリの会話履歴で確認できます。スマホにプッシュ通知が届くことも確認できました。

久しぶりに起動した本体の状態

USBで接続すると、画面には次のエラーが繰り返し表示されました。

Wi-Fi error. Attempting reconnect...

以前のプログラムがWi-Fiへの再接続を繰り返しているM5Stack本体

以前使っていたときから自宅の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を設定します。

USBでファームを書き込み、スマホからBLEでWi-Fiを設定してMuseへ接続する流れ

MuseアプリとSDKトークンを用意する

ペアリングには、スマートフォンのMuseアプリとSDKトークンが必要です。まずWebの管理画面でトークンを準備します。

SDKトークンの管理画面を開く

SDKトークンの管理画面を開きます。ログイン前は「Your tokens」に、トークンの確認や発行にはログインが必要という案内が表示されます。

ログイン前のSDKトークン管理画面

Museにログインする

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

SDKトークン管理画面の右上にあるLog inボタン

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

電話番号またはメールアドレスでログインするMuseの画面

利用規約を確認してトークンを発行する

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

ログイン後の利用規約への同意欄とGenerate tokenボタン

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

利用規約への同意にチェックを入れてGenerate tokenボタンが有効になった画面

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

発行されたSDKトークンの値を伏せた画面とCopyボタン

画面の案内では、トークンの全文が表示されるのはこの一度だけです。紛失した場合は「Revoke」で失効させ、新しく発行します。記事やスクリーンショットにはトークンの値を載せません。

Museアプリの開発者モードを有効にする

Museアプリでは、コミュニティデバイスとのペアリングを許可する「開発者モード」を有効にします。公式のセットアップ説明での表記はSettings → Devices → Developer modeですが、今回のiPhoneアプリでは「設定 → デバイス → 開発者モード」でした。

まずMuseアプリのサイドメニューを開き、左下の歯車アイコンをタップします。

Museのサイドメニュー左下にある設定の歯車アイコン

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

Museの設定画面にあるデバイス項目

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

Museのデバイス画面で開発者モードがオフになっている状態

スイッチが青色になり、オンになったことを確認できました。これで開発者モードの設定は完了です。本体とのペアリングは、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]の表示でしばらく待った後、設定画面が開きました。

menuconfigのトップ画面

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

ESP32 Device SDKを選択した画面

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

Muse Gadgets SDK tokenの設定項目

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

SDKトークンの入力欄(入力前)

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

SDKトークンを入力した画面(値はマスク済み)

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設定待ちになったCore2

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

Core2上で動くMuseのキャラクター

Museアプリでペアリングする

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

MuseアプリとCore2のBLEペアリングからWi-Fi接続までの流れ

Wi-FiはMuseファームウェアを書き込んだ後、スマートフォンのMuseアプリから設定します。バックアップと書き込みはUSB経由なので、この段階で本体をWi-Fiへ接続する必要はありません。

Museアプリの「設定 → デバイス」を開き、開発者モードがオンになっていることを確認して、右上の「+」をタップします。公式のセットアップ説明ではSettings → Devices → Add Deviceと表記されています。

Museのデバイス画面から右上の+で追加する

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

MuseGadget-65FE14が見つかり、接続ボタンが表示された画面

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

デバイスのボタンで確認するよう案内するMuseアプリの画面

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

接続確認のポップアップと、押す必要があるCore2中央のタッチボタン

本体で承認してから、iPhoneの「次へ」をタップします。

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

コミュニティデバイスへのアクセス許可を確認して、このまま続行を選ぶ画面

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

接続先のWi-Fiネットワークを選ぶ画面。SSIDは伏せている

Core2のWi-Fiは2.4GHz帯に対応しています。接続先には2.4GHzで利用できるネットワークを選びます。

選択したネットワークのパスワードを①の欄に入力し、②の「接続」をタップします。SSIDとパスワードはBluetooth(BLE)経由で本体へ設定されます。

Wi-Fiのパスワードを入力し、接続をタップする画面

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

Wi-Fi接続後、画面上部にWi-FiアイコンとREADYが表示されたCore2

menuconfigのWiFi SSID overrideとWiFi password overrideは開発用の上書き設定なので、今回は空欄のまま進めます。以前のプログラムの設定の引き継ぎを前提にせず、Muse用に現在のWi-Fiを設定します。一度Museで設定すると本体に保存され、次回起動時は自動で再接続する実装です。

ペアリング後の音声入力にも、同じ中央のタッチボタン(BtnB)を使います。押している間に音声を入力する操作です。Core2固有の操作説明を参照してください。

今回使ったSDKでは、音声で質問し、返答は本体の画面に文字で表示されます。M5Stack本体からMuseの効果音は聞こえましたが、返答の読み上げはありませんでした。本体で読み上げるには、SDKのstart_ttsにTTS(音声合成)APIとの連携を追加する必要があります。

「今日の予定は?」と音声で聞いてみる

本体下の中央のタッチボタン(BtnB)を押しながら、「今日の予定は?」と話しかけました。実際に操作している様子が次の動画です。

https://youtu.be/z7D9kiFl4F0

本体の画面も、音声入力から返答の表示まで順に切り替わりました。写真を撮影順に並べると、次の流れになります。

順番 画像 説明
1 READY状態でHOLD LONGER TO TALKと表示されるCore2 入力前の案内。 READYの下にHOLD LONGER TO TALKと表示されています。中央のタッチボタン(BtnB)を長押しして話しかけます。
2 中央のタッチボタンを押しながら録音し、LISTENINGと表示されるCore2 音声入力中。 ボタンを押している間はLISTENINGになります。写真ではLISTENING 2.5sと表示されています。
3 THINKINGとNOTE SENT - WAITING FOR MUSEが表示されるCore2 送信して返答を待つ。 ボタンを離すとTHINKINGに変わり、NOTE SENT - WAITING FOR MUSEと表示されました。
4 SPEAKINGに切り替わり、返答の一部が表示されるCore2 返答の表示開始。 状態がSPEAKINGに変わり、キャラクターの下に文字が表示されます。ただ、日本語は豆腐になっていますね。
5 日本語の返答が豆腐になっているCore2 返答を表示中。 文字列は切り替わっていきますが、豆腐になっていて内容は読めません。
6 SPEAKING状態で別の返答部分を表示するCore2 続きの表示。 引き続きSPEAKINGで返答が表示されます。ここも豆腐のままです。
7 返答の表示を終えてREADYに戻ったCore2 待機に戻る。 返答の表示が終わると文字列が消え、READYに戻りました。

本体にも文字で返答が出ましたが、日本語が豆腐になっていて読めませんでした。返答の表示に使うフォントに、日本語の文字が含まれていないためです。SDKには日本語を表示するためのCONFIG_MUSE_CJK_FONTという設定がありますが、初期値は無効で、Core2用の設定でも有効になっていません。

Museアプリの会話履歴には、音声入力と予定についての返答が表示されました。撮影した時点では今日の予定はすでに終わっており、残りの予定はないという内容でした。

今日の予定を音声で質問し、Museアプリに返答テキストと音声メッセージが表示された画面

返答が「音声でもお答えしますね。内容はさっきと同じ」となっているのは、撮影前のテストでもすでに質問していたためです。動画では「今日の予定は?」と聞いており、返答にはそれまでの会話の文脈が反映されています。

スマホのMuseアプリには、返答のテキストと音声メッセージが表示されました。M5Stack本体では、画面にSPEAKINGと出ている間も返答の読み上げはありませんでした。本体から聞こえたのはMuseの効果音です。

さいごに

時代はパーソナルAIエージェント戦国時代になりました! Grok Bot、Dots、Claude Duet、そしてMuseと、各社のエージェントが次々に登場しています。

このあたりは、モデルとプロダクトを一緒に作り込んでいく過程も面白いですね。Alexandr Wangによると、Museの開発では、理想のパーソナルエージェントに必要な振る舞いや能力を100項目以上に整理し、それぞれの評価を作ったそうです。その評価で苦手な部分を見つけ、訓練とレビューを繰り返して改善していく。各項目には公開を止める水準と合格水準も設けていたといいます。

使いたい場面を評価に落とし込んで、モデルの訓練までつなげていく。こういう積み重ねが、毎日使ったときの差になってくるのだと思います。

ひとまず、手元で眠っていたM5StackからMuseに話しかけられるようになりました。次はSDKの中を覗いて、画面表示や操作を自分好みにカスタマイズしてみたいですね。

参考

この記事をシェアする

DevelopersIO 2026

関連記事