PROJECT BUNAI Research & Engineering Dossier

AI Pocket Assistant
Offline “Jarvis Saku”

Perangkat asisten AI pribadi seukuran HT kecil / pager modern yang muat di saku kemeja — mengingat jadwal, mencatat, menjawab pertanyaan teknis, dan membantu troubleshooting, sepenuhnya offline dengan suara Bahasa Indonesia dan privasi data 100% lokal.

Offline 100% Voice Bahasa Indonesia Dual-Brain: ESP32-S3 + H618 LLM: Qwen2.5-1.5B ≤ 100×60×20 mm · ≤ 250 g

Disusun sebagai: Senior Embedded System Engineer · AI Engineer · Product Designer  |  Target tier: Seimbang (± Rp 1,5–2,5 jt/unit)  |  13 Juni 2026

0Ringkasan Eksekutif

Bunai adalah perangkat saku dengan dua otak: sebuah ESP32-S3 sebagai pengendali front-end yang selalu menyala (audio, layar, tombol, daya, RTC, wake-word) dan sebuah modul Linux H618 (Orange Pi Zero 2W) yang menjalankan AI sungguhan (LLM, STT, TTS, database memori) dan tidur saat tidak dipakai.

Keputusan arsitektur kunci. ESP32-S3 tidak mungkin menjalankan LLM 0.5B–1.5B sendiri — PSRAM-nya maksimal 8 MB, sedangkan Qwen2.5-0.5B (Q4) saja butuh ±400 MB RAM. Karena itu ESP32-S3 dipertahankan untuk peran yang memang bisa ia kerjakan dengan sangat hemat daya (wake-word, audio I/O, UI, manajemen daya), dan AI dipindahkan ke SoC Linux ber-RAM 4 GB. Ini desain "dual-brain" yang realistis dan tetap muat saku.

Otak AI
H618
4×Cortex-A53 1.5GHz · 4GB · Mali-G31 GPU
Front-end
ESP32-S3
Wake-word, audio, layar, daya, RTC
Model utama
Qwen2.5
1.5B Q4_K_M · ID kuat · ~3–5 tok/s
Standby
±2–3 hari
Baterai 4000 mAh · wake-word aktif

Tumpukan AI offline (semua lokal, tanpa internet)

🎙️ STT — whisper.cpp

Whisper tiny/base, multibahasa termasuk Indonesia. Vosk tidak dipakai karena belum ada model Bahasa Indonesia resmi.

🧠 LLM — llama.cpp

Qwen2.5-1.5B (utama) + 0.5B (mode cepat). Berjalan di CPU 4×A53; STT/embedding juga di CPU (H618 tanpa NPU).

🔊 TTS — Piper

Suara neural Bahasa Indonesia (id_ID), ringan & cepat, jalan penuh offline.

🗄️ Memori — SQLite + sqlite-vec

Database relasional + pencarian vektor untuk RAG memori pribadi, semua di microSD.

🗣️ Wake-word — ESP-SR

WakeNet "Hai Bunai" berjalan di ESP32-S3, sangat hemat daya, mengaktifkan modul AI.

🔐 Privasi

Tidak ada radio yang harus aktif. Data tidak pernah keluar perangkat. Opsi enkripsi disk.

Apa yang bisa dilakukan Bunai

  • Manajemen jadwal — "Besok jam 8 saya meeting dengan vendor." → tersimpan + pengingat otomatis.
  • Catatan cepat — "Ingatkan saya beli oli BMW E36." → masuk memori, muncul di briefing.
  • Tanya-jawab ringkas — "Berapa suhu operasi normal bearing pompa?" → jawaban singkat.
  • Problem solving teknis — "Vibrasi pompa naik 20%, penyebabnya?" → analisis + langkah cek.
  • Daily briefing — satu tombol: agenda hari ini, tugas tertunda, ringkasan.
  • Memori pribadi — nama keluarga, pekerjaan, proyek aktif, preferensi — diingat lokal.

1Konsep & Bentuk Fisik

Bentuk seperti HT (handy-talky) kecil / pager modern — tinggi, ramping, satu tangan, dengan klip saku kemeja. Tombol Push-To-Talk (PTT) besar di sisi sebagai aksi utama, layar OLED untuk konfirmasi visual, dan grille speaker + mic di depan.

Tampak Depan LED status BUNAI 3 agenda · 2 tugas ▌ Siap mendengarkan mic speaker OK Tampak Samping (20 mm) PTT Push-To-Talk Power / wake Vol ± / nav klip saku USB-C

Spesifikasi Fisik

ParameterTargetDesain Bunai
Dimensi (P×L×T)≤ 100×60×20 mm96 × 52 × 19 mm
Berat≤ 250 g± 165 g (dgn baterai)
LayarOLED / e-inkOLED 1.5" 128×128 mono (default) — opsi e-ink 2.13"
Input utamaPTT fisikPTT samping + wake-word "Hai Bunai"
KontrolOK, ▲▼, Power, Vol±, 2 soft-key
Audiomic + speakerMEMS mic I2S + speaker 8Ω 2W
Isi ulangUSB-CUSB-C 5V/2A, ± 2 jam penuh
Sarungsaku kemejaklip belt + lubang lanyard
Form-factor "tinggi-ramping" (seperti pager) dipilih agar muat saku kemeja & nyaman digenggam satu tangan, dengan PTT jatuh tepat di ibu jari.

2Arsitektur Dual-Brain

Dua prosesor dengan pembagian tugas tegas: Front-End Controller (ESP32-S3) selalu menyala & hemat daya; AI Compute Module (H618) kuat tapi hanya bangun saat dibutuhkan, lalu tidur lagi.

ESP32-S3 — always-on, low power H618 — AI, on-demand Sensor / I/O Daya
DOMAIN FRONT-END · selalu nyala ESP32-S3 N16R8 · 8MB PSRAM · Wi-Fi/BT off MEMS Mic I2SINMP441 Amp+SpeakerMAX98357A · 2W OLED 128×128SH1107 I2C Tombol+LEDPTT,nav,haptic RTC DS3231alarm & jam Fuel gaugeMAX17048 ESP-SR WakeNet — "Hai Bunai" deteksi wake-word lokal · ±40 mA Konsumsi domain idle: ± 45–70 mA UI, audio capture, alarm, kontrol daya JEMBATAN KOMUNIKASI USB-CDC 12 Mbps (audio Opus + JSON) + GPIO WAKE (interrupt) · UART debug audio + perintah ▶ ◀ teks layar + audio TTS DOMAIN AI · on-demand H618 (Orange Pi Zero 2W) 4×A53 1.5GHz · 4GB · Mali-G31 GPU whisper.cpp (STT) Piper (TTS) llama.cpp · Qwen2.5-1.5B / 0.5Bintent router + reasoning SQLite + vecmemori 5 kelas API server+ dashboard microSD 32GB — OS, model, database, log Aktif inferensi: ± 700–1100 mA (3.5–5 W) Suspend (idle): ± 8–15 mA Bangun via GPIO dari ESP32, tidur otomatis

Kenapa dipisah?

LLM butuh ratusan MB–GB RAM & CPU kuat → harus di Linux SoC. Wake-word + audio + UI butuh always-on hemat daya → cocok di ESP32-S3. Memisah keduanya = baterai awet dan AI berkualitas.

Pola hemat daya

H618 default suspend-to-RAM. ESP32 menahan jalur GPIO WAKE; saat PTT/wake-word, ESP32 menarik pin → H618 bangun <1.5 s, proses, lalu tidur lagi setelah timeout.

Alternatif tier

Hemat: Pi Zero 2W 512MB (cuma model 0.5B/360M). Performa: Orange Pi 3B / RK3588 (NPU, LLM ~20 tok/s) — lebih cepat tapi lebih besar & mahal. Bunai default = Orange Pi Zero 2W 4GB (mudah, murah, RAM lega).

3Diagram Blok Sistem

Aliran daya (ungu) dan data (sesuai bus) lengkap: dari USB-C/baterai ke regulator, lalu ke dua prosesor dan periferalnya.

Daya I2S audio I2C USB GPIO
JALUR DAYA USB-C IN5V / 2A PMIC + ChargerBQ25895 (1S, 3A)power-path Baterai LiPo 1S3.7V · 4000 mAh+ fuel gauge MAX17048 Buck 5V → H618 Buck 3.3V → ESP32 + I/O Power sequencingESP32 kontrol EN rail 5V(matikan H618 saat idle) ESP32-S3Front-End Controller H618AI Compute Module USB-CDC (audio+JSON) GPIO WAKE / READY PERIFERAL ESP32 MEMS MicINMP441 · I2S Amp+SpeakerMAX98357A · I2S OLED 128×128SH1107 · I2C RTC DS3231I2C · alarm Fuel gaugeMAX17048 · I2C Tombol+LED+HaptikGPIO · PTT,nav PERIFERAL H618 microSD 32GBOS+model+DB microSD (opsi)backup/expand Heat-spreadergrafit + frame Al Wi-Fi/BTDEFAULT OFF Catatan desain • ESP32 memegang semua I/O real-time (mic/speaker/layar/tombol) → H618 bebas fokus inferensi & bisa tidur total. • Semua I2C (OLED, RTC, fuel gauge) berbagi satu bus → hemat pin. Audio mic & speaker pakai 2 peripheral I2S terpisah. • ESP32 mengontrol EN regulator 5V H618 → bisa benar-benar memutus daya AI module saat baterai kritis (mode hemat ekstrem). • Radio Wi-Fi/BT kedua chip nonaktif default demi "Offline 100%" & privasi — hanya dipakai untuk update model via dock.

4Diagram Komunikasi

Urutan pesan satu siklus perintah suara, dari wake-word sampai jawaban diputar. Komunikasi memakai USB-CDC (audio Opus + JSON terbingkai) dan satu jalur GPIO WAKE.

👤 Pengguna ESP32-S3 H618 (AI) "Hai Bunai" / tekan PTT WakeNet ✓ GPIO WAKE ↑ (bangunkan) resume <1.5s {"t":"session_start"} {"t":"ready"} bicara: "Besok jam 8 meeting vendor" stream audio Opus 16kHz (frame) {"t":"audio_end"} (VAD) whisper → teks intent → "jadwal" LLM + simpan ke SQLite + set reminder RTC {"t":"display","text":"Tersimpan: meeting vendor 08:00"} stream audio TTS (Piper) 🔊 "Oke, meeting vendor besok jam 8 sudah dicatat." {"t":"idle"} → timeout 20s suspend (tidur)

Format frame

Tiap pesan: [0xAA][len:2][type:1][payload][crc:2]. type JSON untuk kontrol, biner untuk audio. Audio = Opus 16 kHz mono (~12–24 kbps) agar muat di USB-CDC dengan latensi rendah.

Keandalan

Heartbeat tiap 2 s; jika H618 tak balas → ESP32 tampilkan "AI sibuk/booting" dan retry. Semua aksi kritis (simpan jadwal) di-ACK; alarm tetap jalan di ESP32+RTC walau AI module mati.

5Daftar Komponen (BOM)

Tier Seimbang, semua komponen tersedia di Tokopedia/Shopee/AliExpress. Harga di bawah = referensi; harga ritel lokal aktual ≈ 3× — lihat daftar belanja & total trial di Bunai_Trial_Readiness.html.

#KomponenSpesifikasi / PartFungsiQtyHarga (Rp)
1AI Compute ModuleOrange Pi Zero 2W — H618, 4GB LPDDR4, 16MB SPI flashOtak AI (LLM/STT/TTS/DB)1410.000
2Front-End MCUESP32-S3-WROOM-1 N16R8 (16MB/8MB)Wake-word, audio, UI, daya175.000
3Layar OLED1.5" 128×128 mono, SH1107, I2CTampilan teks/status1110.000
4Mikrofon digitalINMP441 MEMS, I2STangkap suara128.000
5Amplifier audioMAX98357A, I2S klas-D 3.2WDriver speaker132.000
6Speaker mini8Ω 2W, Ø28mmOutput suara118.000
7RTCDS3231SN + baterai CR2032Jam/alarm presisi (always-on)122.000
8Fuel gaugeMAX17048, I2CPersen baterai akurat138.000
9PMIC / ChargerBQ25895 1S 3A, power-path, USB-C PDCharging + power-path165.000
10RegulatorBuck 5V/3A (H618) + 3.3V/1A (ESP32+I/O)Rail tegangan1 set45.000
11BateraiLiPo 1S 3.7V 4000mAh + proteksiSumber daya1115.000
12Konektor USB-CUSB-C 2.0 + proteksi ESD/TVSCharge + data + dock115.000
13TombolPTT samping + 5 tactile (OK/nav/power)Kontrol fisik1 set25.000
14HapticMotor LRA + driver DRV2605LGetar konfirmasi135.000
15LED statusWS2812B RGBIndikator (dengar/proses)18.000
16microSD + kartuSlot + SanDisk 32GB A2OS + model + DB (penyimpanan utama)155.000
17PCB4-layer, ENIG, ± 90×50mm (proto qty kecil)Papan utama1150.000
18Enclosure3D print resin/SLA + klip + tombolCasing saku190.000
19Pasif & konektorR/C/L, FFC, header, JSTPendukunglot60.000
20Mekanik/miscHeat-spreader grafit, sekrup, standoff, lanyardTermal & rakitlot30.000
TOTAL per unit prototipe (qty 1)± 1.426.000
Prototipe (qty 1–10)
Rp 1,43 jt
Harga eceran komponen + PCB proto
Batch kecil (qty 100)
± Rp 1,0 jt
PCBA panel, beli modul grosir
Produksi (qty 1.000)
± Rp 780 rb
SoM on-board, casing injection
Opsi hemat: Orange Pi Zero 2W 2GB (−Rp 120rb), BQ25895→IP5306 (−Rp 30rb), OLED 0.96" (−Rp 70rb) → ± Rp 1,1 jt. Opsi performa: Orange Pi 3B / RK3588 SoM (NPU) → +Rp 300rb–1jt, LLM 3–4× lebih cepat.

6Wiring Diagram

Peta koneksi pin ESP32-S3 ke seluruh periferal. Tiga bus utama: I2S (mic & speaker terpisah), I2C (shared: OLED, RTC, gauge, haptic), USB ke H618.

ESP32-S3 WROOM-1 N16R8 GPIO4/5/6 ─GPIO17 (SDA) ─GPIO18 (SCL) ─GPIO7/8/9/10 ─GPIO48 ─ ─ USB D+/D-─ GPIO21 WAKE→─ GPIO14 ←READY─ GPIO13 EN_5V─ GPIO1/2/15/16 INMP441 MicI2S0 · SCK/WS/SD MAX98357AI2S1 · BCLK/LRC/DIN OLED 0x3CI2C RTC DS3231 0x68I2C + INT alarm MAX17048 0x36I2C gauge DRV2605 0x5AI2C haptic H618USB-CDC + WAKE Buck 5V ENkontrol daya AI Tombol PTT/navGPIO pull-up WS2812 LEDGPIO48 Mic & speaker pakai 2 peripheral I2S terpisah · 4 device I2C berbagi 1 bus (SDA/SCL + pull-up 4.7kΩ)

Tabel Pin-Mapping ESP32-S3

SinyalPin ESP32-S3Terhubung keBusCatatan
Mic I2S — SCK / WS / SDGPIO4 / 5 / 6INMP441I2S0 (RX)L/R pin → GND (mono kiri)
Speaker I2S — BCLK / LRC / DINGPIO7 / 8 / 9MAX98357AI2S1 (TX)GPIO10 = SD/shutdown amp
I2C — SDA / SCLGPIO17 / 18OLED, RTC, gauge, hapticI2Cpull-up 4.7kΩ; 4 alamat berbeda
RTC alarm INTGPIO11DS3231 INT/SQWGPIOwake ESP32 saat alarm
USB dataGPIO19 / 20 (D-/D+)H618 USB OTGUSB-CDCaudio Opus + JSON
WAKE → AIGPIO21H618 wake pinGPIObangunkan dari suspend
READY ← AIGPIO14H618 GPIOGPIOsinyal AI siap
EN rail 5VGPIO13Buck 5V enableGPIOputus daya AI saat hemat ekstrem
Tombol PTT / OK / ▲ / ▼GPIO1 / 2 / 15 / 16Tactile switchGPIOinternal pull-up, aktif-LOW
Power / wake buttonGPIO0Tombol + PMICGPIOlong-press on/off
LED statusGPIO48WS2812BRMTwarna = state (dengar/proses/error)
Pin di atas mengikuti praktik aman ESP32-S3 (hindari GPIO strapping 0/3/45/46 untuk fungsi kritis saat boot). Sesuaikan dengan layout PCB final; pin USB native (19/20) wajib untuk USB-CDC kecepatan penuh.

7Estimasi Baterai

Baterai LiPo 1S 4000 mAh = 14,8 Wh. Kapasitas pakai efektif ± 3.400 mAh (85%, sudah memperhitungkan rugi konversi boost 5V untuk H618).

Standby (dengar wake-word)
± 45 jam
~1,9 hari · arus ± 75 mA
Pemakaian harian normal
± 2 hari
~40 perintah/hari + tidur malam
Pemakaian berat
± 1,2 hari
~120 perintah + layar sering
Mode hemat (PTT-only)
± 6–8 hari
wake-word off, AI module dimatikan

Anggaran arus per blok

KondisiESP32-S3H618Layar+AudioTotal arus (@3,7V)
Deep sleep (malam)~6 mA (light sleep)OFFoff± 12 mA
Idle — dengar "Hai Bunai"~45 mA (WakeNet)~12 mA (suspend)off± 75 mA
Aktif — STT+LLM+TTS~80 mA~800 mA (boost)~200 mA± 1.100 mA
Mode hemat — PTT idle~6 mAOFF (EN low)off± 12 mA

Anggaran energi harian (skenario normal)

Total ± 1.570 mAh/hari · dari 3.400 mAh pakai → ± 2,1 hari Idle listening 16h · 1.200 mAh Query 173 misc 100 sleep 96 ■ Idle wake-word (dominan) ■ 40 query aktif ■ layar/haptik/briefing ■ deep sleep malam Insight: konsumsi terbesar = mendengarkan wake-word terus-menerus. Mode hemat (PTT-only) memangkasnya → baterai ~1 minggu.

⚡ Pengisian

USB-C 5V/2A (10W). Dari 0→100% ± 2–2,5 jam (fase CC ~1,7 jam + CV). Mendukung pakai-sambil-charge (power-path BQ25895).

🔋 Strategi hemat otomatis

Baterai <20% → wake-word off, hanya PTT, kecerahan turun. <8% → matikan H618, ESP32 tetap simpan jadwal & alarm. Target: alarm jalan walau "AI mati".

8Estimasi Biaya Proyek

Selain BOM per-unit (§5), berikut biaya pengembangan (NRE) dari nol sampai produk siap jual.

FaseItem biayaRincianEstimasi (Rp)
Prototipe (P0–P1)3 unit dev (breadboard→PCB v1)3 × ± 1,8 jt + spare6.500.000
Alat & lisensisolder station, logic analyzer, dll3.000.000
Engineering (P2)Desain PCB + revisi (2–3 spin)fab + assembly + stencil5.000.000
Enclosure (3D print iterasi)resin SLA × beberapa versi2.000.000
Software/AI (P2–P3)Fine-tune/optimasi model + dataset IDkuantisasi, prompt, evalwaktu (in-house)
Tooling dashboard & OTAweb UI + updaterwaktu (in-house)
Pra-produksi (P4)Mold/jig + sertifikasi awalinjection mold sederhana25.000.000
Total NRE menuju produk (di luar gaji)± 41,5 juta
Harga jual saran (qty 1k)
Rp 1,8–2,2 jt
BOM ~950rb + margin + casing
Break-even unit
± 45–60 unit
menutup NRE prototipe (~41jt)
Posisi pasar
Niche teknis
teknisi, engineer lapangan, privacy-first
Angka pra-produksi (mold/sertifikasi) bisa ditunda — untuk batch awal pakai casing 3D-print/CNC sehingga modal turun ke ± Rp 16,5 jt. Sertifikasi (SDPPI untuk perangkat tanpa radio aktif relatif ringan) ditangani saat skala naik.

9Arsitektur Software

Dua tumpukan software paralel: firmware ESP32 (C/ESP-IDF, real-time) dan AI engine H618 (Linux + Python/C++).

FIRMWARE ESP32-S3 (ESP-IDF / C) Aplikasi UI · state machine (idle→dengar→tampil) WakeNet (ESP-SR)wake-word lokal Codec Opus/ADPCMkompres audio Driver I2Smic+spkr Driver I2COLED/RTC/gauge Power mgrsleep/EN rail Link layer — USB-CDC framing + GPIO WAKE AI ENGINE H618 (Linux) API Server (FastAPI/asyncio) + Dashboard web lokal Orchestrator · Intent Routerjadwal · catatan · QA · troubleshoot · briefing · memori whisper.cppSTT ID llama.cppQwen2.5 PiperTTS ID Memory ServiceSQLite + sqlite-vec + embed Scheduler/Remindercron + sinkron RTC ESP32 OS: Armbian/Debian · GPU Mali-G31 / threads CPU · suspend mgr USB-CDC Prinsip desain software Edge-first & offline. Tidak ada panggilan jaringan di jalur utama; semua model & data lokal di microSD. Intent router dulu, LLM belakangan. Perintah jelas (jadwal/catatan) ditangani aturan/regex cepat; LLM hanya untuk reasoning/QA → hemat daya & latensi. Function-calling. LLM mengeluarkan JSON aksi (mis. add_schedule) yang dieksekusi service, bukan sekadar teks. RAG memori. Pertanyaan personal → retrieval sqlite-vec → konteks ke LLM agar jawaban relevan dengan data pengguna. Degradasi anggun. Bila H618 mati (baterai), ESP32 tetap melayani jam, alarm, dan catatan teks sederhana.

10Struktur Folder

Monorepo: firmware ESP32, AI engine H618, dashboard, hardware, dan model.

# Monorepo Project Bunai
bunai/
├── firmware-esp32/          # ESP-IDF / PlatformIO (C)
│   ├── src/
│   │   ├── main.c           # state machine utama
│   │   ├── wakeword.c       # ESP-SR WakeNet "Hai Bunai"
│   │   ├── audio_io.c       # I2S mic + speaker
│   │   ├── codec.c          # Opus/ADPCM encode-decode
│   │   ├── display.c        # UI OLED (u8g2)
│   │   ├── buttons.c        # PTT, nav, debounce
│   │   ├── power.c          # sleep, fuel gauge, EN rail
│   │   ├── rtc.c            # DS3231 alarm
│   │   └── link.c           # protokol USB-CDC ke H618
│   ├── partitions.csv
│   └── platformio.ini
│
├── ai-engine/               # Linux H618 (Python + C++)
│   ├── server.py            # API lokal + dashboard host
│   ├── orchestrator.py      # alur: STT→intent→aksi→TTS
│   ├── intent.py            # router aturan + klasifikasi LLM
│   ├── llm.py               # wrapper llama.cpp (Qwen2.5)
│   ├── stt.py               # wrapper whisper.cpp
│   ├── tts.py               # wrapper Piper
│   ├── skills/
│   │   ├── schedule.py      # tambah/lihat/ubah jadwal
│   │   ├── notes.py         # catatan cepat
│   │   ├── briefing.py      # daily briefing
│   │   ├── qa.py            # tanya-jawab teknis
│   │   ├── troubleshoot.py  # analisis masalah
│   │   └── memory_recall.py # ingat info pribadi (RAG)
│   ├── memory/
│   │   ├── db.py            # akses SQLite
│   │   ├── vector.py        # sqlite-vec + embedding
│   │   └── schema.sql       # skema database
│   ├── prompts/
│   │   ├── system_id.txt    # persona Bunai (Bahasa Indonesia)
│   │   └── tools.json       # definisi function-calling
│   ├── config.yaml          # model, voice, daya, sensitivitas
│   └── requirements.txt
│
├── models/                  # aset AI (di microSD)
│   ├── qwen2.5-1.5b-q4_k_m.gguf
│   ├── qwen2.5-0.5b-q4_k_m.gguf
│   ├── whisper-base.bin
│   ├── piper-id_ID.onnx
│   └── embed-multilingual-e5-small.gguf
│
├── dashboard/               # web UI lokal (disajikan H618)
│   ├── index.html
│   ├── app.js
│   └── style.css
│
├── hardware/
│   ├── schematic/           # KiCad
│   ├── pcb/
│   ├── bom.csv
│   └── enclosure/           # STEP/STL casing
│
├── scripts/                 # flashing, OTA, konversi model
└── docs/                    # dossier ini, API, runbook

11API Lokal (ESP32 ↔ AI Engine)

Dua lapis: protokol serial terbingkai (jalur cepat ESP32↔H618) dan REST lokal (dipakai dashboard & dock; bisa diakses via USB-networking).

A. Pesan serial USB-CDC

ArahTipe pesanPayloadFungsi
ESP→AIwake{"src":"ptt"|"wakeword"}Mulai sesi, minta AI resume
AI→ESPready{"model":"qwen1.5b"}AI siap menerima audio
ESP→AIaudiobiner Opus 16kHz (frame 20ms)Stream suara pengguna
ESP→AIaudio_end{"ms":3200}VAD deteksi selesai bicara
AI→ESPpartial{"text":"besok jam 8..."}Transkrip sementara (tampil live)
AI→ESPdisplay{"text":"Tersimpan ✓","icon":"cal"}Teks/ikon untuk OLED
AI→ESPttsbiner audio (Opus/PCM)Stream jawaban suara
AI→ESPaction{"kind":"reminder_set","at":"..."}Sinkron alarm ke RTC ESP32
ESP→AIstatus{"batt":74,"chg":false}Lapor baterai (untuk briefing)
AI→ESPidle{"timeout":20}Sesi selesai → AI boleh suspend
ping/pongHeartbeat 2 dtk (deteksi hang)

B. REST API lokal (port 8080, host H618)

Method · EndpointFungsiDipakai oleh
POST /v1/voiceUpload audio → balas {transkrip, jawaban, audio}tes / dock
POST /v1/commandPerintah teks → balas jawaban + aksidashboard, debug
GET /v1/briefingDaily briefing (agenda, tugas, baterai)ESP32, dashboard
GET/POST /v1/schedulesCRUD jadwaldashboard
GET/POST /v1/notesCRUD catatandashboard
GET/POST /v1/memoryCRUD pengetahuan/kontak/proyekdashboard
GET /v1/analyticsStatistik penggunaan (untuk grafik)dashboard
GET/PUT /v1/settingsKonfigurasi model, voice, daya, personadashboard
POST /v1/model/switchGanti model aktif (0.5B↔1.5B)dashboard
GET /v1/healthStatus: model, RAM, suhu, uptimedashboard, dock
// Contoh respons POST /v1/command  {"text":"Vibrasi pompa naik 20%, kenapa?"}
{
  "intent": "troubleshoot",
  "answer": "Kemungkinan misalignment atau bearing aus. Cek: 1) alignment coupling, 2) kondisi bearing, 3) kekencangan baut pondasi.",
  "actions": [],
  "used_memory": ["pompa P-101 riwayat servis"],
  "latency_ms": 2140,
  "model": "qwen2.5-1.5b"
}

12Struktur Database

SQLite tunggal bunai.db + tabel virtual sqlite-vec untuk pencarian semantik. Lima domain memori + tabel sistem.

users id PKname, roleprefs JSONfamily JSON schedules id PK · user_id FKtitle, locationstart_at, end_atreminder_offsetstatus, created_at notes id PK · user_id FKcontent, categorydone, due_atcreated_at projects id PK · user_id FKname, statusdescriptionstarted_at contacts id PK · user_id FKname, relationphone, orgnotes tasks id PK · project_id FKtitle, due_atstatus, priority knowledge id PK · user_id FKtopic, contentsource, created_at knowledge_vec ⟂vec rowid → knowledge.idembedding[384]sqlite-vec · RAG conversations id PK · tsuser_text, ai_textintent, latency_ms remindersref→sched/note · fire_at settingskey · value analyticsts · event · payload 1 user → banyak entitas (FK user_id)

Skema SQL inti

-- 5 domain memori + sistem
CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT, role TEXT,
  family JSON, prefs JSON, created_at INT);

CREATE TABLE schedules(id INTEGER PRIMARY KEY, user_id INT, title TEXT,
  location TEXT, start_at INT, end_at INT, reminder_offset INT,
  status TEXT DEFAULT 'active', created_at INT);

CREATE TABLE notes(id INTEGER PRIMARY KEY, user_id INT, content TEXT,
  category TEXT, due_at INT, done INT DEFAULT 0, created_at INT);

CREATE TABLE projects(id INTEGER PRIMARY KEY, user_id INT, name TEXT,
  status TEXT, description TEXT, started_at INT);
CREATE TABLE tasks(id INTEGER PRIMARY KEY, project_id INT, title TEXT,
  due_at INT, status TEXT, priority INT);

CREATE TABLE contacts(id INTEGER PRIMARY KEY, user_id INT, name TEXT,
  relation TEXT, phone TEXT, org TEXT, notes TEXT);

CREATE TABLE knowledge(id INTEGER PRIMARY KEY, user_id INT, topic TEXT,
  content TEXT, source TEXT, created_at INT);

-- pencarian semantik (RAG) — embedding 384-dim (e5-small)
CREATE VIRTUAL TABLE knowledge_vec USING vec0(
  embedding FLOAT[384]);

CREATE TABLE reminders(id INTEGER PRIMARY KEY, ref_type TEXT, ref_id INT,
  fire_at INT, fired INT DEFAULT 0, channel TEXT);
CREATE TABLE conversations(id INTEGER PRIMARY KEY, ts INT, user_text TEXT,
  ai_text TEXT, intent TEXT, latency_ms INT, model TEXT);
CREATE TABLE settings(key TEXT PRIMARY KEY, value TEXT);
CREATE TABLE analytics(id INTEGER PRIMARY KEY, ts INT, event TEXT, payload JSON);

-- contoh retrieval RAG
SELECT k.topic, k.content FROM knowledge_vec v
  JOIN knowledge k ON k.id = v.rowid
  WHERE v.embedding MATCH :query_embedding ORDER BY distance LIMIT 3;

13Sistem Memori

Memori dibagi 5 domain, semua di SQLite lokal. Yang bersifat "pengetahuan bebas" juga di-embed ke sqlite-vec untuk pencarian semantik (RAG), sehingga Bunai bisa "mengingat" dan mengaitkan info pribadi.

1

📅 Jadwal

Meeting, agenda, deadline. Otomatis buat reminder yang disinkron ke RTC. Muncul di daily briefing.

2

📝 Catatan

To-do & catatan cepat ("beli oli BMW E36"). Kategori otomatis, bisa ditandai selesai.

3

📁 Proyek

Proyek aktif + tugas turunannya. Bunai paham konteks ("proyek pompa P-101").

4

👥 Kontak

Nama keluarga, rekan, vendor + relasi. Dipakai saat menjadwalkan ("meeting dengan vendor").

5

🧠 Pengetahuan Pribadi

Pekerjaan, preferensi, fakta teknis, spesifikasi alat. Di-embed → retrieval semantik untuk QA.

🔁 Alur RAG

Pertanyaan → embed → cari 3 memori terdekat (sqlite-vec) → suntik ke prompt LLM → jawaban kontekstual.

Jalur tulis (write)

Suara → STT → intent router. Jika "simpan" (jadwal/catatan/fakta) → ekstrak field via LLM function-call → INSERT ke tabel + (untuk pengetahuan) hitung embedding & simpan ke knowledge_vec.

Jalur baca (recall)

Pertanyaan personal → embedding query → MATCH sqlite-vec → ambil konten asli → konteks LLM. Pertanyaan terstruktur (jadwal hari ini) → query SQL langsung, tanpa LLM.

Semua data tidak pernah keluar perangkat. Opsi enkripsi SQLCipher + unlock PIN saat boot untuk perlindungan bila perangkat hilang.

14Perbandingan Model AI

Diuji untuk dijalankan di H618 (4×A53 @1.5GHz) via llama.cpp, kuantisasi Q4_K_M. Kecepatan = token/detik generasi (estimasi konservatif CPU; NPU RK3588 di kolom terpisah).

ModelParamRAM (Q4)Kecepatan H618 CPUKecepatan RK3588 NPUDaya aktifBahasa IndonesiaKualitas
SmolLM2-360M360M~300 MB~13–18 tok/s~45 tok/sTerendahLemah★★☆☆☆
Qwen2.5-0.5B0.5B~420 MB~7–10 tok/s~30 tok/sRendahCukup baik★★★☆☆
Gemma 3 1B1B~800 MB~4–6 tok/s~20 tok/sSedangBaik★★★★☆
Qwen2.5-1.5B ✓1.5B~1,1 GB~3–5 tok/s~18–25 tok/sSedang-tinggiSangat baik★★★★☆
Phi-3-mini3.8B~2,3 GB~1–2 tok/s~8–10 tok/sTinggiSedang (ID lemah)★★★★★

🏆 Pilihan utama: Qwen2.5-1.5B (Q4_K_M)

  • Bahasa Indonesia terkuat di kelas mungil ini — penting untuk voice command ID.
  • Kualitas reasoning cukup untuk QA teknis & troubleshooting singkat.
  • RAM ~1,1 GB → aman di H618 4 GB (sisa untuk STT/TTS/OS).
  • ~3–5 tok/s = jawaban pendek (20–40 token) selesai ± 6–12 detik → dapat diterima.

⚡ Pendamping: Qwen2.5-0.5B (mode cepat)

  • Untuk intent, catatan, jadwal, dan jawaban super-pendek → ~2× lebih cepat.
  • Otomatis dipakai saat baterai <30% atau mode "Cepat".
  • SmolLM2-360M opsional khusus klasifikasi intent (router) agar 1.5B hanya dipanggil saat perlu.
  • Phi-3 dihindari: terlalu berat & ID-nya lemah untuk perangkat saku.
Strategi 2-tier: SmolLM2/0.5B sebagai router cepat → 1.5B hanya untuk reasoning. Ini menjaga latensi rata-rata rendah & baterai awet. Untuk tier Performa (RK3588), 1.5B berjalan di NPU ~20 tok/s sehingga terasa instan.

15Karakter AI

Bunai = profesional, ramah, solutif, tidak kaku, singkat, fokus tindakan. Bukan chatbot bertele-tele — setiap jawaban mengarah ke langkah konkret.

System prompt (inti)

# prompts/system_id.txt
Kamu "Bunai", asisten saku pribadi berbahasa Indonesia.
GAYA:
- Jawab SINGKAT (1-3 kalimat), langsung ke inti.
- Profesional tapi ramah, tidak formal kaku.
- Selalu beri langkah/tindakan konkret bila relevan.
- Untuk masalah teknis: sebut kemungkinan penyebab +
  urutan pengecekan, jangan ceramah panjang.
- Jika perlu simpan data, panggil fungsi yang sesuai.
- Jika tidak tahu, katakan singkat & sarankan langkah cek.
KONTEKS: gunakan memori pengguna (jadwal, proyek,
catatan, pengetahuan) yang diberikan di bawah.

Contoh gaya jawaban

User
"Pompa vibrasinya naik 20%, kemungkinan penyebabnya apa?"
Bunai
"Kemungkinan misalignment atau bearing aus. Cek alignment coupling dulu, lalu kondisi bearing dan kekencangan baut pondasi."
User
"Besok jam 8 saya meeting dengan vendor."
Bunai
"Oke, meeting vendor besok 08:00 dicatat. Saya ingatkan 30 menit sebelumnya. ✓"

🎚️ Nada

Bisa diatur di dashboard: Ringkas / Normal / Hangat.

⏱️ Panjang

Batas token output (default 60) agar selalu padat.

🔧 Domain

Bias ke konteks teknik/maintenance bila diaktifkan.

🇮🇩 Bahasa

Indonesia utama; istilah teknis Inggris dibiarkan.

16Alur Percakapan & Intent

Setelah STT, intent router mengarahkan ke salah satu dari 6 skill. Perintah jelas pakai aturan cepat; sisanya pakai LLM.

Teks dari STT"besok jam 8 meeting vendor" Intent Routerregex cepat → fallback LLM klasifikasi 📅 Jadwaladd_schedule()+ set reminder 📝 Catatanadd_note()kategori auto ❓ Tanya-JawabLLM + RAGjawaban singkat 🔧 TroubleshootLLM analisis+ langkah cek 📊 Briefingquery SQLagenda+tugas 🧠 Memorirecall RAGinfo pribadi Susun jawaban → Piper TTS → OLED+ catat ke conversations/analytics Latensi target: perintah simpan <1,5s · QA/troubleshoot 4–9s · briefing <1s

Contoh dialog tiap kemampuan

📅 Jadwal
👤 "Besok jam 8 saya meeting dengan vendor."
🤖 "Oke, meeting vendor besok 08:00 dicatat. Diingatkan 30 menit sebelumnya."
📝 Catatan
👤 "Ingatkan saya beli oli BMW E36."
🤖 "Tercatat: beli oli BMW E36. Muncul di briefing besok."
❓ Tanya-Jawab
👤 "Berapa suhu operasi normal bearing pompa?"
🤖 "Umumnya 40–70°C; alarm bila >90°C. Pantau tren, bukan angka sesaat."
🔧 Troubleshoot
👤 "Vibrasi pompa naik 20%, kenapa?"
🤖 "Mungkin misalignment/bearing aus. Cek alignment coupling, bearing, lalu baut pondasi."
📊 Briefing
👤 [tekan tombol briefing]
🤖 "Hari ini 3 agenda, terdekat meeting vendor 08:00. 2 tugas belum selesai. Baterai 74%."
🧠 Memori
👤 "Proyek aktif saya apa saja?"
🤖 "Pompa P-101 (revisi alignment) dan retrofit panel listrik gudang B."

17Flowchart Interaksi Pengguna

Siklus operasional lengkap dari diam → aktivasi → proses → tidur, termasuk jalur hemat daya.

IDLE (dengar wake-word) Wake-word / PTT?trigger ya tidak→tetap idle Bangunkan H618 + LED nyala Rekam suara (VAD)tampil "Mendengarkan…" STT (whisper) → teks Jenis intent?router simpan SQL INSERT+reminder/RTC QA/troubleshoot RAG → LLMretrieval sqlite-vecQwen2.5 jawab Susun jawaban + TTSPiper → audio + OLED Putar suara + tampilkan teks Timeout 20s → H618 SUSPEND → IDLE kembali ke IDLE

18Roadmap Prototipe → Produk

Estimasi ± 7–9 bulan menuju produk MVP yang andal. Setiap fase punya gerbang keluar (exit gate) yang jelas.

P0P1P2P3P4P5 Riset & PoC2–3 mgg Prototipe fungsi4–6 mgg PCB v1 + casing6–8 mgg Optimasi4–6 mgg Pilot / DVT6–8 mgg Produksilanjut board OrangePi+ESP32uji LLM/STT/TTS ID breadboard,6 skill jalan PCB custom,3D-print saku daya, latensi,UX, OTA batch kecil,uji lapangan PCBA panel,sertifikasi ✓ model ID layak ✓ end-to-end voice ✓ muat saku & nyala ✓ ≥1,5 hari baterai ✓ andal 1 minggu ✓ siap jual Gerbang keluar tiap fase di atas — tidak lanjut sebelum kriteria terpenuhi.

P0–P1 · Buktikan dulu

Fokus: validasi bahwa Qwen2.5-1.5B + whisper + Piper berjalan layak di H618 dengan Bahasa Indonesia. Pakai dev board dulu, jangan buru-buru PCB.

P2–P3 · Bentuk & rapikan

PCB custom + casing saku, lalu kejar baterai & latensi. Tambah dashboard, OTA model, mode hemat. Iterasi enclosure 3D-print.

P4–P5 · Andalkan & jual

Uji lapangan (teknisi nyata), perbaiki reliabilitas, lalu naik skala produksi + sertifikasi. Casing injection mold saat volume cukup.

19Risiko & Mitigasi

RisikoDampakMitigasi
Latensi LLM terlalu lambat (CPU H618)TinggiRouter 2-tier (0.5B cepat → 1.5B saat perlu), cache jawaban umum, batas token output, opsi tier RK3588 (NPU)
Baterai boros (wake-word always-on)TinggiMode hemat PTT-only (~1 mgg), matikan H618 saat idle, gating wake-word saat di saku
Panas H618 di casing kecilSedangHeat-spreader grafit + frame Al, throttle, inferensi singkat lalu suspend, batasi durasi beban
Akurasi STT Indonesia + noise pabrikSedangwhisper-base (bukan tiny), PTT untuk audio bersih, AGC mic, prompt-bias istilah teknis
Kualitas jawaban model kecil terbatasSedangRAG memori, prompt domain teknik, jawaban template untuk pola umum, disclaimer "perlu verifikasi"
Ketersediaan/harga modul AIRendahOrange Pi Zero 2W murah & mudah dicari (Tokopedia/Shopee/AliExpress); alt: Pi Zero 2W (budget) atau Orange Pi 3B/RK3588 (performa)
Kehilangan perangkat = data sensitifSedangEnkripsi SQLCipher + PIN boot, backup terenkripsi ke microSD/dock
Kompleksitas dua-otak (sinkronisasi)RendahProtokol ACK + heartbeat, alarm fail-safe di ESP32+RTC tanpa bergantung AI module
Catatan teknis penting: jawaban Bunai untuk troubleshooting bersifat bantuan, bukan pengganti SOP/manual resmi. Untuk keputusan kritis keselamatan, tetap rujuk dokumen pabrikan & prosedur K3.

20Dashboard Setting & Analitik

Dibuat terpisah sebagai web UI lokal yang disajikan H618 (akses via dock USB / Wi-Fi sementara saat setup). File: Bunai_Dashboard.html — interaktif, bisa dibuka langsung di browser.

📊 Overview

Status baterai, suhu, model aktif, agenda hari ini, statistik cepat.

⚙️ Settings

Pilih model (0.5B/1.5B), suara TTS, sensitivitas wake-word, profil daya, nada persona, bahasa.

🧠 Memori

Kelola 5 domain: jadwal, catatan, proyek, kontak, pengetahuan — tambah/cari/hapus.

📈 Analitik

Grafik: perintah/hari, distribusi intent, latensi, tren baterai, topik teratas.

Lihat file Bunai_Dashboard.html yang menyertai dossier ini untuk versi interaktif lengkap dengan data contoh & grafik langsung.

Ringkasan Keputusan Desain

AspekKeputusan Bunai
ArsitekturDual-brain: ESP32-S3 (front-end) + H618 (AI), bukan ESP32 tunggal
Model AIQwen2.5-1.5B (utama) + 0.5B (cepat), router SmolLM2 opsional
Suarawhisper.cpp (STT ID) + Piper (TTS ID) — Vosk dihindari (tak ada model ID)
MemoriSQLite + sqlite-vec, 5 domain, RAG, enkripsi opsional
Daya4000mAh → ~2 hari normal, ~1 minggu mode hemat, USB-C ~2,5 jam
Bentuk96×52×19mm · ~165g · gaya pager/HT kecil, klip saku, PTT samping
Biaya~Rp 1,78jt proto · ~Rp 950rb @1000 unit
PrivasiOffline 100%, radio off default, data tak pernah keluar perangkat

Project Bunai · Dossier Desain Teknik v1.0 · 13 Juni 2026 · Disusun sebagai Embedded/AI Engineer & Product Designer