Files
techieyann--frame-voice/docs/CONFIGURATION.md
T

10 KiB

Configuration and controls

Choose Configure… in the Desktop tray for the dark Frame Voice Configuration window with General, Transcription, and Controllers tabs. Save settings in the shared footer applies your changes and restarts dictation. In Transcription, choose Groq, Local Fast, or Local Balanced. Groq shows its API key and cleanup controls; local choices download and verify their models as needed, with the current backend retained if preparation fails. Your Groq API key is retained when switching to a local path. The Downloaded models section shows sizes and lets you delete unused downloads without uninstalling. Save another path first to unlock deletion of the active model; deletion requires confirmation. Selecting that model later downloads it again.

Save stays disabled until values differ from the saved configuration, and disables again after a successful save. Uninstall… at the bottom of General asks for confirmation. The dialog offers Keep current configuration and Keep downloaded models, both checked by default. Unchecking both removes the app's settings, API keys, downloaded models, app data, and installation backups. Legacy voice tools and their models are retained. On systems without libadwaita, the fallback dialog offers the same sections sequentially.

You can also edit ~/.config/frame-voice/env. Settings are literal KEY=VALUE, never shell commands. Restart frame-voice after changing them. Configuration and key files should be mode 600.

Backend

First-run setup offers three choices:

Choice Use What setup does
Groq — Cloud Fast online transcription Requests your Groq API key
Local — Fast Offline transcription, favoring speed Downloads and verifies base.en or multilingual base (~142 MiB)
Local — Balanced Offline transcription, more detail with more processing Downloads and verifies small.en or multilingual small (~466 MiB)

Local choices need no Groq key and work offline after the download. The Whisper engine is included. Existing verified models are reused. The key is saved only in your mode-600 config and is never printed. Updates preserve your current choice. Switch in the Transcription tab, or rerun the installer with --backend groq, --backend local-fast or --backend local-balanced. --groq-key-file PATH reads a key without placing it in command arguments. Local English presets select VOICE_LANG=en.

The searchable Language menu offers automatic detection and 99 named languages. English uses the .en local model; other languages and automatic detection use multilingual models. Set --language CODE during installation or VOICE_LANG in configuration (en, es, fr, ja, etc.; auto for detection). Groq omits its optional language parameter for automatic detection; whisper-cli receives -l auto. Cleanup is instructed to preserve the original language and script. Groq language parameters · Whisper model variants and checksums.

Non-ASCII transcripts use clipboard paste automatically in standalone apps with a known window class. Nested Desktop's classless target still cannot safely receive Unicode through keyboard injection; that path refuses Unicode instead of typing corrupted text. Spoken action aliases remain English; A/B and D-pad controls work independently of transcription language. Models for both variants appear separately in Downloaded models and can be deleted when unused.

Configuration loads from the compatible ~/.config/voice-prompt/env, then ~/.config/frame-voice/env, then process environment; later values win.

Controls

Tap a joystick cap, release, then touch it again and hold to record. Release ends recording. A plain hold does nothing. Click the stick during recording to cancel. The blue microphone grows during startup; the spinning gear indicates processing; the red crossed-out mic indicates cancellation or insufficient speech.

After successful dictation, A submits and B clears after the button is released; the left D-pad right/left provide submit/clear. These actions expire after ten seconds or a focus change. Unknown targets refuse clear rather than guessing. Speech commands match exact whole utterances: "submit", "send", "enter"; "scratch that", "clear", "undo"; and "cancel" or "never mind". Ordinary phrases remain text.

Common settings

Setting Default Purpose
VOICE_INJECT type type or clipboard paste
VOICE_PASTE_CHUNK 0 Maximum characters per paste; 0 disables splitting
VOICE_TRAILING space Separator after dictation (space or none)
VOICE_BEEP 1 Feedback tones
VOICE_NOTIFY 1 Headset badge and usage warnings
VOICE_CLEANUP 1 Optional Groq text cleanup
VOICE_SLASH 0 Optional interpretation of spoken "slash" as / during cleanup
GROQ_USAGE_NOTIFY 1 Groq usage/limit notifications; separate from microphone badges
VOICE_MAX 30 Maximum recording duration, seconds
VOICE_THRESHOLD 300 Minimum audio level
GROQ_ASR_MIN_LOGPROB -0.75 Minimum Groq segment decoding score (closer to zero is stronger)
GROQ_ASR_MAX_NO_SPEECH 0.6 Maximum Groq segment no-speech probability
VOICE_MIN_SPEECH_MS 200 Contiguous speech required before transcription
VRBTN_CLEAR_B_SPACE 1 Include the native space typed by right-hand B in Desktop Clear; disable for a customized B mapping
VRBTN_ARM_MS 150 Hold threshold, milliseconds
VRBTN_TAP_MS 250 Maximum first-tap duration, milliseconds
VRBTN_READY_MS 600 Interval allowed before the second touch
VRBTN_GROW_MS 180 Microphone growth after capture and speaker startup, milliseconds; at least hold threshold plus playback lead
VRBTN_BEEP_LEAD_MS 30 Playback lead time, milliseconds
VOICE_ACTION_WINDOW_MS 10000 Submit/clear activation window

Per-hand mappings: VRBTN_DICTATE_LEFT/RIGHT, VRBTN_SUBMIT_LEFT/RIGHT, VRBTN_CLEAR_LEFT/RIGHT. The tray offers valid button choices; changes regenerate the controller binding on service restart. More settings and validation are in src/config.rs and the installer-generated config template.

Groq prompt customization

Edit cleanup prompt… under Groq opens the built-in editor. Apply your draft, then use the shared Save settings button to write ~/.config/frame-voice/groq-prompt.txt. Reset to default restores the shipped text in the editor; canceling discards the editor draft. The shipped template is assets/groq-prompt.txt: neutral dictation cleanup, original-language preservation, and no invented content. It is loaded for each cleanup request, so edits apply to the next dictation. GROQ_PROMPT_FILE can override its location. An absent file uses the neutral embedded default.

Feedback keeps one PulseAudio-compatible speaker stream warm for the current dictation job, instead of opening a player per cue. It releases the stream when the job and final cue finish; the microphone is still gesture-controlled. The small activation badge waits for capture and speaker startup before growing. Its growth and start cue then share a clock, accounting for a cold first stream without adding a fixed delay to already-warm recordings. With tones disabled, only capture readiness is required. PAPLAY_BIN retains the external-player override/fallback behavior.

Silence detection combines an adaptive volume floor, cue-tone rejection, and WebRTC voice activity detection from SteamOS's existing libwebrtc-audio-processing-2 library. Voice and volume evidence must agree on the same audio for VOICE_MIN_SPEECH_MS; a cue followed by unrelated noise cannot satisfy the two checks independently. No extra speech model is downloaded. If the optional system library is unavailable, the portable volume/cue gate remains active. VRBTN_DEBUG=1 logs the gate decision and VAD result without transcripts. No ordinary phrase such as “Yeah,” “you,” or “Thank you” is blocked by text. Groq's detailed response provides avg_logprob and no_speech_prob. After the local gate, Frame Voice cancels if every returned segment has a decoding score below GROQ_ASR_MIN_LOGPROB or a no-speech probability above GROQ_ASR_MAX_NO_SPEECH. These are diagnostic scores, not calibrated accuracy percentages. Missing scores retain the local audio gate. Debug logging includes numeric scores and decisions, never transcript text.

Desktop clear counts the trailing separator too. For right-hand B with the default Steam layout, it also counts the space B itself types into Desktop. Other bindings and spoken Clear do not add that character. Set VRBTN_CLEAR_B_SPACE=0 if your custom Steam B mapping does not type a space. Its count belongs to the running daemon, so a service restart resets that history. Test clear using a fresh dictation after changing settings or restarting the service.

Spoken-slash conversion is an optional toggle and is off by default; personal preferences belong in user configuration. ASR hints are separate and remain empty by default (VOICE_PROMPT_TEXT). API keys, personalized prompt files, and model downloads are excluded from release packaging.

Troubleshooting

~/.local/bin/frame-voice --check
systemctl --user status frame-voice frame-voice-tray-session
journalctl --user -u frame-voice -n 50 --no-pager

--check validates configuration and compiled OpenVR support, not credentials, network access or headset health. Focus changes cancel pending results; text already delivered cannot be recalled. Silence makes no transcription request.

Version and updates

frame-voice --version and --build-info report the package version, source revision, dirty-source marker, and compiled OpenVR capability. Release metadata is trusted only when its source commit matches the binary. Unpackaged/local builds are shown as development versions.

Use General → Check for updates, or frame-voice --check-updates --json. Checks compare stable release versions; they neither select experimental releases nor downgrade newer versions. The GUI's Update action opens the transactional installer after settings are saved. ~/.local/share/frame-voice/update.sh --tui provides the terminal path. No background polling or automatic update is enabled.