26
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2025-02-15

はじめに

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

image.png

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


実際に購入し、入手したパッケージ
image.png


M5Stack Unit ASRとは?

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

特徴

  • 音声認識・声紋認識・音声強調・音声検出に対応
  • AEC(アコースティックエコーキャンセレーション) によるノイズ除去
  • 最大300個のカスタムコマンドを登録可能
  • ユーザー定義のウェイクワード対応
  • マイク・スピーカー内蔵
  • UARTシリアル通信対応
  • 安い
    image.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 の出力を確認
    • 音声コマンドが正常に動作するかチェック

コード例

/*
 * 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 へ登録 (中国語なので辛い)

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

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

image.png

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

  • 日本語のコマンドも登録可能
    image.png

  • コマンドコードIDを設定(重複注意)

image.png

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

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

image.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 日本語版

リファレンス

26
25
0

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
26
25

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?