Pesan dengan suara
Ikon mikrofon di sebelah kolom pencarian. Suara tidak pernah mengirim pesanan sendiri; hasilnya selalu ditinjau kasir.
sequenceDiagram participant K as Kasir participant P as POS F&B participant A as API participant W as Workers AI (Whisper) K->>P: Ketuk mikrofon, bicara (maks 20 detik) P->>P: Rekam (web: MediaRecorder, native: expo-audio) P->>A: POST /v1/menu/voice (audio, device token) A->>W: whisper-large-v3-turbo, bahasa id, prompt = nama menu W-->>A: transkrip A->>A: parseUtterance, cocokkan ke menu outlet A-->>P: transkrip + baris (matched / clarify / not_found / unavailable) P->>K: Layar tinjau K->>P: Pilih untuk clarify, ubah qty, hapus baris K->>P: Tambahkan ke pesanan
Layar tinjau
Section titled “Layar tinjau”| Status baris | Tampilan | Aksi |
|---|---|---|
matched |
Hijau: nama menu, qty, opsi, catatan | Ubah qty, hapus |
clarify |
Biru: daftar kandidat | Wajib dipilih sebelum lanjut |
unavailable |
Kuning: menu habis | Dilewati |
not_found |
Kuning: tidak ada di menu | Dilewati |
Tombol Tambahkan aktif hanya bila tidak ada baris clarify yang belum dipilih. Transkrip bisa diperbaiki lalu Proses ulang teks (memakai POST /v1/menu/parse, tanpa audio).
Parser kalimat
Section titled “Parser kalimat”parseUtterance (server, apps/api/src/lib/voice-order.ts) membaca:
- Jumlah: angka (
3) atau kata (dua,sebelas,dua belas); bawaan 1. - Pemisah: koma,
sama,dan,terus,lalu,plus. - Kata pengisi dibuang:
tolong,mau,porsi,gelas, dan sebagainya. - Catatan:
tanpa X,pakai X,extra X,dengan X. Bila cocok dengan nama opsi modifier, menjadi opsi; bila tidak, menjadi catatan baris.
Pencocokan menu (menu-matcher.ts) deterministik: nama utuh > alias > semua kata ada di nama > kemiripan. Dua kandidat dengan skor berdekatan menjadi clarify. Salah eja tidak ditebak (nasi gorang menjadi not_found).
Cadangan
Section titled “Cadangan”- Mikrofon ditolak atau browser tidak mendukung: pesan jelas, gunakan kolom ketik.
- Offline: suara butuh internet (transkripsi di server).
- Server melaporkan
VOICE_UNAVAILABLE(503): pakai input teks.
Batasan
Section titled “Batasan”- Audio maksimal 1 MB dan 20 detik; format webm/ogg/mp4/wav.
- Akurasi pada suara nyata (logat, bising) belum diukur. Uji awal memakai suara sintetis. Lihat panduan Testing untuk korpus evaluasi.