Show HN: ESP32-P4マイクロコントローラー上でクラウド不要のライブ音声認識
Show HN: Live speech-to-text on an ESP32-P4 microcontroller, no cloud (github.com)
要約
このプロジェクトは、ESP32-P4マイクロコントローラー上で、クラウドに接続せずにリアルタイムの音声認識を実現する「esp32-pie-asr」を紹介しています。65.7MパラメータのKrokoモデルを2/4ビットに量子化し、ESP32-P4のRISC-VコアとPIE SIMD命令を活用することで、低消費電力かつ高速な音声認識と音声制御デモを可能にしています。モデルの重みは26.65MBに圧縮され、microSDカードから読み込まれ、リアルタイムの0.70倍の速度で動作します。
全文翻訳
esp32-pie-asr
[画像: Flash from your browser] [画像: Release] [画像: Firmware build] [画像: Weights on Hugging Face]
ESP32-P4上でのライブ英語音声認識。 オープンボキャブラリー、ストリーミング、リアルタイムより高速、マイクロコントローラー単体で実現:ボードのマイクから入力され、話すと同時に画面に単語が表示されます。クラウドもニューラルアクセラレータも不要;チップの2つのRISC-VコアとPIE SIMD命令を使用します。
モデルはKroko(Banafo)で、65.7MパラメータのストリーミングZipformer2トランスデューサーです。重みは71MBから26.65MBに、2ビットおよび4ビットに量子化されています。重みはHugging Faceで公開されています:BoumedineBillal/esp32-pie-asr-kroko-en。
[画像: Video: live speech recognition on the ESP32-P4]
| Accuracy | LibriSpeech test-clean 4.34 % WER, test-other 10.26 % (ビームサーチ、4仮説) |
| Speed | 0.70× real time: 1.28秒のオーディオを0.90秒で処理、両コアとも400MHz |
| Delay | 単語が確定するのは発話後約 2秒 (中央値1.9~2.3秒、95%が4.1秒以内) |
| Weights | 26.65 MB、起動時にmicroSDカードから読み込み2.9秒 |
| Memory | 重みと状態は32MB PSRAMに格納;内部RAMは121KB空き (デモ実行時は104KB) |
| Bit-exact | チップの計算はエンジンのPCビルドと完全に一致:PCのWERはチップと同じ |
| Phrases | 認識対象の単語やフレーズ(ホットワード)、画面で切り替え可能、再学習不要 |
| Voice control | 単語ルールで制御される6つのデモ、言語モデル不要 |
ファームウェアのfirmwares/voice_controlは、ライブ文字起こしから始まり、音声制御デモへと移行します。文字起こし機能の数値はfirmwares/live_transcriberで測定されており、これは同じエンジンを単体で動作させた文字起こし機能で、エンジンのボードテストに使用されています。
比較
| Parameters | Weights | Runs on | Streaming | test-clean | test-other | Speed | |
|---|---|---|---|---|---|---|---|
| esp32-pie-asr | 65.7M | 2/4-bit, 26.65 MB | ESP32-P4 (2 × 400 MHz RISC-V) | yes | 4.34 % | 10.26 % | 0.70× real time |
| Kroko as released (sherpa-onnx) | 65.7M | int8, 71 MB | PC | yes | 3.94 % | 9.17 % | |
| Oído, streaming, with LM | 13M | int8 | ESP32-S3 (240 MHz Xtensa) | yes | 4.86 % | 11.03 % | final text 4.1 to 11.1 s after clips of 3.6 to 10.6 s |
| Oído, whole utterance | 13M | int8 | ESP32-S3 | no | 3.70 % | 8.23 % | 1.97× real time (one core) |
| Moonshine Tiny | 27.1M | float | CPU | no | 4.52 % | 11.71 % | |
| Whisper tiny.en | 37.8M | float | CPU | no | 5.66 % | 15.45 % | |
| ESP-SR MultiNet | ESP32-S3 | a fixed list of up to 200 commands, not open vocabulary |
esp32-pie-asrとKroko as released: Whisperの英語テキスト正規化ツール(Krokoはsherpa-onnx 1.13.8を使用、ビーム幅は同じ、各クリップの後に2秒の無音を挿入して最後のチャンクをデコード)を用いて、全2620/2939クリップで測定。その他は作者の公開値。
精度(test-clean)の比較:
| greedy | beam 4 | |
|---|---|---|
| Kroko as released, int8 ONNX | 4.03 % | 3.94 % |
| 2/4-bit weights, float activations (PyTorch simulation) | 4.53 % | |
| 2/4-bit weights, integer activations: the chip | 4.52 % | 4.34 % |
2/4ビット重みは約0.5ポイントの精度低下、チップ上の整数演算はコストゼロ。
Phrases
SDカード上のテキストファイルに認識対象の単語やフレーズをリスト化します。モデルが異なるスペルを認識する単語(例: ESP32 = ESP thirty two)は、その発音形式も含まれます。各項目は画面上でオン/オフ可能です。デフォルトリストでの140のテキスト読み上げクリップ(35文、4音声)でのテスト結果:
| the list's words found | its sentences found | false alarms (40 clips without them) | WER | |
|---|---|---|---|---|
| phrases off | 0 of 60 | 62 of 72 | 0 | 19.5 % |
| phrases on | 46 of 60 | 70 of 72 | 0 | 3.4 % |
Voice control
ファームウェアの2ページ目には、画面上でシミュレートされたデバイスを音声コマンドで操作する6つのデモがあります:ロボット掃除機、スマートホーム、車内、工場ライン、キッチン、プレゼンター。言語モデルは使用せず、各デモは単語ルールのテーブル(動詞、対象;数字、部屋、「寝室以外」など)で構成され、どの単語がどの操作をトリガーしたかが画面に表示されます。各デモには独自のフレーズリストがあります。
188のテキスト読み上げクリップ/デモ(25のコマンドと22のニアミス、デモの単語を使った通常の文、4音声)でのテスト結果:
| orders exact, no list | with its list | false actions (88 near misses) | |
|---|---|---|---|
| robot vacuum | 92 % | 96 % | 0 |
| smart home | 93 % | 97 % | 0 |
| car cabin | 93 % | 97 % | 0 |
| factory line | 86 % | 94 % | 0 |
| kitchen | 97 % | 98 % | 0 |
| presenter | 97 % | 99 % | 0 |
リストはこれらのクリップに基づいて選択されており、すべてのニアミスは単語の誤認識によるものです。ボードは各クリップでPCと同様のアクションを実行します。コマンド終了からアクション実行までの時間は、掃除機ページで中央値1.84秒、工場ラインで1.97秒、最長で2.57秒です。デモページ描画中も、エンジンはリアルタイム以下(最長0.81倍)で動作します。
実行方法
ハードウェア:ESP32-P4(チップリビジョンv3、ESP32-P4X)、32MB PSRAM、マイク、スクリーン、microSDカード。EspressifのESP32-P4X-Function-EV-Board(ES8311マイク、1024×600 MIPI-DSIパネル)で製造・測定。
重み(26.65MB)はボードの16MBフラッシュには収まらないため、microSDカードに格納されます。起動時にファームウェアがカードから32MB PSRAMに読み込み(2.9秒)、そこから実行します。
- 重みをFAT形式でフォーマットされたmicroSDカードのルートフォルダに配置します:
git clone https://github.com/BoumedineBillal/esp32-pie-asr
cd esp32-pie-asr
python models/download.py --card <microSDカードのフォルダパス> # ダウンロード、チェック、コピー
- カードをボードのmicroSDスロットに挿入します。
- ファームウェアをブラウザ(ChromeまたはEdge、ツール不要)からフラッシュします: boumedinebillal.github.io/esp32-pie-asr、またはESP-IDF v6.1を使用する場合:
cd firmwares/voice_control
idf.py set-target esp32p4
idf.py -p PORT flash
初回起動時に、ファームウェアはカードにフレーズリストも書き込みます:文字起こし用のphrases.txtと、デモごとのリスト(vacuum_phrases.txt、smarthome_phrases.txtなど)。リストを変更するには、PCで対応するファイルを編集します。各行に1つの単語またはフレーズを記述し、モデルが異なるスペルを認識する単語はshown = spoken | spokenのように指定します。#はコメントです。画面には最大10個の単語と10個のフレーズが表示されます。
firmwares/live_transcriber(文字起こし機能単体)も同様の方法でビルド・フラッシュできます。
デバッグビルドでは、ボードテスト(debug/tests/run_all.py、Windows)のために、ボードのUSB High-Speedポート経由でPCへのリンクが追加されます(コマンド、ログ、単語、スクリーンショット)。
idf.py -B build_debug -D SDKCONFIG=build_debug/sdkconfig \
-D SDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.debug" -p PORT flash
内部構造
モデルの組み込みと実行方法については、docs/design.mdを参照してください:
- 2/4ビット重み:128個のグループごとに、アダマール回転とグループごとの正規化を適用。学習なしで、感度に基づいて各行列に2または4ビットを選択。
- 整数演算:積はint8、中間結果はint16、アテンションキャッシュはint8、アクティベーションはテーブル参照。
- PIE SIMDカーネル:アセンブリ言語で記述され、ホストビルドが実行するC言語リファレンス付き。積は両コアに分散。
- PCとのビット完全一致:両サイドでの決定論的な数学演算。各テストクリップで検証(エンコーダー出力CRCとテキスト)、各カーネルで検証。
- ストリーミング:固定サイズのキャッシュを持つ1.28秒チャンクで処理。フレーズバイアス付きビームサーチ。文字起こしの単語および行ルール。
- 音声制御:単語ルールによる制御。PCでテスト済み。各ページで一時停止すると検索結果の最良仮説が確定するため、コマンド終了後3.1秒ではなく約1.9秒でアクションが実行される。
| Folder | |
|---|---|
pieasr/ | エンジン:ESP-IDFコンポーネント、ホストビルド(host/)、テスト(tests/) |
components/ | 音声サービス、単語ルール、マイク、スクリーンとタッチ、SDカード、デバッグリンク |
firmwares/voice_control/ | ファームウェア:ライブ文字起こしと6つのデモ、ボードおよびPCでのクリップテスト |
firmwares/live_transcriber/ | 文字起こし機能単体、エンジンのボードテスト付き |
models/ | 重みダウンロード |
tools/eval/, benchmarks/ | WER測定とスコアリングされた全テキスト |
再現方法
cmake -S pieasr/host -B build/host -DPIEASR_WEIGHTS=$PWD/models/kroko-en-q24-v1.bin
cmake --build build/host && ctest --test-dir build/host # 単体テストと8つのゴールデンクリップ
python tools/eval/get_librispeech.py --set test-clean # 2620クリップ;--set test-other: 2939
bash tools/eval/run_wer.sh data/test-clean int+beam4 # チップの設定をPCで実行
bash pieasr/tests/target/run.sh # 全PIEカーネルとCリファレンスをボードで実行
今後
- ESP32-S31のサポート:ESP32-P4Xと同じPIE 2.2 SIMD命令を搭載。
- アラビア語:現代標準アラビア語用のモデル。
謝辞
- Kroko by Banafo:モデル(コミュニティライセンス、CC-BY-SA)。
- Cactus Quants by Cactus Compute:重みフォーマット(アダマール回転された128グループ、ロイドマックスレベル)。
- LibriSpeech (CC BY 4.0):
pieasr/tests/data内の8つのテストクリップとWERセット。 - Piperとその音声:テキスト読み上げテストクリップ(テストスクリプトで生成、リポジトリには含まれていません)。
- Espressif:ESP-IDF、およびES8311とEK79007レジスタ値(Apache-2.0)。
- Inter (SIL OFL 1.1) および stb_truetype(パブリックドメインまたはMIT)。
ライセンス
コード:Apache-2.0 (LICENSE)。重み:Krokoと同様のCC-BY-SA 4.0。
著者
Boumedine Billal: GitHub · Hugging Face · LinkedIn · boumedinebillal@gmail.com
@misc{boumedine2026esp32pieasr,
author = {Boumedine Billal},
title = {esp32-pie-asr: streaming speech recognition on the ESP32-P4},
year = {2026},
url = {https://github.com/BoumedineBillal/esp32-pie-asr}
}