Kategori: Programming | Perkiraan waktu baca: 9 menit
Kebanyakan asisten AI yang kita pakai sehari-hari (Siri, Google Assistant, ChatGPT voice) butuh koneksi internet aktif untuk berfungsi. Saya penasaran: bisa nggak bikin asisten suara yang jalan sepenuhnya offline di desktop — nggak bergantung sama sekali ke cloud API? Dari situ lahir ARIA, proyek personal saya untuk asisten desktop offline.
Beda dari proyek WhatsApp Bot yang saya bahas sebelumnya (yang justru bergantung ke API cloud seperti Groq), ARIA didesain untuk jalan mandiri di komputer, tanpa kirim data ke server manapun.
Kenapa Offline?
Beberapa alasan saya pilih pendekatan ini:
- Privasi — nggak ada audio atau teks yang dikirim ke server pihak ketiga
- Nggak bergantung koneksi internet — tetap bisa dipakai meski internet mati
- Latency lebih predictable — nggak ada network round-trip yang bisa lambat tergantung kondisi jaringan
- Eksperimen teknis yang menarik — ini juga jadi kesempatan belajar soal speech recognition dan text-to-speech tanpa cloud API
Arsitektur ARIA
Kombinasi teknologi yang saya pakai:
- Electron — untuk UI desktop, karena familiar dan cross-platform
- Python (dijalankan sebagai backend process terpisah) — untuk logic pemrosesan AI
- Vosk — speech-to-text engine offline berbasis model bahasa yang di-download lokal
- pyttsx3 — text-to-speech offline
- Ollama — menjalankan LLM lokal di komputer sendiri (bukan API cloud), untuk memproses perintah dan menghasilkan respon
Wake Word Detection: "Hai Aria"
Salah satu tantangan pertama: aplikasi harus terus "mendengarkan" tapi cuma bereaksi kalau ada kata pemicu tertentu ("Hai Aria"), bukan memproses semua suara di sekitar sebagai command.
import vosk
import json
model = vosk.Model("model-en-small")
recognizer = vosk.KaldiRecognizer(model, 16000)
def listen_for_wake_word(audio_stream):
while True:
data = audio_stream.read(4000)
if recognizer.AcceptWaveform(data):
result = json.loads(recognizer.Result())
text = result.get('text', '').lower()
if 'hai aria' in text or 'hey aria' in text:
return True
Model Vosk yang saya pakai untuk wake word detection versi bahasa Inggris, karena lebih ringan dan akurat untuk deteksi kata pemicu pendek, sementara untuk perintah lanjutan saya implementasikan deteksi bilingual.
State Machine: Menjaga Aplikasi Tetap Predictable
Asisten suara yang baik butuh state yang jelas, supaya nggak bingung antara "sedang dengar wake word", "sedang proses command", atau "sedang bicara". Saya desain 4 state:
from enum import Enum
class AriaState(Enum):
IDLE = 'idle' # Menunggu wake word
GREETED = 'greeted' # Wake word terdeteksi, menunggu command
PROCESS = 'process' # Memproses command lewat LLM
SPEAKING = 'speaking' # Sedang mengucapkan respon
current_state = AriaState.IDLE
def transition_to(new_state):
global current_state
print(f"State berubah: {current_state.value} -> {new_state.value}")
current_state = new_state
Dengan state machine yang jelas ini, saya bisa mencegah bug seperti "aplikasi mencoba dengar command baru padahal masih lagi ngomong" — kesalahan yang cukup umum di implementasi voice assistant yang kurang terstruktur.
Memproses Command dengan LLM Lokal
Setelah command terdeteksi, saya kirim ke Ollama (LLM lokal) untuk diproses:
import requests
def process_command(text):
response = requests.post('http://localhost:11434/api/generate', json={
'model': 'llama3.2',
'prompt': f"User berkata: {text}\nBerikan respon singkat dan membantu.",
'stream': False
})
return response.json()['response']
Karena semua berjalan lokal (Ollama juga jalan di komputer yang sama), tidak ada data yang keluar dari device sama sekali.
Auto-Detect Bahasa (Bilingual)
Karena saya sehari-hari campur Bahasa Indonesia dan Inggris, saya tambahkan deteksi bahasa otomatis, supaya ARIA bisa merespon dengan bahasa yang sesuai dengan yang dipakai user:
def detect_language(text):
indonesian_markers = ['yang', 'dan', 'saya', 'kamu', 'bagaimana', 'apa']
words = text.lower().split()
id_count = sum(1 for word in words if word in indonesian_markers)
return 'id' if id_count > 0 else 'en'
Pendekatan ini masih sederhana (berbasis kata kunci, bukan model klasifikasi bahasa formal), tapi cukup efektif untuk kasus penggunaan sehari-hari.
Trade-off Menjalankan Semuanya Offline
Beberapa hal yang perlu saya terima sebagai konsekuensi pendekatan full-offline:
- Kualitas respons LLM lokal biasanya di bawah model cloud besar seperti GPT atau Claude, karena keterbatasan ukuran model yang bisa dijalankan di hardware biasa
- Kebutuhan resource lebih tinggi — menjalankan model speech recognition dan LLM sekaligus di background butuh RAM dan CPU yang lumayan
- Setup awal lebih ribet — user perlu download model-model ini dulu (bisa beberapa GB), beda dengan solusi cloud yang tinggal pakai
Penutup
ARIA masih proyek eksperimen personal, tapi prosesnya ngajarin saya banyak hal soal speech processing, state management untuk sistem real-time, dan trade-off antara privasi/kemandirian versus kualitas hasil. Kalau kamu tertarik bikin asisten suara sendiri, mulai dari wake word detection dan state machine yang jelas — itu fondasi yang paling penting sebelum masuk ke bagian AI-nya.
Kalau kamu butuh bantuan membangun aplikasi desktop dengan kebutuhan AI/voice processing, saya buka jasa untuk itu. Cek portofolio saya di april-portfolio-pearl.vercel.app atau hubungi lewat halaman Contact.
Tertarik coba bikin proyek serupa atau ada pertanyaan soal implementasinya? Tulis di komentar.

Tidak ada komentar:
Posting Komentar