Document 32-bit ARM (armv7l / armhf) support#344
Conversation
linux-voice-assistant itself is architecture-agnostic (pyproject `platforms = ["any"]`, no native code), so it runs on 32-bit ARM (armv7l / armhf) too — e.g. Raspberry Pi 2/3 in 32-bit mode, Orange Pi / Allwinner H3. The only blockers were packaging, not code: - pymicro-wakeword shipped a 64-bit TFLite lib on 32-bit ARM (fixed upstream in OHF-Voice/pymicro-wakeword#18). - NumPy has no armv7l wheels on PyPI, and piwheels' NumPy doesn't bundle BLAS. Documents the Bare Metal path for armv7l: add `libopenblas0` and use piwheels as an extra pip index so NumPy & co. install as prebuilt armv7l wheels (avoids a slow/OOM source build on ~1 GB boards). No code changes; Docker images stay amd64/arm64. Validated on an Allwinner H3 (Cortex-A7, armv7l) running Armbian (Debian bookworm): the satellite pairs over the ESPHome API and runs the okay_nabu wake word. Co-Authored-By: Claude <noreply@anthropic.com>
|
If the support for 32-bit will be added in plan, most probably it will be in a separate branch as it will need to change a lot of modules (such as replacing numpy with array) and will lack the OpenWakeWord support. |
|
Thanks @omaramin-2000 ! To clarify the scope: this PR is docs-only for the existing bare-metal install — it doesn't change any modules or add a new 32-bit code path. |
if all needed packages are available we could also try to build a docker container for 32bit. |
|
@mzramna Please keep this PR as draft for now, until we finally decide how will it go and add the 32-bit support after testing and see its performance. At that time, we can see if this documentation can be edited in your PR or we write a new one from scratch. |
|
@omaramin-2000 sorry, I was under the impression it had already been accepted for validation; I'll wait for further communication before reopening the PR, then. |
Summary
Documents that linux-voice-assistant runs on 32-bit ARM (
armv7l/armhf) — e.g. Raspberry Pi 2/3 in 32-bit mode, Orange Pi / Allwinner H3 boards.The application itself is already architecture-agnostic (
pyproject.toml→platforms = ["any"], no native/compiled code in the package), so no source changes are needed. The only things that blocked 32-bit ARM were packaging of dependencies:pymicro-wakewordshipped a 64-bit TFLite C library on 32-bit ARM, failing at load withwrong ELF class: ELFCLASS64. Fixed upstream in Add 32-bit ARM (armv7l / armhf) support pymicro-wakeword#18 (addslinux_armv7ldetection + a 32-bit lib + anarmv7lwheel build).armv7lwheels on PyPI (it would compile from source — slow and OOM-prone on ~1 GB boards), and piwheels' NumPy doesn't bundle BLAS.Changes (docs only)
linux/armv7l(armhf) alongside amd64/aarch64, noting it's via the bare-metal install (Docker images stay amd64/arm64).32-bit ARM (armv7l / armhf)subsection under Bare Metal with the two extra steps beforescript/setup:libopenblas0,armv7lwheels.No code, no CI, no Dockerfile changes.
Validation
Validated on a real Allwinner H3 (Cortex-A7,
armv7l) running Armbian (Debian bookworm): with the steps above the satellite installs, pairs with Home Assistant over the ESPHome API, and runs theokay_nabuwake word end-to-end (wake → STT → response).Notes
pymicro-wakewordrelease that includes thearmv7lwheels (Add 32-bit ARM (armv7l / armhf) support pymicro-wakeword#18, merged). Until that release is on PyPI/piwheels, users can install from that project'smain.linux/arm/v7(it currently targets amd64/aarch64) would also need the piwheels index +libopenblas0in the image; happy to do that as a follow-up if wanted — this PR keeps to the validated bare-metal path.