尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Fully offline voice assistant on ESP32-S3 (Freenove FNK0104B): free-form STT, tiny LLM, TTS https://iamankushpandit.github.io/esp_ai/
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗A voice assistant that listens, thinks and speaks entirely on a $20 microcontroller. No network, no server, no phone. Say "Hey Ivy", ask a question, and the board transcribes your speech, runs a language model, and answers out loud — all on an ESP32-S3 with 8 MB of PSRAM.
Wi-Fi is used for one thing only: setting the clock over NTP.
mic → [LISTEN: energy VAD] → [TRANSCRIBE: conformer CTC]
→ [THINK: 19.7M-parameter LLM, 4-bit] → [SPEAK: SVOX Pico] → speaker
Freenove FNK0104B: ESP32-S3R8 (dual Xtensa @240 MHz, 8 MB octal PSRAM, 16 MB flash), ILI9341 240x320 LCD, FT6336U touch, ES8311 codec with microphone and speaker, microSD over SDMMC, Li-ion battery with charging.
Native ESP-IDF v6.1, C. No LVGL, no Arduino.
| Wake word | "Hey Ivy" (Espressif WakeNet9), always listening, also from sleep |
| Speech to text | conformer CTC, open vocabulary, streamed from SD |
| Answers | TinyTalk 2 8M v8 — 19.7M parameters, Q4, on the device |
| Also runs | any llama.cpp GGUF file you drop on the SD card (docs/GGUF.md) |
| Speech | SVOX Pico en-US, with adjustable voice gain |
| Without the AI | time, date, timers ("set a timer for five minutes") and identity are answered by plain C — the UI marks which |
| Clock | NTP over Wi-Fi once an hour, time zone by IP; the radio is off the rest of the time |
| Typing | on-screen T9 keypad, for when you'd rather not talk |
| Screen | pink/white/black CLI-style UI, dirty-row redraw only — nothing ever flashes |
| Sleep | lock button; the logo drifts through colours, then the backlight goes off |
| Demo | /settings: Run demo (~50 s, questions drawn at random), Full demo (~4 min), What it gets wrong (the failure reel). It asks itself in a second voice and answers in its own — hands-free, for filming |
| LLM (TinyTalk v8, 6.5 MB) | load 694 ms, 5.4–5.9 tok/s |
| LLM (GGUF delphi 6.4m, 3.8 MB) | load 864 ms, 7.3 tok/s |
| LLM (GGUF stories260K) | 30 tok/s |
| STT | 2.7–4.6 s for 1.4–2.9 s of audio (pre-encode overlaps recording) |
| Whole spoken turn | roughly 6–9 s listen+transcribe, ~1 s load, ~5 s generate, ~2 s speak |
Speed comes from 4-bit weights with int8 activations, a hand-written ESP32-S3
PIE SIMD kernel (dot_q4_pie.S), and a
matrix-vector worker on the second core.
The device has 8 MB of PSRAM and ~300 KB of usable internal SRAM, while STT alone wants 5.4 MB and the LLM 6.5 MB. They coexist by never running at the same time: two arenas are reserved at boot (7 MB PSRAM, ~145 KB internal, DMA-capable) and each phase takes the whole thing, then gives it back. Every transition logs free/largest/minimum-ever bytes, and an allocation failure is reported on screen rather than silently worked around.
powershell -ExecutionPolicy Bypass -File tools/idf.ps1 -p COM22 flash
tools/idf.ps1 wraps idf.py with the right environment. The app is 2.8 MB;
the WakeNet model is flashed into its own partition by the build.
The large assets — STT, TTS and the language models — live on the SD card:
python tools/sd_put.py --manifest
That uploads everything in the manifest over the serial console at ~700 KB/s,
CRC-checked. --only <name> does one model.
tools/serial_cmd.py drives the device's own console — the same paths the UI
uses, so a test is not a simulation:
python tools/serial_cmd.py "models" "model 13" "ask what is half of twelve"
Useful commands: models / model <n> (list, select), ask <question>,
say <text>, sttwav <path>, goplay <wav> <vol> (plays a question through
the speaker into the mic — a full acoustic loopback turn), wakemon on (log
the mic's peak level while WakeNet listens), bat, time, wifi <ssid> <pw>.
Two formats work:
model.bin + tok.bin
(+ optional name.txt). Converted from a Hugging Face GPT-Neo checkpoint./sd/models/. llama architecture, F32/F16/
Q8_0/Q4_0, SentencePiece. About 5.8 MB fits, so roughly 10M parameters at
4-bit; docs/GGUF.md has the fit rules, the conversion and
vocabulary-shrinking tools, and a table of models measured on this board.Both appear on the /model page; the choice is saved in NVS and shown in the header.
docs/MODELS.md covers how to pick one — the 5.8 MB
budget, why dim and ffn must be multiples of 32, why speed is simply
bandwidth ÷ model size, and why a storyteller can't answer questions — and how
the TinyTalk models are trained on an Apple M1 Max with PyTorch MPS.
The UI, the arenas and the language models all build and run on a PC, so most work needs no hardware:
powershell -ExecutionPolicy Bypass -File tools/hosttest.ps1 # arena, wrap, intent, LLM
host/build/gguf_run.exe model.gguf "Once upon a time" 30 # same C engine as the device
host/ui_preview.c renders the real UI code into PPM frames and reports
what percentage of the screen each update repainted — that is how the
"no full-screen redraws" rule is enforced.
components/
board/ FNK0104B: pins, LCD, touch, ES8311 + I2S, SD, battery
story_core/ arenas, memory/phase instrumentation
story_ui/ font + dirty-row text renderer (no framebuffer)
story_stt/ conformer port: SD tensor source, arena-backed heap
story_llm/ GPT-Neo Q4 engine, GGUF llama engine, SIMD kernels, tokenizers
story_tts/ SVOX Pico port with an arena workspace
main/ pipeline, UI, wake word, models, settings, clock, timers
host/ PC harnesses and tests
tools/ conversion, SD upload, serial console, host test runner
docs/ architecture, memory budget, GGUF, measured results
training/ model results and test-question sheets
wakemon on).Picked by Google's Open Source Programs Office for This Week in Open Source, 23 October 2026, and written up by Open Source For You, Electronics For You, Adafruit and a dozen others.
The full list, with a capture of each piece: docs/FEATURED.md, also rendered as the Featured tab on the site.
Engines: conformer STT (code Apache-2.0, weights CC-BY-4.0), SVOX Pico (Apache-2.0), cardputer-ai GPT-Neo engine (MIT), esp-sr (Espressif, ESP chips only). No GPL code is linked. Some model weights inherit non-commercial dataset terms — fine for a demo, check before shipping a product.
(C) iamankushpandit
Part of Ivy AI by iamankushpandit. Copyright © 2026 iamankushpandit, licensed GPL-3.0-or-later alongside the code — reuse of this document, in whole or in part, must keep this attribution and stay under the same licence. See NOTICE.md.