M5Stack Unit ASRで始めるオフライン音声認識

# はじめに

M5Stack社から、Amazon Alexaのような音声認識がオフラインで可能な「M5Stack Unit ASR」が登場しました。これを使えば、ローカルで音声認識が可能なデバイスを手軽に作成できます。**最大300個のカスタムコマンドが登録可能**で、**マイク・スピーカー内蔵**、**UART通信対応**と、組み込み向けの音声制御デバイスとして活躍が期待できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30621/4b1f665b-6531-4139-a920-7a28b2553fca.png)

本記事では、M5Stack Unit ASRの概要から、**M5Stack Coreと組み合わせた動作確認方法やカスタムコマンドの設定方法**を解説します。

---

***実際に購入し、入手したパッケージ***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30621/455adc6a-03cd-4cbc-80e5-45d9478ff5c0.png)

---

# M5Stack Unit ASRとは？

まずは落ち着いてこの動画を見てほしい

https://www.youtube.com/watch?v=ucXyDLIiLok

## 特徴

- **音声認識・声紋認識・音声強調・音声検出**に対応
- **AEC（アコースティックエコーキャンセレーション）** によるノイズ除去
- **最大300個のカスタムコマンドを登録可能**
- **ユーザー定義のウェイクワード**対応
- **マイク・スピーカー内蔵**
- **UARTシリアル通信対応**
- 安い
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30621/2c329991-7804-4d04-82b6-5cbe6ab63faa.png)

公式ドキュメント: https://docs.m5stack.com/en/unit/Unit%20ASR


## 主な用途

- AIアシスタント
- スマートホーム
- セキュリティ監視
- ロボット工学
- スマートハードウェア
- ヘルスケア
- ミニ四駆をAIで動かす

## 内部チップ「CI-03T AIモジュール」

- **BNPU V3（ブレイン・ニューラル・ネットワーク・プロセッサ）搭載** 
  - ↑名前はすごいが謎
- **CPU 220MHz**
- **640KB SRAM内蔵**
- **2バージョンのモデルあり**
  - **シングルマイクAEC搭載版（CI-03T1）**
  - **デュアルマイク版（CI-03T2）**（AEC非搭載）

---

# M5Stack Unit ASRを試す

## 用意するもの

- 買うための金
- M5Stack Core（Basic, Fire, Gray, Core2, CoreS3 など）
  - UARTで通信するだけなのでぶっちゃけなんでも良い
- M5Stack Unit ASR
- HY2.0-4P Groveケーブル（付属）
- PC（Arduino IDE が動作する環境）
- USBケーブル（M5Stack CoreとPCを接続）

## サンプルプログラムの実行


1. **Arduino IDE でサンプルコードを記述**
   - "Hi, M Five" でウェイクアップ
   - "Turn on"、"Turn off" などの基本コマンドを試す
2. **M5Stack Coreへ書き込み**
   - 書き込みモードへの入り方（CoreS3の場合はリセットボタンを長押し）
3. **動作確認**
   - シリアルモニタで ASR の出力を確認
   - 音声コマンドが正常に動作するかチェック

## コード例

```c
/*
 * SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
 *
 * SPDX-License-Identifier: MIT
 */

/*
 * @概要: M5Stack用音声認識(ASR)ユニットのサンプルプログラム
 * @対応ハードウェア: Basic/Fire/Gray(PortA接続) + Unit ASR
 * @必要なライブラリ:
 * M5GFX: https://github.com/m5stack/M5GFX
 * M5Unified: https://github.com/m5stack/M5Unified
 * M5Unit-ASR: https://github.com/m5stack/M5Unit-ASR
 * 
 * @機能説明:
 * - 音声コマンドの認識と処理
 * - ボタンAで登録済みコマンドの一覧表示
 * - ボタンBで新規コマンドの追加
 * - ボタンCでコマンドの削除
 * 
 * @使用方法:
 * 1. ASRユニットをPortAに接続
 * 2. プログラムを書き込み
 * 3. シリアルモニタで動作確認可能
 */

#include <M5Unified.h>
#include <unit_asr.hpp>
#include "unit_asr_commands.h"  // コマンド番号定義

// ASRユニットのインスタンスを作成
ASRUnit asr;

void setup()
{
    // M5Stackの初期化設定
    auto cfg            = M5.config();
    cfg.serial_baudrate = 115200;  // シリアル通信速度を設定
    M5.begin(cfg);

    // PortAのピン番号を取得
    int8_t port_a_pin1 = -1, port_a_pin2 = -1;
    port_a_pin1 = M5.getPin(m5::pin_name_t::port_a_pin1);  // RXピン
    port_a_pin2 = M5.getPin(m5::pin_name_t::port_a_pin2);  // TXピン
    Serial.printf("getPin: RX:%d TX:%d\n", port_a_pin1, port_a_pin2);

    // ASRユニットの初期化（Serial1を使用、ボーレート115200）
    asr.begin(&Serial1, 115200, port_a_pin1, port_a_pin2);
}

// 音声コマンド"hello"を受信した時のコールバック関数
void myCommandHandler()
{
    Serial.println("hello command received!");  // コマンド受信を通知
}

void loop()
{
    M5.update();  // ボタン状態の更新

    // ASRユニットからの新しいコマンドを確認
    if (asr.update()) {
        // 認識された音声コマンドの情報を表示
        Serial.printf("Command word: %s\n", asr.getCurrentCommandWord());      // コマンドワード
        Serial.printf("Command number: 0x%X\n", asr.getCurrentCommandNum());   // コマンド番号
        Serial.print("Raw message:");                                          // 生データ
        Serial.println(asr.getCurrentRawMessage());
        Serial.printf("Have command handler: %s\n",                           // ハンドラの有無
                     asr.checkCurrentCommandHandler() ? "Yes" : "No");
    }

    // ボタンA: コマンドリストの表示と検索機能のデモ
    if (M5.BtnA.wasPressed()) {
        asr.printCommandList();  // 登録済みコマンドの一覧を表示
        // コマンド番号0x32に対応する単語を検索
        Serial.printf("Search command word: %s\n", asr.searchCommandWord(CMD_HELLO));
        // "hello"コマンドに対応する番号を検索
        Serial.printf("Search command number: %d\n", asr.searchCommandNum("hello"));
    }
    // ボタンB: 新規コマンド"hello"の追加
    else if (M5.BtnB.wasPressed()) {
        // コマンド番号0x32、単語"hello"、ハンドラmyCommandHandlerを登録
        Serial.printf(asr.addCommandWord(CMD_HELLO, "hello", myCommandHandler) ? 
                     "Add Success\n" : "Add Fail\n");
    }
    // ボタンC: コマンド"hello"の削除
    else if (M5.BtnC.wasPressed()) {
        Serial.printf(asr.removeCommandWord("hello") ? 
                     "Remove Success\n" : "Remove Fail\n");
    }
}
```
---

# カスタムコマンドの追加

M5Stack Unit ASR では、**Smart Pi Platform**を利用してカスタムコマンドを設定できます。
カスタムコマンドはクラウド上で学習され、学習結果済みのファームウェアをダウンロードする仕組みです。
学習時間は数分といった印象です。

### 1. Smart Pi Platform へ登録 (中国語なので辛い)

- **アカウント登録＆ログイン**（ https://www.smartpi.cn/ ）
- **製品管理ページを開く**

### 2. コンフィグテンプレートをインポート

- **Unit ASR Config EN Template または CN Template をダウンロード＆インポート**
- 既存のコマンドワードをコピーして新しいコマンドを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30621/2fccf84b-68ef-4f79-97cf-75d942a9f074.png)

### 3. トリガー＆応答コマンドを設定

- **日本語のコマンドも登録可能**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30621/b6196a47-06fb-40f2-997f-f51a54b2b816.png)

- コマンドコードIDを設定（重複注意）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30621/232c30bd-2124-4144-a499-ed6b6d3bcd28.png)


### 4. ファームウェアを生成＆ダウンロード

- 設定を確認し、カスタムファームウェアを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30621/80e4276e-0a06-4cd9-bde8-329beaaf15be.png)
↑実際にファームウェアを生成し、ダウンロードして展開したもの

- **Unit ASR Firmware Flashing Tool**を使用してUnit ASRへ書き込み
  - たぶん、USB-UARTなアダプタならなんでもOK



### 5. 動作テスト

- シリアルモニタを使ってカスタムコマンドが動作するか確認

---

# 応用例

## スマートホーム

- 音声で**照明のON/OFF**を制御
  - ソリッドステートリレーとかで
- **家電製品の操作**（エアコン、テレビなど）
  - 赤外線LEDとかで

## ロボット制御

- 音声コマンドでロボットを制御
  - プラレス三四郎とか
- 指定のフレーズで特定の動作を実行
  - 「Die」→「爆発して2度と起動しなくする」と

---

# まとめ

M5Stack Unit ASR は、ローカルで動作する音声認識モジュールとして非常に優秀です。
**Smart Pi Platform でカスタムコマンドを設定**し、**Arduino IDEで簡単にM5Stack Coreへ実装可能**なため、**IoTデバイスやロボット制御など、さまざまな用途に活用**できます。

日本語化してみたリポジトリはこちら👉 **[M5Unit-ASR 日本語版](https://github.com/GOROman/M5Unit-ASR)**


# リファレンス

- 公式ドキュメント
  - https://docs.m5stack.com/en/unit/Unit%20ASR
- 購入先(Aliexpress)
  - https://ja.aliexpress.com/item/1005008493424686.html