Het project esp32-pie-asr introduceert een systeem voor live Engelse spraakherkenning dat volledig lokaal draait op de ESP32-P4 microcontroller. Door gebruik te maken van de twee RISC-V-cores en PIE SIMD-instructies, kan het systeem audio sneller dan real-time verwerken.
Belangrijkste technische kenmerken:
- Model: Gebruikt het Kroko-model (Zipformer2-transducer), waarbij de gewichten zijn geoptimaliseerd naar 26,65 MB via 2- en 4-bit kwantisatie om in het geheugen te passen.
- Prestaties: Behaalt een Word Error Rate (WER) van 4,34% op de LibriSpeech test-clean dataset, met een gemiddelde vertraging van ongeveer 2 seconden.
- Functionaliteit: Ondersteunt 'hotwords' via een tekstbestand op een microSD-kaart, waardoor specifieke termen nauwkeuriger herkend worden zonder dat hertraining nodig is.
- Toepassingen: Bevat zes demo's voor spraakbesturing, waaronder scenario's voor smart homes, robotstofzuigers en fabriekslijnen.
Hardware- en softwarevereisten: Voor installatie is een ESP32-P4 chip (revisie v3) met 32 MB PSRAM, een microfoon, een scherm en een microSD-kaart vereist. De software is gelicenseerd onder Apache-2.0 en de modelgewichten zijn beschikbaar op Hugging Face.
esp32-pie-asr: Live Engelse spraakherkenning op de ESP32-P4
Het gebruikte model is Kroko (Banafo), een streaming Zipformer2-transducer met 65,7 miljoen parameters. De gewichten zijn geoptimaliseerd van 71 MB naar 26,65 MB door gebruik te maken van 2- en 4-bit gewichten. Deze gewichten zijn beschikbaar op Hugging Face onder BoumedineBillal/esp32-pie-asr-kroko-en.
Technische Specificaties
Nauwkeurigheid
- LibriSpeech test-clean: 4,34 % WER (Word Error Rate)
- LibriSpeech test-other: 10,26 % WER
- (Gebaseerd op beam search met 4 hypothesen)
Snelheid en Vertraging
- Snelheid: 0,70× real-time (elke 1,28 seconden audio wordt in 0,90 seconden verwerkt, met beide cores op 400 MHz).
- Vertraging: Een woord wordt gemiddeld ongeveer 2 seconden na het uitspreken definitief (mediaan 1,9 tot 2,3 s; 95 % binnen 4,1 s).
Geheugen en Opslag
- Gewichten: 26,65 MB, geladen vanaf een microSD-kaart bij opstarten in 2,9 seconden.
- Geheugenverbruik: De gewichten en de status bevinden zich in de 32 MB PSRAM; er blijft 121 KB intern RAM vrij (104 KB bij gebruik van de demo's).
Functionaliteiten
Bit-exacte berekeningen
De chip berekent exact dezelfde resultaten als de PC-versie van de engine; de WER-waarden van de PC zijn identiek aan die van de chip.
Frases (Hotwords)
Via een tekstbestand op de SD-kaart kunnen specifieke woorden en zinnen worden gedefinieerd waar het systeem op moet letten (hotwords). Indien het model een woord anders spelt, kunnen gesproken varianten worden toegevoegd (bijv. ESP32 = ESP thirty two). Deze frases kunnen via het scherm worden in- of uitgeschakeld zonder dat hertraining nodig is.
Spraakbesturing
Er zijn zes demo's beschikbaar die worden aangestuurd door gesproken commando's via woordregels, zonder gebruik van een taalmodel (language model). De firmware firmwares/voicecontrol start met live transcriptie, gevolgd door de spraakbesturingsdemo's. De metingen voor de transcriptie zijn uitgevoerd met firmwares/livetranscriber.
Vergelijking met andere systemen
| Parameters | Gewichten | Platform | Streaming | test-clean | test-other | Snelheid |
| esp32-pie-asr | 2/4-bit, 26.65 MB | ESP32-P4 (2 × 400 MHz RISC-V) | Ja | 4,34 % | 10,26 % | 0,70× real time |
| Kroko (released) | int8, 71 MB | PC | Ja | 3,94 % | 9,17 % | - |
| Oído (streaming + LM) | 13M int8 | ESP32-S3 (240 MHz Xtensa) | Ja | 4,86 % | 11,03 % | 4,1-11,1s vertraging |
| Oído (whole utterance) | 13M int8 | ESP32-S3 | Nee | 3,70 % | 8,23 % | 1,97× real time |
| Moonshine Tiny | 27.1M float | CPU | Nee | 4,52 % | 11,71 % | - |
| Whisper tiny.en | 37.8M float | CPU | Nee | 5,66 % | 15,45 % | - |
| ESP-SR MultiNet | - | ESP32-S3 | - | Vaste lijst (<200 commando's) | - | - |
Opmerking: Metingen voor esp32-pie-asr en Kroko zijn uitgevoerd op alle 2620 / 2939 clips met Whisper's English text normalizer.
Analyse van nauwkeurigheid (test-clean)
- Kroko (released, int8 ONNX): 4,03 % (greedy) / 3,94 % (beam 4)
- 2/4-bit gewichten, float activaties (PyTorch sim): 4,53 %
- 2/4-bit gewichten, integer activaties (de chip): 4,52 % (greedy) / 4,34 % (beam 4)
De 2/4-bit gewichten kosten ongeveer een half punt aan nauwkeurigheid; de integer-rekenkunde op de chip heeft geen merkbare impact.
Prestaties van Frases en Spraakbesturing
Effect van frases op WER
Bij tests met 140 text-to-speech clips (35 zinnen, 4 stemmen):
- Frases uit: 0 van 60 woorden gevonden, 62 van 72 zinnen gevonden, 0 valse alarmen. WER: 19,5 %
- Frases aan: 46 van 60 woorden gevonden, 70 van 72 zinnen gevonden, 0 valse alarmen. WER: 3,4 %
Voice Control Demo's
De firmware bevat zes scenario's waarbij gesproken orders een gesimuleerd apparaat aansturen: een robotstofzuiger, een smart home, een autobezetting, een fabriekslijn, een keuken en een presentator.
Nauwkeurigheid per demo (188 clips per demo):
| Demo | Exacte orders (zonder lijst) | Met lijst | Valse acties |
| Robotstofzuiger | 92 % | 96 % | 0 |
| Smart home | 93 % | 97 % | 0 |
| Autobezetting | 93 % | 97 % | 0 |
| Fabriekslijn | 86 % | 94 % | 0 |
| Keuken | 97 % | 98 % | 0 |
| Presentator | 97 % | 99 % | 0 |
De vertraging van het einde van een order tot de actie bedraagt mediaan 1,84 s (stofzuiger) tot 1,97 s (fabriek), met een maximum van 2,57 s.
Installatie en Gebruik
Hardwarevereisten
- ESP32-P4 chip revisie v3 (ESP32-P4X)
- 32 MB PSRAM
- Microfoon, scherm en microSD-kaart
- Getest op: Espressif ESP32-P4X-Function-EV-Board (ES8311 microfoon, 1024 × 600 MIPI-DSI paneel).
Software-installatie
De gewichten (26,65 MB) passen niet in de 16 MB flash van het bord en moeten op een FAT-geformatteerde microSD-kaart worden geplaatst.
- Gewichten downloaden:
``bash git clone https://github.com/BoumedineBillal/esp32-pie-asr cd esp32-pie-asr python models/download.py --card <mapvanmicroSD_kaart> ``
- Firmware flashen:
- Via de browser:
boumedinebillal.github.io/esp32-pie-asr
- Of via ESP-IDF v6.1:
``bash cd firmwares/voice_control idf.py set-target esp32p4 idf.py -p PORT flash ``
- Frases aanpassen:
Bij de eerste boot schrijft de firmware de lijstbestanden (phrases.txt en demo-specifieke lijsten) naar de SD-kaart. Deze kunnen worden bewerkt op een PC (één woord of zin per regel).
Debugging
Een debug-build voegt een link toe naar een PC via de USB High-Speed poort voor logs, commando's en screenshots:
idf.py -B build_debug -D SDKCONFIG=build_debug/sdkconfig \
-D SDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.debug" -p PORT flash
Architectuur (Inside)
Modeloptimalisatie
- Gewichten: 2/4-bit gewichten in groepen van 128, met een Hadamard-rotatie en één norm per groep. De keuze tussen 2 of 4 bits per matrix is gebaseerd op sensitiviteit, zonder extra training.
- Rekenkunde: Gebruik van integer-arithmetiek (int8 voor producten, int16 daartussen, int8 attention caches en activaties via tabellen).
- Implementatie: PIE SIMD-kernels geschreven in assembly, waarbij de producten over beide cores worden verdeeld.
- Streaming: Verwerking in chunks van 1,28 s met caches van vaste grootte en een beam search met phrase biasing.
Projectstructuur
pieasr/: De engine (ESP-IDF component), inclusief host-build en tests.
components/: Spraaksysteem, voice-regels, microfoon, scherm/touch, SD-kaart en debug-link.
firmwares/voice_control/: Firmware voor live transcriptie en de zes demo's.
firmwares/live_transcriber/: Alleen de transcriptie-engine met board-tests.
models/: Downloads voor de gewichten.
tools/eval/, benchmarks/: WER-metingen en score-teksten.
Reproductie
Om de resultaten te reproduceren:
# Host build en unit tests
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
# LibriSpeech data ophalen
python tools/eval/get_librispeech.py --set test-clean
# WER meten op PC (chip configuratie)
bash tools/eval/run_wer.sh data/test-clean int+beam4
# PIE kernels testen op het bord tegen C-referentie
bash pieasr/tests/target/run.sh
Toekomstige Plannen
- Ondersteuning voor de ESP32-S31 (deze beschikt over dezelfde PIE 2.2 SIMD-instructies als de ESP32-P4X).
- Ontwikkeling van een model voor Modern Standard Arabic.
Credits en Licenties
- Model: Kroko door Banafo (Community license, CC-BY-SA).
- Gewichtsformat: Cactus Quants door Cactus Compute.
- Testdata: LibriSpeech (CC BY 4.0).
- Audio: Piper en bijbehorende stemmen voor TTS-testclips.
- Hardware/SDK: Espressif (ESP-IDF, ES8311, EK79007) (Apache-2.0).
- Fonts: Inter (SIL OFL 1.1) en stb_truetype (public domain/MIT).
Licentie: De code is gelicenseerd onder Apache-2.0. De gewichten vallen onder CC-BY-SA 4.0.
esp32-pie-asr: Live Engelse spraakherkenning op de ESP32-P4
Het gebruikte model is Kroko (Banafo), een streaming Zipformer2-transducer met 65,7 miljoen parameters. De gewichten zijn geoptimaliseerd van 71 MB naar 26,65 MB door gebruik te maken van 2- en 4-bit gewichten. Deze gewichten zijn beschikbaar op Hugging Face onder BoumedineBillal/esp32-pie-asr-kroko-en.
Technische Specificaties
Nauwkeurigheid
- LibriSpeech test-clean: 4,34 % WER (Word Error Rate)
- LibriSpeech test-other: 10,26 % WER
- (Gebaseerd op beam search met 4 hypothesen)
Snelheid en Vertraging
- Snelheid: 0,70× real-time (elke 1,28 seconden audio wordt in 0,90 seconden verwerkt, met beide cores op 400 MHz).
- Vertraging: Een woord wordt gemiddeld ongeveer 2 seconden na het uitspreken definitief (mediaan 1,9 tot 2,3 s; 95 % binnen 4,1 s).
Geheugen en Opslag
- Gewichten: 26,65 MB, geladen vanaf een microSD-kaart bij opstarten in 2,9 seconden.
- Geheugenverbruik: De gewichten en de status bevinden zich in de 32 MB PSRAM; er blijft 121 KB intern RAM vrij (104 KB bij gebruik van de demo's).
Functionaliteiten
Bit-exacte berekeningen
De chip berekent exact dezelfde resultaten als de PC-versie van de engine; de WER-waarden van de PC zijn identiek aan die van de chip.
Frases (Hotwords)
Via een tekstbestand op de SD-kaart kunnen specifieke woorden en zinnen worden gedefinieerd waar het systeem op moet letten (hotwords). Indien het model een woord anders spelt, kunnen gesproken varianten worden toegevoegd (bijv. ESP32 = ESP thirty two). Deze frases kunnen via het scherm worden in- of uitgeschakeld zonder dat hertraining nodig is.
Spraakbesturing
Er zijn zes demo's beschikbaar die worden aangestuurd door gesproken commando's via woordregels, zonder gebruik van een taalmodel (language model). De firmware firmwares/voicecontrol start met live transcriptie, gevolgd door de spraakbesturingsdemo's. De metingen voor de transcriptie zijn uitgevoerd met firmwares/livetranscriber.
Vergelijking met andere systemen
| Parameters | Gewichten | Platform | Streaming | test-clean | test-other | Snelheid |
| esp32-pie-asr | 2/4-bit, 26.65 MB | ESP32-P4 (2 × 400 MHz RISC-V) | Ja | 4,34 % | 10,26 % | 0,70× real time |
| Kroko (released) | int8, 71 MB | PC | Ja | 3,94 % | 9,17 % | - |
| Oído (streaming + LM) | 13M int8 | ESP32-S3 (240 MHz Xtensa) | Ja | 4,86 % | 11,03 % | 4,1-11,1s vertraging |
| Oído (whole utterance) | 13M int8 | ESP32-S3 | Nee | 3,70 % | 8,23 % | 1,97× real time |
| Moonshine Tiny | 27.1M float | CPU | Nee | 4,52 % | 11,71 % | - |
| Whisper tiny.en | 37.8M float | CPU | Nee | 5,66 % | 15,45 % | - |
| ESP-SR MultiNet | - | ESP32-S3 | - | Vaste lijst (<200 commando's) | - | - |
Opmerking: Metingen voor esp32-pie-asr en Kroko zijn uitgevoerd op alle 2620 / 2939 clips met Whisper's English text normalizer.
Analyse van nauwkeurigheid (test-clean)
- Kroko (released, int8 ONNX): 4,03 % (greedy) / 3,94 % (beam 4)
- 2/4-bit gewichten, float activaties (PyTorch sim): 4,53 %
- 2/4-bit gewichten, integer activaties (de chip): 4,52 % (greedy) / 4,34 % (beam 4)
De 2/4-bit gewichten kosten ongeveer een half punt aan nauwkeurigheid; de integer-rekenkunde op de chip heeft geen merkbare impact.
Prestaties van Frases en Spraakbesturing
Effect van frases op WER
Bij tests met 140 text-to-speech clips (35 zinnen, 4 stemmen):
- Frases uit: 0 van 60 woorden gevonden, 62 van 72 zinnen gevonden, 0 valse alarmen. WER: 19,5 %
- Frases aan: 46 van 60 woorden gevonden, 70 van 72 zinnen gevonden, 0 valse alarmen. WER: 3,4 %
Voice Control Demo's
De firmware bevat zes scenario's waarbij gesproken orders een gesimuleerd apparaat aansturen: een robotstofzuiger, een smart home, een autobezetting, een fabriekslijn, een keuken en een presentator.
Nauwkeurigheid per demo (188 clips per demo):
| Demo | Exacte orders (zonder lijst) | Met lijst | Valse acties |
| Robotstofzuiger | 92 % | 96 % | 0 |
| Smart home | 93 % | 97 % | 0 |
| Autobezetting | 93 % | 97 % | 0 |
| Fabriekslijn | 86 % | 94 % | 0 |
| Keuken | 97 % | 98 % | 0 |
| Presentator | 97 % | 99 % | 0 |
De vertraging van het einde van een order tot de actie bedraagt mediaan 1,84 s (stofzuiger) tot 1,97 s (fabriek), met een maximum van 2,57 s.
Installatie en Gebruik
Hardwarevereisten
- ESP32-P4 chip revisie v3 (ESP32-P4X)
- 32 MB PSRAM
- Microfoon, scherm en microSD-kaart
- Getest op: Espressif ESP32-P4X-Function-EV-Board (ES8311 microfoon, 1024 × 600 MIPI-DSI paneel).
Software-installatie
De gewichten (26,65 MB) passen niet in de 16 MB flash van het bord en moeten op een FAT-geformatteerde microSD-kaart worden geplaatst.
- Gewichten downloaden:
``bash git clone https://github.com/BoumedineBillal/esp32-pie-asr cd esp32-pie-asr python models/download.py --card <mapvanmicroSD_kaart> ``
- Firmware flashen:
- Via de browser:
boumedinebillal.github.io/esp32-pie-asr
- Of via ESP-IDF v6.1:
``bash cd firmwares/voice_control idf.py set-target esp32p4 idf.py -p PORT flash ``
- Frases aanpassen:
Bij de eerste boot schrijft de firmware de lijstbestanden (phrases.txt en demo-specifieke lijsten) naar de SD-kaart. Deze kunnen worden bewerkt op een PC (één woord of zin per regel).
Debugging
Een debug-build voegt een link toe naar een PC via de USB High-Speed poort voor logs, commando's en screenshots:
idf.py -B build_debug -D SDKCONFIG=build_debug/sdkconfig \
-D SDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.debug" -p PORT flash
Architectuur (Inside)
Modeloptimalisatie
- Gewichten: 2/4-bit gewichten in groepen van 128, met een Hadamard-rotatie en één norm per groep. De keuze tussen 2 of 4 bits per matrix is gebaseerd op sensitiviteit, zonder extra training.
- Rekenkunde: Gebruik van integer-arithmetiek (int8 voor producten, int16 daartussen, int8 attention caches en activaties via tabellen).
- Implementatie: PIE SIMD-kernels geschreven in assembly, waarbij de producten over beide cores worden verdeeld.
- Streaming: Verwerking in chunks van 1,28 s met caches van vaste grootte en een beam search met phrase biasing.
Projectstructuur
pieasr/: De engine (ESP-IDF component), inclusief host-build en tests.
components/: Spraaksysteem, voice-regels, microfoon, scherm/touch, SD-kaart en debug-link.
firmwares/voice_control/: Firmware voor live transcriptie en de zes demo's.
firmwares/live_transcriber/: Alleen de transcriptie-engine met board-tests.
models/: Downloads voor de gewichten.
tools/eval/, benchmarks/: WER-metingen en score-teksten.
Reproductie
Om de resultaten te reproduceren:
# Host build en unit tests
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
# LibriSpeech data ophalen
python tools/eval/get_librispeech.py --set test-clean
# WER meten op PC (chip configuratie)
bash tools/eval/run_wer.sh data/test-clean int+beam4
# PIE kernels testen op het bord tegen C-referentie
bash pieasr/tests/target/run.sh
Toekomstige Plannen
- Ondersteuning voor de ESP32-S31 (deze beschikt over dezelfde PIE 2.2 SIMD-instructies als de ESP32-P4X).
- Ontwikkeling van een model voor Modern Standard Arabic.
Credits en Licenties
- Model: Kroko door Banafo (Community license, CC-BY-SA).
- Gewichtsformat: Cactus Quants door Cactus Compute.
- Testdata: LibriSpeech (CC BY 4.0).
- Audio: Piper en bijbehorende stemmen voor TTS-testclips.
- Hardware/SDK: Espressif (ESP-IDF, ES8311, EK79007) (Apache-2.0).
- Fonts: Inter (SIL OFL 1.1) en stb_truetype (public domain/MIT).
Licentie: De code is gelicenseerd onder Apache-2.0. De gewichten vallen onder CC-BY-SA 4.0.