Releases: MHJoy99/joyvoice
Release list
JoyVoice v2.4.0 - Logging and diagnostics overhaul
JoyVoice v2.4.0 — Logging & Diagnostics Overhaul
Observability-only release. No dictation behavior changes. No action required to upgrade.
This release makes JoyVoice easier to troubleshoot and support: bounded rotating logs with secrets redacted, end-to-end tracing for every dictation, a tabbed Diagnostics viewer with one-click export, and usage telemetry that joins directly to log lines.
- Tag:
v2.4.0- Scope: 8 commits on
mastersince the v2.3.9 closeout — rotating redacted logging,job_idpipeline tracing, structured crash reports + diagnostics export bundle, and usage-telemetry join keys- Dictation pipeline (mic → ASR → translation/style → paste) is unchanged
What changed
1. Rotating, redacted logging
- The main log now rotates automatically: 5 MB per file, 5 backups kept (UTF-8). Unbounded growth is gone — the oldest backup is discarded.
- Every line carries correlation fields —
[job=<id> phase=<phase> sess=<session>]— so one dictation can be followed end to end. - Secrets are scrubbed before they ever hit disk or console: API keys,
Bearertokens,sk-...keys, passwords, and query-string secrets become[REDACTED]. - Transcripts appear as 80-character previews only. Raw audio bytes are never logged.
- Optional single-line JSON log mode for tooling (see knobs below).
- Startup banner logs Python / app version, resolved paths, sanitized settings (key redacted), engine mode, and audio/text models.
2. job_id pipeline tracing (recording → ASR → LLM → paste)
-
Each press of the hotkey mints one
job_idand reuses it unchanged through recording → ASR → optional LLM rewrite → paste → completion. -
Phases:
recording→transcribing→pasting→idle. Stale worker results (e.g. after Cancel/Esc) are logged and ignored. -
To follow one dictation, filter the log by its job number, e.g. in PowerShell:
Select-String "job=7" "$env:APPDATA\JoyVoice\joyvoice.log"
-
Health watchdog lines (widget visibility, hotkey health) stay quiet at
DEBUGwhen healthy and escalate toWARNINGonly when action was taken.
3. Structured crash reports + diagnostics viewer + export bundle
-
Crashes now write a capped (8 KB traceback), dual-format block: human-readable + structured JSON with timestamp, kind, session id, version, exception type, and message. One session id ties all crashes from a single run together.
-
Diagnostics dialog (tray / widget → Diagnostics…) is now tabbed:
- Health — legacy device/connection checks
- Logs — last 200 lines, copyable
- Usage & System — event counts, paths, version
-
One-click Export bundle (.zip) from the dialog, or headless via:
python tools\collect_logs.py --output joyvoice-diagnostics.zip --tail 200The bundle contains:
joyvoice.log(+ rotatedjoyvoice.log.*siblings),usage.jsonl(if present),settings-sanitized.json(secrets redacted — never raw),system_info.json,usage_summary.json,version.txt, andlog_tail_200.txt. Missing files never fail the bundle.
4. Usage-telemetry join keys (usage.jsonl)
- Every telemetry row now carries timestamp (UTC ISO-8601) and session id — plus
job_idfor pipeline rows — matching the same keys in log lines so a usage event joins directly to its log trace. - Canonical event kinds for new rows:
asr|llm|paste|pipeline. Legacy rows (audio→asr,text_rewrite→llm) are still accepted on write and grouped correctly on read. - Retention keeps the file bounded (default: 30 days / 5000 newest events, atomic rewrite, corrupt lines dropped). Telemetry never raises into the dictation path.
Upgrade notes — no action needed
- Drop-in update. Install / replace as usual — existing
%APPDATA%\JoyVoice\settings.json,history.json, and portable-modedata\folders are preserved. - No settings migration. No new required keys, no renamed keys, no model re-download.
- No new dependencies for normal use. Same Python 3.11 runtime, same cloud + free/offline engines.
- No behavior change to hotkeys, recording, transcription, translation, text styles, paste, call muting, or UI layout.
- Log format change only: if you parse
joyvoice.logwith external tools, expect the new[job=… phase=… sess=…]prefix and rotation siblings (joyvoice.log.1, …). SetJV_LOG_JSON=1if you prefer single-line JSON.
Where logs live
| File | Normal install | Portable mode (portable.txt next to the app) |
|---|---|---|
| Main log | %APPDATA%\JoyVoice\joyvoice.log (+ joyvoice.log.1 … rotation siblings) |
<app folder>\data\joyvoice.log |
| Usage telemetry | %APPDATA%\JoyVoice\usage.jsonl |
<app folder>\data\usage.jsonl |
| Settings / history | %APPDATA%\JoyVoice\settings.json, history.json |
<app folder>\data\ |
Quickest way to open: paste %APPDATA%\JoyVoice into Explorer's address bar, or open Diagnostics… → Logs tab inside the app.
Diagnostics how-to (for a bug report)
Option A — inside the app (recommended):
- Right-click the floating widget (or tray icon) → Diagnostics….
- Check the Logs and Usage & System tabs.
- Click Export bundle (.zip) → save the file.
- Attach the
.zipto your GitHub issue. Settings inside are already sanitized (API key redacted).
Option B — command line (headless, same contents):
python tools\collect_logs.py --output joyvoice-diagnostics.zip --tail 200This prints the bundle path and its contents, e.g. joyvoice.log, usage.jsonl, settings-sanitized.json, system_info.json, usage_summary.json, version.txt, log_tail_200.txt.
When reporting a failed dictation, include the job=<id> lines for that attempt:
Select-String "job=7" "$env:APPDATA\JoyVoice\joyvoice.log"Log knobs (environment variables, all optional)
| Variable | Default | Effect |
|---|---|---|
JV_LOG_JSON |
off | Set to 1 (also true / yes / on) for single-line JSON log lines instead of human-readable text. |
JV_LOG_LEVEL |
INFO |
Global level, or per-module overrides (comma/semicolon separated). Examples: DEBUG, INFO,joyvoice.gemini_audio=DEBUG, WARNING;joyvoice.main=DEBUG. |
JV_SESSION_ID |
auto (random per run) | Override the 8-character session id used in [sess=…] correlation. Advanced / testing use only. |
Set them before launch, e.g. in PowerShell:
$env:JV_LOG_JSON = "1"
$env:JV_LOG_LEVEL = "INFO,joyvoice.gemini_audio=DEBUG"
.\run.batPrivacy
- API keys, Bearer tokens,
sk-...keys, passwords, and auth tokens are redacted in both the log file and the export bundle. - The bundle embeds
settings-sanitized.jsononly — never rawsettings.json. - Logs record sizes, durations, latencies, model names, and short transcript previews — never raw audio bytes or full dictation text.
- Review the
.zipbefore uploading if your dictation contains sensitive spoken content (the 80-character preview may quote it). - Never paste your API key into an issue. The bundle already redacts it — keep it that way when quoting log lines.
Links
- Issues (attach the export
.zip+job=<id>lines): https://github.com/MHJoy99/joyvoice/issues - Releases: https://github.com/MHJoy99/joyvoice/releases
- This release: https://github.com/MHJoy99/joyvoice/releases/tag/v2.4.0
JoyVoice v2.3.9 - Fast Native Audio Gateway
JoyVoice v2.3.9
Fast, reliable native audio transcription and translation for Windows.
Highlights
- Native Gemini audio through the verified
joyvoice-fast-audiogateway route. - Mono 16-bit PCM WAV at 16 kHz is sent as OpenAI-compatible
input_audio. - Exact structured output:
transcript,translation, andtarget_override. - 180-second request timeout for longer recordings, with no automatic retry after timeout.
- Google Web Speech fallback remains available when native audio cannot complete.
- Existing text-only chat, offline mode, clipboard-safe paste, language detection, and floating widget behavior remain supported.
Download
Download JoyVoice.exe below and follow the setup guide.
For native audio, set JV_NATIVE_AUDIO=true and configure JV_API_KEY as an environment variable. Never place an API key in source code or commit it to GitHub.
Verification
- 41 focused cloud-pipeline tests passed.
- Exact tag build completed with the authoritative PyInstaller spec.
- Release asset is the Windows executable built from tag
v2.3.9.
JoyVoice v2.3.8 - Reliable ASR and Fidelity Prompts
JoyVoice v2.3.8 makes Google Web Speech the reliable default ASR path and keeps Gemini 3.6 Flash for faithful text translation and style formatting. Translation and AI-prompt contracts now preserve facts, constraints, names, numbers, technical terms, qualifiers, and uncertainty without unintended summarization or invention. Long AI prompts remain cohesive up to 4000 characters, while transcript salvage protects spoken content if translation fails. Verified with 36 automated tests and a live Bengali dictation workflow. The Windows executable is not Authenticode-signed, so Windows may display a publisher warning.
JoyVoice v2.3.2 - Long-Audio Reliability and Release Workflow
JoyVoice v2.3.2 consolidates the long-audio reliability fixes, native-audio default restoration with opt-out, transcript preservation when translation fails, call-mute hotkey and click-safe toast fixes, synchronized release metadata, and the guarded fix-to-public-release workflow. Built from the exact v2.3.2 tag. Asset SHA-256: 93eb73d770f9252db41488b185e304bae4a310e6468c85b7c4f361f5dddfdc09
JoyVoice v2.3.1 — Call-Mute Fixes & Single EXE
JoyVoice v2.3.1 — Call-Mute Fixes & Single EXE
What's new
- Mute-other-apps overhaul — the Audio settings tab now has a mode selector:
- Hotkey — sends the mute key to detected call apps (Discord/Teams: Ctrl+Shift+M, Zoom: Alt+A). The settings explain that the keybind must be set inside the app (e.g. Discord → Settings → Keybinds → Toggle Mute) or it will not mute.
- Virtual device (most reliable) — mutes a VB-Cable/VoiceMeeter capture endpoint; a new device dropdown auto-detects them.
- Failure feedback — you get a toast when nothing was muted (no call app detected, no virtual device, keyboard unavailable) instead of silent failure.
- Single EXE — one
JoyVoice.exedoes BOTH cloud mode and free/offline mode (offline libraries bundled). No more choosing between two downloads.
Download
JoyVoice.exe — the only build you need (~173 MB, does both Cloud and Free & Offline).
Install
- Download JoyVoice.exe and run it.
- Free: Settings → Free Mode → Free & Offline → Set up Free Mode → Test → press F8.
- Cloud: Settings → API → paste your API key → Test connection → press F8.
- Mute others (optional): Settings → Audio → Mute other apps → choose Hotkey or Virtual device.
Good to know
- Free Mode needs internet once to download the model, then runs offline.
- Free Mode offline translation targets English; other target languages are transcription-only for now.
- AI text styles require Cloud mode.
SHA-256
01910914c600bc0d8044c7ed44b4622e8c7a87dcd47842bb640e39d6490c8d65 JoyVoice.exe
Full details: CHANGELOG.md
JoyVoice v2.3.0 — Free & Offline Mode
JoyVoice v2.3.0 — Free & Offline Mode
JoyVoice can now run totally free and offline — no API key, no cloud — using a small local Whisper model. Press F8, speak, and clean text is pasted into any app.
What's new
- Free & Offline Mode — new Settings → Free Mode tab with an engine switch:
- Cloud (uses your API key, best quality) — the default, unchanged.
- Free & Offline (local models, no API key needed).
- Local speech-to-text via faster-whisper. The model auto-downloads once (needs internet the first time; about 460 MB for Small), then works fully offline. Choices: Tiny / Base / Small (recommended); Auto (GPU if available) / CPU only.
- Built-in offline Bangla → English translation (Whisper translate) — no extra model.
- One-click "Set up Free Mode" and "Test" buttons with live status.
Two builds
| Build | File | What it is |
|---|---|---|
| Free (recommended) | JoyVoice-Free.exe |
Bundles the offline libraries — fully-free dictation with no API key. |
| Cloud (slim) | JoyVoice.exe |
Smaller cloud build — needs an API key in Settings → API. |
Install (Free)
- Download JoyVoice-Free.exe and run it.
- Open Settings → Free Mode, choose Free & Offline, click Set up Free Mode (downloads the model once).
- Click Test to confirm, then press F8 to dictate.
Good to know
- Free Mode needs internet once to download the model, then runs offline.
- Offline translation currently targets English; other target languages produce transcription only in Free Mode for now.
- AI text styles (Prompt for AI / Professional / Facebook) require Cloud mode.
- Multilingual offline translation (NLLB) and offline AI styles (Ollama) are the planned next step.
SHA-256
d0c994a9f3831e154aca24fd4b697b699eba1f7a92e9ca4a7df92997e5299e17 JoyVoice-Free.exe
73e1bbf030c3b92f79345da1d46991410589c98cff6b74d630fd7651009f7c5a JoyVoice.exe
Full details: CHANGELOG.md
JoyVoice v2.2.0 — Configurable API & Model Selection
JoyVoice v2.2.0 — Configurable API & Model Selection
Press F8, speak in any of 10 languages, and clean translated text is pasted into whatever app has focus. This release makes the cloud backend fully configurable from the UI.
What's new
- New Settings → API tab — configure everything from the UI, no environment variables required:
- API base URL — any OpenAI-compatible endpoint ending in
/v1(e.g.https://gpt.bdx.market/v1,https://api.openai.com/v1). - API key — masked field with a Show toggle, stored locally. Blank falls back to the
JV_API_KEYenv var. - Audio model & Text model — editable dropdowns (default
gemini-3.6-flash). - Fetch models — pulls the live model list from your endpoint into the dropdowns.
- Test connection — verifies the endpoint + key and reports available models.
- API base URL — any OpenAI-compatible endpoint ending in
- Config resolution precedence:
settings.json→ environment variable → built-in default. Applied at startup and live on save. - Removed the old General-tab "Check API" button (superseded by the API tab).
Install
- Download JoyVoice.exe below and run it.
- Open Settings → API, paste your API key, pick your models, and click Test connection.
- Press F8 to dictate.
SHA-256
a9d737068e9b1d4099112a06d2b79e26f1ba24de5b8dcb09743a1de1979db971 JoyVoice.exe
Full details: CHANGELOG.md
v2.1.1 — AI Text Styles Fix & Pure Cloud Pipeline
v2.1.1 — AI Text Styles Execution Fix (2026-07-26)
Bug fix release connecting cloud LLM text rewriting to the main execution flow.
AI Text Styles Execution
- Fixed uninvoked AI styles: Wired
_run_llm()intoAppController._on_asr_done()whentext_styleis set toprompt_for_ai,professional_message, orfacebook_post. - Live preview update: Connected widget preview update (
set_preview) upon completion ofCloudLLMWorker. - Latency logging safety: Added
llm_t0timestamp recording in_run_llmand safet.get("llm_s", 0.0)dictionary lookup for non-LLM pipeline runs.
JoyVoice v2.1.0 — Spoken override, cancel, ending cleanup, usage logs
🎉 JoyVoice v2.1.0
Floating cloud dictation for Windows — speak any of 10 languages, get a clean translation pasted into whatever app has focus.
Production model: gemini-3.1-flash-lite via BDX.market
Platform: Windows 10/11 · Python 3.11 cloud path (no local Whisper/GPU required for the EXE)
⬇️ Download
| Asset | Description |
|---|---|
| JoyVoice-v2.1.0.zip | Windows portable EXE (~129 MB) |
| JoyVoice-v2.1.0.zip.sha256 | SHA-256 checksum |
SHA-256: 3782fd18a9796bac25287e8e5da8be5ef0144e571f5035e906dd64d4fa0a638e
Install
- Download + unzip
- Set env var
JV_API_KEYto your BDX.market API key (setx JV_API_KEY "…") - Run
JoyVoice.exe - Press F8 and speak
✨ What's new in 2.1.0
Spoken one-shot target override
End an utterance with a language command to force this paste only into that language (settings stay unchanged):
paste this in Russian/Give me the Russianin Bengali please/বাংলায় দাও- trailing cue:
Russian·Japanese·Hindi - phonetic BN:
রাশিয়ান-এ ট্রান্সলেট…
Implementation:
- Gemini JSON
target_override+ local detector - Dual detect on source and English translation
- Always force a dedicated retranslate when override is set (fixes EN-paste-with-override-detected)
- Command phrase stripped from paste body
- Toast:
Override → RU
Cancel (no more forced transcription)
- Esc or widget right-click Cancel
- Recording → discard audio, no API call
- Transcribing → invalidate job, never paste / never history
- Accidental F8 tap < 0.35s treated as cancel
- F8 remains start / stop-and-process only
Ending cleanup
- Prefer cutting dangling open lines over inventing missing words
- Strip trailing
.../……and soft polite filler tails - Drop incomplete final clauses; keep the last complete sentence
- Higher token budgets (audio 1600 / rewrite 1200) to avoid mid-sentence CJK cuts
Usage telemetry
- Append-only
%APPDATA%\JoyVoice\usage.jsonl - Per-request: model, latency, prompt/completion/total tokens (when gateway returns
usage) - End-to-end pipeline rows (
asr_s,llm_s, total) - Never raises into the dictation path
🔒 Security
- API key only from env
JV_API_KEY— never hardcoded - No secrets, tokens, or credentials in source or release assets
📦 Included in this release
JoyVoice.exe(onefile, windowed, cloud pipeline)- Source already on
master(43f012d+ README badge bump)
🔗 Links
- Repo: https://github.com/MHJoy99/joyvoice
- Changelog: CHANGELOG.md
- Setup: docs/SETUP.md
v2.0.0: 10 Languages, Glass UI, and Robustness
🎉 JoyVoice v2.0.0
Major Features
- 🌍 10 Languages: English, Chinese, Japanese, Korean, French, German, Spanish, Russian, Portuguese, Arabic
- 🔍 Auto Language Detection: Automatically detects the spoken language
- ✨ Glass UI: Modern frosted-glass floating widget with transparency effects
- 〰️ Waveform Visualization: Real-time audio waveform display during recording
- 🔊 Sound Effects: Audio feedback for recording start/stop, success, and errors
- 💪 Robustness: Improved error handling and recovery across the pipeline
- 📊 Confidence Scores: Display confidence level for transcriptions
- 🔔 Toast Notifications: Non-intrusive status toasts
- 🔄 Language Switcher: Quick language selection from the floating widget
- 📜 History: Recent transcriptions history panel
Technical Improvements
- Modular audio engine with sound playback
- Enhanced ASR pipeline with fallback strategies
- Improved paste mechanism reliability
- Settings persistence enhancements
- Better hotkey handling
Security
- All API keys read from environment variables only — never hardcoded
- No secrets, tokens, or credentials in source code