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