51 lines
2.6 KiB
Markdown
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).
|