Lewati ke konten

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
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).

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).

  • 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.
  • 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.