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

2.6 KiB

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