ASR auto-submit
This commit is contained in:
parent
911e44fdd5
commit
d3d16e85c7
@ -28,6 +28,8 @@ asr: # Speech-to-Text (push-to-talk TUI). Model dikelola via moop tipe 'asr'.
|
|||||||
max_seconds : 60 # auto-stop pengaman
|
max_seconds : 60 # auto-stop pengaman
|
||||||
transcribe_timeout: 60 # detik timeout request ASR
|
transcribe_timeout: 60 # detik timeout request ASR
|
||||||
keep_recordings : true # false = hapus file setelah ditranskrip
|
keep_recordings : true # false = hapus file setelah ditranskrip
|
||||||
|
auto_submit : false # true = hasil transkrip langsung dikirim
|
||||||
|
# false = hanya mengisi form (Ctrl+Enter)
|
||||||
|
|
||||||
session: # Chat session
|
session: # Chat session
|
||||||
db_path: "~/.config/hendrik/sessions.json"
|
db_path: "~/.config/hendrik/sessions.json"
|
||||||
|
|||||||
@ -61,6 +61,10 @@ ASR_KEEP_RECORDINGS = _as_bool(_yaml_get("asr", "keep_recordings", default=True)
|
|||||||
# Tombol push-to-talk: "f1".."f12" atau "ctrl-<huruf>". Default F9.
|
# Tombol push-to-talk: "f1".."f12" atau "ctrl-<huruf>". Default F9.
|
||||||
ASR_RECORD_KEY = str(_yaml_get("asr", "record_key", default="f9")).strip().lower()
|
ASR_RECORD_KEY = str(_yaml_get("asr", "record_key", default="f9")).strip().lower()
|
||||||
|
|
||||||
|
# true = hasil transkripsi langsung dikirim sebagai pesan,
|
||||||
|
# false = hasil hanya disisipkan ke form input (user kirim sendiri via Ctrl+Enter).
|
||||||
|
ASR_AUTO_SUBMIT = _as_bool(_yaml_get("asr", "auto_submit", default=False), default=False)
|
||||||
|
|
||||||
|
|
||||||
XMPP_USERNAME = _yaml_get("xmpp", "username", default="")
|
XMPP_USERNAME = _yaml_get("xmpp", "username", default="")
|
||||||
XMPP_PASSWORD = _yaml_get("xmpp", "password", default="")
|
XMPP_PASSWORD = _yaml_get("xmpp", "password", default="")
|
||||||
|
|||||||
@ -2,9 +2,13 @@
|
|||||||
#
|
#
|
||||||
# Alur:
|
# Alur:
|
||||||
# * F9 (configurable) → mulai rekam (ffmpeg subprocess, non-blocking).
|
# * F9 (configurable) → mulai rekam (ffmpeg subprocess, non-blocking).
|
||||||
# * F9 lagi / Enter → stop rekam → transkrip (thread) → hasil DISISIPKAN
|
# * F9 lagi / Enter → stop rekam → transkrip (thread) → hasil
|
||||||
# ke form input pada posisi kursor, TIDAK submit.
|
# disisipkan ke form input pada posisi kursor,
|
||||||
|
# TIDAK submit (default).
|
||||||
# * Backspace / Esc → batal: rekaman dibuang / hasil transkrip diabaikan.
|
# * Backspace / Esc → batal: rekaman dibuang / hasil transkrip diabaikan.
|
||||||
|
# * config.asr.auto_submit: true → hasil transkrip langsung dikirim sebagai
|
||||||
|
# pesan (setara Ctrl+Enter). Jika form sudah terisi
|
||||||
|
# saat transkrip selesai, hasil tetap disisipkan.
|
||||||
#
|
#
|
||||||
# State disimpan di app:
|
# State disimpan di app:
|
||||||
# app.talk_recorder — instance Recorder saat merekam, else None
|
# app.talk_recorder — instance Recorder saat merekam, else None
|
||||||
@ -18,7 +22,7 @@ import threading
|
|||||||
import config
|
import config
|
||||||
from tools import asr as asr_mod
|
from tools import asr as asr_mod
|
||||||
|
|
||||||
from .agent import log
|
from .agent import log, submit
|
||||||
|
|
||||||
|
|
||||||
def _shortcut_label():
|
def _shortcut_label():
|
||||||
@ -209,7 +213,8 @@ def shutdown(app):
|
|||||||
|
|
||||||
|
|
||||||
def finish_talk(app, stdscr):
|
def finish_talk(app, stdscr):
|
||||||
"""Dipanggil main loop saat app.talk_done ter-set: sisipkan hasil."""
|
"""Dipanggil main loop saat app.talk_done ter-set: sisipkan hasil (atau
|
||||||
|
langsung submit bila config.asr.auto_submit aktif)."""
|
||||||
res = getattr(app, "_talk_result", None)
|
res = getattr(app, "_talk_result", None)
|
||||||
app._talk_result = None
|
app._talk_result = None
|
||||||
if getattr(app, "talk_cancelled", False):
|
if getattr(app, "talk_cancelled", False):
|
||||||
@ -222,6 +227,27 @@ def finish_talk(app, stdscr):
|
|||||||
if not text:
|
if not text:
|
||||||
log(app, "system", " Tidak ada ucapan terdeteksi.")
|
log(app, "system", " Tidak ada ucapan terdeteksi.")
|
||||||
return
|
return
|
||||||
|
if config.ASR_AUTO_SUBMIT:
|
||||||
|
# Auto-submit: taruh teks di buffer lalu kirim (submit() yang
|
||||||
|
# membersihkan buffer). Jika user sudah mengetik sesuatu sebelum
|
||||||
|
# transkrip selesai, teks tidak ditimpa — disisipkan saja.
|
||||||
|
if not "\n".join(app.input_buffer).strip():
|
||||||
|
app.input_buffer = text.split("\n")
|
||||||
|
app.input_line = len(app.input_buffer) - 1
|
||||||
|
app.input_col = len(app.input_buffer[-1])
|
||||||
|
submit(app, stdscr)
|
||||||
|
log(app, "system",
|
||||||
|
f" \u266a [{res.get('provider', '?')} / {res.get('model', '?')}] "
|
||||||
|
"teks otomatis dikirim")
|
||||||
|
else:
|
||||||
|
insert_text(app, text)
|
||||||
|
log(app, "system",
|
||||||
|
f" \u266a [{res.get('provider', '?')} / {res.get('model', '?')}] "
|
||||||
|
"form sedang terisi \u2014 hasil disisipkan, tidak auto-submit "
|
||||||
|
"(Ctrl+Enter untuk kirim)")
|
||||||
|
if app.scroll_follow:
|
||||||
|
app.scroll = 999999
|
||||||
|
return
|
||||||
if insert_text(app, text):
|
if insert_text(app, text):
|
||||||
log(app, "system",
|
log(app, "system",
|
||||||
f" \u266a [{res.get('provider', '?')} / {res.get('model', '?')}] "
|
f" \u266a [{res.get('provider', '?')} / {res.get('model', '?')}] "
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user