hendrik/plan/asr-push-to-talk.md
2026-10-06 16:29:31 +07:00

51 lines
2.6 KiB
Markdown

# Fitur ASR / Push-to-Talk (TUI)
Menambahkan jenis model `asr` ke moop dan fitur push-to-talk di TUI:
tekan tombol → bicara → stop → teks hasil transkripsi masuk ke form input
(tidak auto-submit).
## moop
- `MODEL_TYPES` += `asr` (self-healing: `INSERT OR IGNORE` saat init, DB lama aman).
- `asr_endpoint()` helper ditambahkan.
- TUI: tipe 'asr' muncul di Model > Select Model (label "Speech Transcription")
dan di Manage Sets (add type / set default).
## Konfigurasi (config.yaml, blok `asr:`)
asr:
record_dir : "~/.config/hendrik/recordings" # lokasi file rekaman
record_key : f9 # f1..f12 / ctrl-<huruf>
record_backend : pulse # pulse | alsa | oss | windows (dshow)
device : default
windows_mic : "" # backend=windows: nama device dshow
format : wav # wav | ogg(libopus)
sample_rate : 16000
channels : 1
max_seconds : 60 # auto-stop pengaman
transcribe_timeout: 60
keep_recordings : true
## Alur push-to-talk (interfaces/tui/talk.py)
- `F9` mulai rekam (ffmpeg subprocess, non-blocking). Status bar: `● REC` (merah blink).
- `F9` lagi ATAU `Enter` → stop → transkrip (thread) → hasil disisipkan ke form
di posisi kursor. Status bar: `TRANSCRIBE`. `Enter` TIDAK submit; submit `Ctrl+Enter`.
- `Backspace`/`Esc` → batal (rekaman dibuang / transkrip diabaikan, incl. race saat
hasil sudah menunggu).
- `Ctrl+C` tetap exit kapan pun; saat exit, rekaman aktif otomatis dibersihkan.
- ffmpeg mencapai `max_seconds` → auto stop+transkrip.
- Validasi: `asr` model set belum diset → pesan panduan; device bisu (peak RMS
dari wav di bawah ambang) → "Rekaman kosong", transkrip dilewati.
## Transkripsi (tools/asr.py)
- `POST {base_url}/audio/transcriptions` multipart (file + model), gaya OpenAI.
- Memakai seluruh chain moop `asr` (rotasi model/provider ikut priority), pola
sama dengan tools/imagegen.py. HTTP 200 + text kosong = valid ("no speech").
- Provider/Model dicontohkan: OpenRouter `qwen/qwen3-asr-1.7b`
(modality `audio->transcription`; endpoint `/audio/transcriptions` dikonfirmasi
hidup; teruji HTTP 200 dengan usage.seconds dari tone 2 detik).
## Catatan WSL2
- Output audio WSLg (sink) bekerja; input mic (RDPSource) TIDAK tersambung pada
WSL 3.0.1/WSLg 1.0.79 (handshake RDP hanya accept `rdpsnd`, tanpa kanal audio-in;
source RDPSource SUSPENDED, rekam hang). Jalur cadangan yang disiapkan:
`record_backend: windows` (ffmpeg.exe + dshow via interop, simpan ke /mnt/c).