Repository navigation
Releases: NguyenSiTrung/VieNeuTTSApp
Release list
VieNeuTTS v0.3.0 — Five-Destination Redesign, Responsiveness Hardening & Platform Fixes
VieNeuTTS v0.3.0 — Five-Destination Redesign, Responsiveness Hardening & Platform Fixes
v0.2.0 added the Qwen engines. This release changes how the app is laid out
and how fast it responds. The six-tab sidebar is now five destinations
organised around the voice: Create (Tạo giọng đọc), Audiobook
(Sách nói), Voices (Giọng đọc), Studio and Settings (Cài đặt).
The primary action stays in one pinned dock, and every screen works at the
640×420 minimum window. A performance audit also moved book loading,
exports, Studio and audition file I/O, subtitle dubbing and Qwen engine
preparation off the GUI thread, so the multi-hundred-millisecond freezes
are gone. Live preview no longer runs synthesis at playback speed. Packaged
builds start about twice as fast, because their QML is precompiled.
Engines, models and the dependency lock are unchanged (VieNeu SDK 3.3.0).
Existing settings, voices, clones, books and Studio projects carry over.
Upgrade notes
- macOS 14 (Sonoma) or newer is now required. The bundle declares
LSMinimumSystemVersion 14.0, which was already the real floor (the
arm64onnxruntimewheel ismacosx_14_0). On older systems you now get
a clear "requires macOS 14" message instead of a Qt dyld crash or an
engine failure partway through a job. GGUF runtime packs refuse macOS
versions below 13. - Source installs need PySide6 ≥ 6.9 (previously ≥ 6.7). Card shadows
use QtQuick.EffectsRectangularShadow. The lock already resolves 6.11.2. - Navigation ids changed (
create,audiobook,voices,studio,
settings). The legacy idstext,paragraphandcloningare still
accepted and map to Create → Compose, Create → Document and Voices →
Clone.
Added — Five-destination shell
- Create (Tạo giọng đọc) replaces the separate Text and Paragraph tabs.
A mode switch (Compose / Document / Multiple files / Subtitles) sits
over one shared TransportDock: a voice chip, Generate (Ctrl+Enter),
which turns into Stop (Esc) while busy, playback with waveform and
timecodes, an export split button (WAV/MP3, quick save, save as…), and
Open in Studio. Emotion tags appear as chips in the compose toolbar. - Create inspector: a card for the current voice with audition and
Change voice…, the three most recent voices (stored separately for
each engine profile), per-run speed and sentence-pause sliders, and the
live-preview toggle, which now has exactly one location. The inspector
is a 300 px column at ≥ 1000 px and moves under the editor on narrower
windows. - Voices (Giọng đọc) library: the preset voices grouped by region
(Bắc / Trung / Nam), with gender and style filters, search that ignores
diacritics, audition on every row, Set as default, and a section for
cloned voices. Voice cloning now lives here as the clone view; its
privacy and consent notice is unchanged. Change voice… in Create opens
the library in pick mode. Each row then gets Use this voice, which sets
the voice and returns you to Create. - Audiobook (Sách nói) master–detail: a library column of book tiles
(progress, author · chapter count, drop target) and a book detail whose
chapter list fills the full height and is the only scroller. The nested
360 px scroll inside the page scroll is gone. At ≥ 1200 px the reader
docks as a third column. The player uses the dock skin (44 px prev/next
around a larger play button, Auto-advance chapters inside the player),
and chapter row actions have accessible names. - Studio: clips appear as duration-proportional blocks on a timeline
with a selection and a playhead. A row of history chips offers undo and
reset. A new Effects (Hiệu ứng) panel keeps edits pending: you can
preview them, A/B them with an Original / Edited toggle, and commit
them all with a single "Apply N changes" button that counts as one
undo step. This replaces the per-row Apply buttons. The empty state
points to Create, Document and Audiobook. - Settings (Cài đặt) sub-navigation: six sections (General, Voice &
pacing, Export, Engine & hardware, Models, Updates) and a label filter
that ignores diacritics. The engine section starts with a summary card:
current state, active backend and precision, why it was chosen, and an
Auto / CPU / GPU switch. Precision, the managed CUDA runtime, the
Qwen device and diagnostics sit under collapsed Advanced disclosures.
The CUDA auto-expand rules are unchanged. The default-voice setting is
now a read-only row that links to the Voices library. - Bottom status bar: model/engine readiness, the engine note (backend ·
precision · mode), the audio-output state with Check again, and the
update indicator. It replaces the floating export-only pill and the
sidebar engine card, and never shows an empty or "…" value. - Sidebar: Create, Audiobook, Voices and Studio at the top, Settings
pinned at the bottom with the update dot. Below 800 px it becomes an
icon-only rail with tooltips and accessible names. - Settings → Verify files: re-hashes installed Qwen runtime and model
files in the background on request and reports what it finds. Findings
persist, so later quick checks keep reporting them.
Added — Audiobook
- Oversize chapters are split automatically. A chapter over the
60,000-character limit used to be refused and produced no audio. It is
now split at paragraph and sentence boundaries into deterministic parts
(ch_XXXX_sYY.wav). The parts render in order under the same chapter,
play back to back, and export as ordered part files.
Changed — Design system
- Accessibility floor: no rendered text below 12 px, every interactive
target at least 44 px, and subtle text that passes WCAG AA (4.5:1) on
every surface in both themes. A smoke scan checks rendered sizes for
every destination. - Quieter chrome: page headers are a single row (no icon tile, no
subtitle). Cards drop their subtitle and header divider. Settings rows
lose their decorative icon tiles. - Button hierarchy: one primary action per screen state, disabled
controls never look filled, "Studio…" is now "Open in Studio", and
clearing the editor can be undone (Ctrl+Z). - New segmented control for Color mode, Create modes and the device
pickers. - 640×420 minimum window: the dock condenses to icon-only actions, the
files queue fills the visible height, the voice filters share a row, the
audiobook detail compacts, and Settings swaps its chip navigation for a
section dropdown.
Performance
- No more GUI-thread stalls. These now run in the background, with busy
and progress states: opening and refreshing books, Export all and
per-chapter audiobook exports (the book is loaded once per run, and a
second export is refused while one runs), Studio chapter import and clip
preview, the audition cache copy, CUDA readiness probes, subtitle dub
placement (on an ordered worker while the next unit synthesizes), and
Qwen engine preparation (submissions queue until the engine is ready). - Live preview runs at engine speed. The worker no longer waits for
playback. Audio that does not fit the 2 s live buffer is read back in
order from the on-disk part file, so playback stays sample-exact and the
job finishes as fast as the engine can render it. - Qwen live jobs start sooner: smaller first segments (150 and then 250
characters, cut at clause marks), and the host prefetches the next
segment while the current one plays. It never runs more than one job
ahead. - Lower per-job Qwen host overhead: accelerator caches are released
every 8 jobs (or after 512 MiB of RSS growth) instead of after every job,
generation runs undertorch.inference_mode, footprint reads use
/procon Linux, and the GGUF host reuses reference-clip digests while
the file is unchanged. - Install checks skip full hashes for unchanged files.
install.json
records size, mtime and inode stamps. Routine engine builds trust a
matching stamp, and only changed files are re-hashed. Verify files
always re-hashes everything. - BLAS thread cap of 1 by default. OpenBLAS threads sized to every core
competed with ONNX Runtime's threads: warm VieNeu RTF went 1.43 → 0.80
and process CPU went 208% → 123% on a 4-core host (+130 MB peak RSS).
Environment variables you set yourself still take precedence, and Qwen
hosts keep their own thread defaults. Evidence:
docs/performance/tuning-vieneu.md. - Faster startup in packaged builds: QML is precompiled at build time.
On a cold first launch, first frame went ~605 → ~296 ms (median) and
all tabs were ready in ~1377 → ~1062 ms. Only the landing destination is
built before the first frame; the others load asynchronously, either on
first visit or in an idle prebuild. - Long lists update row by row. Chapters, subtitle cues, batch items
and Studio clips/ops use diffing list models. Progress ticks no longer
rebuild every delegate or lose the scroll position. - Rendering: waveforms repaint only when visible and changed (a
playhead tick repaints nothing), icons no longer use one framebuffer
each, and card shadows are analytic instead of a blur pass per card. - Audio: WSOLA speed changes use FFT cross-correlation (≥ 3× on 60 s,
output identical within float rounding). Studio caches the time-stretched
mix, so edits after a speed change do not re-stretch it. Multiple-file
runs encode the finished file while the next one synthesizes. - Smaller wins: prewarm also warms text normalization and the
phonemizer, so the first job skips their cold start. Word-count and
duration metrics are debounced. The subtitle dub policy rebuilds only
when you release the slider. Qwen PCM framing is vectorized, and the live
transport drops a redundant copy.
...
VieNeuTTS v0.2.0 — Optional Qwen Engines: Multilingual TTS, GGUF Formats & Engine-Aware Workflows
VieNeuTTS v0.2.0 — Optional Qwen Engines: Multilingual TTS, GGUF Formats & Engine-Aware Workflows
This is the first feature release since v0.1.16, and it turns the app from a
single-engine Vietnamese/English tool into a multi-engine workstation.
Beside VieNeu (still the default), two opt-in Qwen 0.6B profiles add ten
languages — either nine built-in speakers (CustomVoice) or your own
enrolled clones (Base) — in two interchangeable model formats: the
default GGUF path on a pinned native qwentts.cpp runtime, or the original
official PyTorch weights. Both install on demand from Settings behind
checksum-verified manifests, run in an isolated model-host subprocess, and
follow the same Text, Paragraph/Batch, Audiobook, Subtitle, Studio, cache and
export surfaces as VieNeu — with engine-stamped provenance, so one engine's
render is never replayed as another's.
Nothing Qwen-related is bundled: the app's own dependency lock is unchanged and
the release pipeline now asserts the frozen bundle carries no PyTorch/Qwen
stack.
Added — Optional Qwen engines (CustomVoice / Base)
- Two opt-in engine profiles beside VieNeu: Qwen CustomVoice 0.6B (10
languages — Chinese, English, Japanese, Korean, German, French, Russian,
Portuguese, Spanish, Italian — with 9 fixed speakers) and Qwen Base 0.6B
(the same languages, with your own voice clones enrolled from a 3–8 s
reference clip plus its transcript). Vietnamese is not a Qwen language, which
is why VieNeu stays the fresh-install and migrated-settings default. - Explicit, global engine selection. The active profile is picked in
Settings and never guessed from text; switching is refused while a job is
running or queued, and exactly one model owner is resident at a time. - One capability table as the single source of truth — voices, languages,
cloning support, readiness and runtime — with every surface (pickers,
synthesis gates, caches, exports) deriving from it instead of re-deciding. - Managed, verified installs. Both the runtime and the models install from
Settings with state, size and free-space requirement shown before you start,
resumable downloads, offline-pack import, and size + SHA-256 manifest
verification; an interrupted install is never promoted into place. The
official-weights path is ~1.5–3 GB of runtime plus ~2.5 GB of model per
profile (~4.3 GB for both, which share ~683 MB). - Isolated model-host subprocess (
--qwen-host) speaking a framed IPC
protocol: the app's own environment is never modified, a crashed host is
restarted on the next job instead of taking the app down, generation emits
liveness heartbeats, cancellation escalates from a cooperative request to
silence-based termination, and the host's machine footprint (threads, RSS) is
governed per job. - Every surface follows the active profile — Text, Paragraph/Batch,
Audiobook, Subtitle, Audio Studio, caches and exports. VieNeu's own default
voice and temperature controls read as unavailable with the reason on
screen under a Qwen profile, and the Text tab replaces its emotion-tag chips
with the reason (both 0.6B checkpoints ignoreinstruct). - Profile-scoped clones. Base clones are stored as a plain WAV +
transcript and re-derived by whichever host serves them, so an enrolled clone
works under either model format. - Engine-stamped provenance. Audiobook/subtitle caches and Studio clips
carry the engine identity that produced them; a clip from another engine is
flagged and offers a one-click switch to the profile it was rendered with. - Setup guidance instead of dead ends. An unready profile points at the
exact Settings card and action (runtime, model, quantization) rather than
failing at synthesis time. - Batch synthesis for export jobs (bounded by total characters) and
audition previews that speak in the job's language rather than fixed
Vietnamese.
Added — GGUF format variant (default for Qwen)
- GGUF is now the default format for the Qwen family, with the
Q8_0chip
marked as recommended; the official full weights stay one click away with
their cost stated on screen, and an explicit format choice is persisted and
never overridden. - Checksum-locked native runtime packs on the pinned
qwentts.cppengine,
published for Windows x64 CPU (8 MiB), Linux x64 CPU (18 MiB),
Apple Silicon CPU (5 MiB) and Apple Silicon Metal (7 MiB) — installed
in one click from the Settings runtime card or imported as a folder offline.
A pack whose native library cannot load is reported as an incomplete runtime
with a Repair action (a re-verified reinstall, not a stack trace). - Per-variant model installs: one talker GGUF per profile and quantization
(0.6–1.0 GB) plus one tokenizer GGUF per quantization shared by both profiles
(291 MBQ8_0/ 255 MBQ4_K_M) — a profile pair at the same quantization
never duplicates it. - Variant-aware everything. Readiness, pickers and provenance know the
exact build identity: aQ4_K_Mrender is never replayed asQ8_0, and
switching format is explicit, never automatic. - Isolated GGUF host (
--qwen-gguf-host) on the same framed protocol, with
the app'sauto/mpsdevice spellings resolved to the native vocabulary, a
structured non-fatal refusal for backends a pack does not ship, and the same
cancellation/restart lifecycle guarantees as the Python host. - CUDA without a GPU runner. CI has none, so CUDA cells stay unpublished —
but a source checkout can build and import one locally, documented in
docs/qwen-gguf-runtime-local-build.md.
Changed
- Settings reorganized into sections with a sticky navigation band and
engine-conditional cards: VieNeu-only controls are scoped to their engine and
the SRT picker is gated by capability, so the page only offers what the
selected engine can actually do. - Editor metric chips are script-aware — CJK text is counted in words and
its duration estimated per script instead of assuming Vietnamese. - Clone identity hashes the decoded audio samples, not container bytes, so
the same clip re-encoded into another container is recognized as the same
clone. - CUDA detection hardened and the automatic backend resolution deferred
until after the first paint, so startup no longer blocks on driver probing.
Fixed
- Cancel is honest and responsive: cancelling no longer freezes the GUI and
a cancelled generation never runs to completion. - A missing runtime no longer crashes prewarm or misreports readiness — it
reads as "not installed", which is what it is. - Downloads report real byte progress (the model progress counter counted
files, not bytes), and the managed runtime install stays linear while
reporting its true size. - The app sends the language code to the host, not the model name — which
is what made audition previews speak the wrong language. - Qwen device hygiene: CUDA runs at the locked
bfloat16precision rather
thanfloat32; MPS releases its cache and falls back to CPU for ops the
backend does not implement. - Windows:
soxships with the runtime, an unimportable runtime is
reported as a runtime problem rather than a crash, and pack staging handles
multi-config MSVC layouts. - Studio dialogs size from the dialog itself (capped width) instead of
their content layout, so long transcripts no longer stretch the window. - Audiobook ETA projects zero on the final tick instead of a stale
estimate, and the Text tab shows a single Cancel button during synthesis. - VoicePicker elides its trigger reason instead of clipping it, and
destructive Settings actions are gated behind confirmation with clearer
labels.
Performance
- Streaming resampler position generation is vectorized, and the host's thread
posture is pinned so inference threads no longer float with the machine. - Measured on the shipped GGUF packs: on Apple Silicon (M4) Metal runs faster
than realtime (RTF ≈ 0.48, first audio ≈ 0.66 s) and CPU is near-realtime
(RTF ≈ 0.80, first audio ≈ 0.14 s); on the CI-builtlinux-x64-cpupack CPU
is slower than realtime (RTF ≈ 2.6 CustomVoice, ≈ 7 Base). Full numbers:
docs/performance/qwen-gguf-compatibility.md.
Internal
- Release pipeline hardening: the build now asserts the frozen bundle
contains no PyTorch/Qwen stack and that the packaged binary can re-dispatch
itself as either model host (--qwen-host,--qwen-gguf-host) — a frozen
build has nopython -mto hand the host half to. - CI split into parallel unit and smoke jobs; new opt-in workflows:
qwen-runtime-smoke.yml,qwen-gguf-runtime-build.yml,
qwen-gguf-runtime-smoke.yml,qwen-gguf-upstream-drift.yml(weekly
upstream pin drift check), plus the CUDA-runtime spike. - Two-tier validation: ordinary CI stays deterministic and torch-free on
scripted fake hosts, while the real model is exercised only through the
opt-inscripts/qwen_release_smoke.pyandscripts/qwen_gguf_release_smoke.py
gates (the latter covering 6 cells × 4 variants = 24 combinations with
identity, device, resource, cancellation, restart and shutdown evidence). - English catalog completed for the new surfaces;
ruff check .+
ruff format --check .clean on 192 files, and the gate is
2262 passed + 1 skipped (offscreen Qt, 2263 items selected of 2275
collected, 12 benchmarks deselected).
Evidence status — what is proven and what is not
This release does not claim more hardware validation than exists:
- GGUF: only
linux-x64-cpuis probe-verified end to end today. The other
five cells (windows-x64-cpu,windows-x64-cuda,linux-x64-cuda,
macos-arm64-cpu,macos-arm64-metal) staypendingreal-devic...
VieNeuTTS v0.1.16 — Studio Tab UX Refinement & Component Extraction
VieNeuTTS v0.1.16 — Studio Tab UX Refinement & Component Extraction
This release polishes the Audio Studio tab introduced in v0.1.15: a clearer
transport hierarchy, visible seek/stop controls, clickable preset chips, safer
destructive actions, precise numeric entry, and a structural refactor that
extracts the FX rack and clip rows into reusable QML components.
Added
- Full Transport Controls: Visible seek-back / seek-forward (±5 s) and a
dedicated Stop button join play/pause in the dock — actions that were
keyboard-only (←/→, Esc) are now discoverable, with key hints in tooltips. - Precise Numeric Entry: Every FX parameter (gain, speed, gap, fade) now has
an editable numeric field beside its slider — type exact values, stepped and
clamped to the slider's range, synced both ways. - Fade Dirty-State Parity: The fade module now shows the "Chưa áp dụng" /
"Not applied" pending hint like every other parameter, plus a live readout of
the currently applied fade-in/fade-out values. - Reset Confirmation: "Đặt lại gốc" (Reset to original) now asks before
dropping the whole operation stack.
Changed
- Single Primary CTA: The dock no longer shows two adjacent filled accent
buttons during playback — play/pause is the one primary; quick export moved
to an icon button beside the labeled "Xuất âm thanh…" dialog action. - Preset Chips Look Clickable: All rack presets (-3 dB, 0.85×, 200 ms, …)
render as bordered chips instead of bare text via a newchipbutton variant. - Safer Destructive Actions: "Xoá vùng chọn" (cut range) and "Đặt lại gốc"
use danger styling; the revert-to-base chip drops its misleading check icon. - Guide Cards Fully Clickable: Empty-state navigation cards respond to
clicks anywhere on the card, equalize heights, and bottom-align their CTAs. - Corrected Status Semantics: The transport status dot is neutral when idle
and accent when playing (was green when idle — an inverted convention). - Clip-Row Hover Feedback: Clip rows highlight subtly on hover.
- Consistent Hit Targets: Icon buttons are now square with a 40 px minimum
(was 40×32); the regen dialog's cancel reads "Hủy" instead of "Giữ nguyên". - Stable Busy States: Busy buttons keep their original label while spinning
— no more layout reflow in wrapping toolbars.
Internal
- Component Extraction:
StudioTab.qmldecomposed intoStudioRackModule,
StudioParamRow, andStudioClipRow(1757 → 1398 lines);AppCardgained
clickable/cardHovered/cardClickedfor whole-card tap targets. - Localization: English catalog regenerated for the moved/new strings;
i18n contract test updated for the new component contexts. - All tested
objectNamecontracts preserved; 1055 tests green.
VieNeuTTS v0.1.15 — SRT Subtitle Studio, Studio Pinned Transport & Workflow Redesign
VieNeuTTS v0.1.15 — SRT Subtitle Studio, Studio Pinned Transport & Workflow Redesign
This release introduces a timestamp-aware Subtitle (SRT) Dubbing & Transcript Studio,
a comprehensive redesign of the Audio Studio tab around a pinned transport and truthful
state, a 3-mode segmented Paragraph Studio with docked controls, restructured Settings
cards with 64-bit platform hardening, and significant test suite performance optimizations.
Added
-
Timestamp-Aware Subtitle (SRT) Dubbing & Transcript Studio:
- Dedicated "Phụ đề (SRT)" / "Subtitles (SRT)" mode composed into the Paragraph Tab
(SubtitleCard.qmlbacked bySubtitleController). - Cue-Aligned Dubbing Mode (
dub): Timecode-constrained synthesis aligning spoken
dialogue with exact SRT subtitle cues using WSOLA time-stretching within natural speech
bounds and automatic inter-cue silence padding. - Natural Transcript Mode (
transcript): Groups subtitle cues across sentence
boundaries (bounded byUNIT_MAX_CHARSandUNIT_GAP_MSguards) for continuous, natural
narration without robotic cue-by-cue pauses. - Streaming Track Render & Smart Caching: Clip-by-clip streaming render directly to
PCM_16track.wav(keeping RAM usage under ~690 MB vs ~1.4 GB in RAM for 2-hour tracks)
with SHA-256 fingerprint caching that reuses cached audio when text, voice, or timing are unchanged. - Synchronized Subtitle Playback: Live playhead tracking across subtitle cues with active
cue highlighting and interactive waveform seeking. - Flexible Subtitle Export: Export aligned full-mix audio (WAV or MP3), adjusted SRT
subtitle files with updated timestamps, or natural transcript text. - Full Bilingual Localization: 100% Vietnamese and English localization across all subtitle
studio cards, dialogs, badges, and status messages.
- Dedicated "Phụ đề (SRT)" / "Subtitles (SRT)" mode composed into the Paragraph Tab
-
Audio Studio Redesign (Pinned Transport & Waveform Selection):
- Pinned Transport Dock: Audio transport dock is permanently pinned to the bottom of the
Studio tab so Play/Pause/Seek, timecodes, and preview buttons remain accessible regardless
of vertical scroll. - Master Waveform Region Selection: Interactive click-and-drag range selection on the 72px
master waveform deck with one-click actions to Keep (TrimOp) or Delete (CutOp) regions. - Truthful Dynamic Op Stack: Operation rack readouts fold mathematical transformations in
real time (gain sums, speed multiplies) to match the rendered output; applying adjustments
updates parameters in place without stacking redundant duplicate operations. - Truthful Clip Auditioning: Auditioning an individual clip publishes its specific ID,
duration, and waveform envelope so the transport dock, timecode, and highlighted row reflect
the clip actually playing. - Clickable Op-History Breadcrumbs: Interactive timeline chips (
studioRevertTo) allow
instantaneous rollback to any prior operation in the history chain. - Keyboard Transport & Shortcuts: Spacebar toggles Play/Pause, Escape halts playback, and
arrow keys provide stepped waveform navigation when the Studio tab is active. - Quick Actions: Per-clip deletion controls and quick export shortcut.
- Pinned Transport Dock: Audio transport dock is permanently pinned to the bottom of the
-
Paragraph Tab Redesign & Mode Composition:
- Segmented 3-Mode Architecture: Refactored monolithic 948px scrolling tab into three
dedicated views via a segmentedModeTabscontrol: "Một tài liệu" (DocumentEditorCard),
"Nhiều tệp" (BatchQueueCard), and "Phụ đề (SRT)" (SubtitleCard). - Docked Synthesis Action Bar: Docked bottom
SynthesisBarkeeps Voice picker, Generate,
Play, Export, and Run-all actions permanently visible with responsive Flow wrapping for
compact window widths. - Stationary Navigation: Stabilized layout geometry, fixed scrollbar jitter, and eliminated
mode-switch slack so the page header and mode selector remain stationary when toggling modes. - Batch Queue Clarity: Dedicated batch drop zone and clear visual error reporting for queue failures.
- VoicePicker Regional & Bilingual Disambiguation: Disambiguates regional accents ("Miền Bắc",
"Miền Trung", "Miền Nam", avoiding duplicate "Nam" chips for southern male voices) with complete
English catalog localization.
- Segmented 3-Mode Architecture: Refactored monolithic 948px scrolling tab into three
Fixed & Improved
-
Settings Tab Restructure & Hardening:
- Modular Card Layout: Split monolithic 801px Engine card into three clean cards: Engine
(backend, precision, detector), Managed CUDA Runtime (status, storage metrics, copyable driver
commands), and Model Source (official vs custom Hugging Face model). - Auto-Expanding CUDA Diagnostics: Troubleshooting disclosure stays collapsed by default and
automatically expands when an installation is in flight, failed, or driver action is needed. - 64-Bit Byte Count Overflow Fix: Widened
modelInstalledBytes,modelRequiredBytes,
cudaRuntimeInstalledBytes, andcudaRuntimeRequiredBytesfrom 32-bitinttoqlonglong,
preventingOverflowErrorcrashes on 64-bit systems inspecting multi-GB CUDA runtimes. - Deterministic QML Teardown: Added
_teardown_qml()on application exit, ensuring Qt
context properties remain alive until tear-down finishes and eliminating ~190 spurious
TypeError: Cannot read property 'x' of nullshutdown errors.
- Modular Card Layout: Split monolithic 801px Engine card into three clean cards: Engine
-
Audio & Platform Reliability:
- Windows Soundfile Lock on Abort: Explicitly released underlying soundfile handle during
synthesis cancellation/abort, preventingWinError 32file locking and allowing temporary
WAV files to be cleanly unlinked on Windows. - Studio Delegate & Contrast Fixes: Resolved QML Repeater delegate instantiation bug on
op-stack chips and improved text contrast onaccentSubtlechips; tunedTheme.waveformIdle
to >=3:1 contrast on both dark and light themes. - Responsive Scaling: Guaranteed UI integrity down to 640x420 minimum window dimensions
without slider collapse, horizontal overflow, or nested ScrollView wheel traps.
- Windows Soundfile Lock on Abort: Explicitly released underlying soundfile handle during
-
Performance & Documentation:
- Test Suite Runtime Optimization: Consolidated duplicate micro-tests and folded repetitive
smoke scenarios, reducing full-suite runtime by ~30% with 100% assertion retention (suite
expanded to 1,055 items). - Documentation & Asset Refresh: Updated
README.mdwith Audio Studio, MP3 export, and
Paragraph batch queue documentation, and regenerated all 6 application screenshots.
- Test Suite Runtime Optimization: Consolidated duplicate micro-tests and folded repetitive
VieNeuTTS v0.1.14 — Pro Audio Studio, Async Transport & Performance Polish
VieNeuTTS v0.1.14 — Pro Audio Studio, Async Transport & Performance Polish
This release elevates the Audio Studio to a professional DAW-grade experience
with a telemetry-enabled redesign, non-blocking background rendering, an interactive
pause/seek transport, reliable undo/reset synchronization, and massive test suite
consolidation.
Added
- Pro-Audio Studio Deck & Master Telemetry: Redesigned Studio tab featuring an
expanded 72px master waveform deck with real-time telemetry monitors (Peak level,
RMS dB, and Dynamic Range meters). - Grouped FX Rack: Reorganized studio operations into three intuitive modular
sections: Dynamics (Gain, Peak Normalization), Tempo & Cadence (WSOLA Speed stretch,
Inter-clip gap insertion), and Transitions (Fade In/Out, Silence Trimming). - Op Stack Timeline & Contextual History: Live visual breadcrumbs displaying
the active chain of operations with one-click contextual Undo and Reset actions. - Interactive Transport (Pause & Waveform Seek): Studio audio transport now
supports pausing and resuming at the exact playhead position, alongside direct
click-and-drag waveform seeking via the shared audio player. - Per-Clip Auditioning & Transcript Editing: Listen to individual segments
directly with per-clip preview buttons, inspect visual badges for re-synthesized
clips, and edit segment text directly in the re-generation dialog before re-rendering. - Comprehensive Bilingual Localization: 100% Vietnamese and English localization
for all new studio cards, telemetry readouts, dialogs, badges, and tooltips.
Fixed & Improved
- Non-Blocking Background Waveform Rendering: Audio overview generation, preview
rendering, and exports now execute off the GUI thread behind a responsive busy
indicator (studioBusy) with per-op spinners, preventing UI freezes during long audio edits. - Truthful Waveform Overview: Audio overview bands are now normalized against
the dry project peak so Gain adjustments and Peak Normalization visibly scale
the waveform deck, and Undo restores the original visual amplitude. - Undo / Reset Preview Invalidation & Controls Sync: Performing Undo or Reset
immediately halts obsolete playback, recalculates the remaining op stack, and auto-plays
the updated mix. Rack sliders (gain, speed, gap, fade) now faithfully restore to their
prior positions via dynamic controls synchronization. - Stale Render Generation Guards: In-flight background renders are safely discarded
when the project or op stack changes, preventing outdated audio mixes from playing. - Test Suite Consolidation & Speed: Merged related micro-tests across unit suites,
consolidated benchmark tests intotest_benchmark_pack.pywith opt-in execution
(-m 'not benchmark'), and unified QML smoke scenarios into shared subprocesses. - CI Reliability: Removed preinstalled Google Chrome apt source from Linux CI
runners to prevent transient package manager hash sum failures, and adjusted smoke
timeouts on loaded runners.
VieNeuTTS v0.1.13 — Mini Audio Studio + Segment Re-generation
VieNeuTTS v0.1.13 — Mini Audio Studio + Segment Re-generation
This release introduces the Mini Audio Studio, enabling users to preview,
refine, reorder, and selectively re-synthesize audio before final export,
alongside export format polish and CUDA requirement hints.
Added
- Mini Audio Studio: A dedicated post-synthesis studio tab for fine-tuning
and polishing TTS audio before final export without touching the cloud or
requiring external audio editors. - Offline Audio Refinements: Non-destructive op stack including Gain
(-20 to +12 dB), Fade In/Out (up to 1000 ms), Speed adjustment (0.5× to 2.0×
via WSOLA time stretch), Inter-clip gap insertion (0 to 2000 ms), Peak
Normalization, and Silence Trimming. - Live Waveform & Playhead Tracking: Full amplitude waveform with live
playhead gliding, accent gradient highlight, elapsed/total duration timers,
and a Play/Stop toggle for instant auditioning. - Reset to Default: One-click reset in the Audio Refinements card to restore
the original audio and return all sliders to their standard values. - Multi-Clip Manager: Segment breakdown for multi-paragraph or chapter
audio, complete with clip index badges, duration indicators, text excerpts,
and reordering controls (↑/↓). - Segment Re-synthesis (Modal Dialog): Re-generate individual sentences or
paragraphs using a different voice without re-rendering the whole document.
Slices and crossfades seamlessly with a 10 ms smooth blend. - Feeder Navigation: Direct "Studio…" entry buttons on Text, Paragraph,
and Audiobook tabs, allowing seamless transition from generation to editing. - Comprehensive Bilingual Support: 100% localized in both Vietnamese and
English across all new Studio surfaces, dialogs, tooltips, and status messages.
Fixed
- Export Format in Save Dialogs: Text, Paragraph, and Audiobook Save dialogs
now honor theexportFormatsetting (WAV / MP3) with dynamic filter selection
and default suffix completion. - CUDA UI Driver Guidance: Inactive CUDA install button now provides an
informative tooltip explaining driver requirements when no compatible NVIDIA
driver is detected.
VieNeuTTS v0.1.12 — MP3 Export + Windows Hardening
VieNeuTTS v0.1.12 — MP3 Export + Windows Hardening
This release adds a user-choosable MP3 export alongside WAV and ships a
large Windows reliability pass, plus a repaired CUDA activation flow.
Added
- MP3 export: Text, Paragraph, Batch, and Audiobook exports now offer
MP3 in addition to WAV (WAV remains the default). The choice is
remembered in Settings. - OS-aware CUDA driver upgrade guide: Settings shows per-OS driver
update instructions with full English translations.
Fixed
- Windows CUDA activation: repaired runtime activation on Windows,
unified the Settings readout, and hardened the setup flow. - Frozen-app playback: the installed Windows build now ships the Qt
audio plugins it needs — artifact replay and live preview work
out of the box instead of falling back to export-only. - Audio device compatibility: USB/Bluetooth headsets without Float32
support fall back to 16-bit output instead of staying silent. - File-lock races: rapid re-preview, fast replay switching, and
render-while-playing no longer fail with WinError 32. - Startup polish: no more console flash from the driver probe,
a second launch exits cleanly instead of contending over downloads,
and missing QML data fails with an actionable reinstall message. - Long paths and antivirus: paths beyond ~260 chars, Defender-held
files, and oversized imports are handled or refused with a clear
message instead of crashing.
VieNeuTTS v0.1.11 — Managed CUDA Runtime
VieNeuTTS v0.1.11 — Managed CUDA Runtime
This release keeps every desktop download CPU-only and adds an opt-in,
app-managed CUDA runtime for supported NVIDIA systems.
Added
- Explicit CUDA installation: Windows x64 and Linux x64 users with a
CUDA 12.8-compatible NVIDIA driver can download the verified PyTorch runtime
from Settings after installing the regular CPU application. - Verified offline runtime: the app validates the pinned wheel files before
installing them in its per-user data directory. CUDA works without network
access after a successful installation. - Safe diagnostics and removal: Settings reports the managed runtime and
driver prerequisites without running a locally detected Python environment.
A ready inactive runtime can be removed; restart the app if CUDA was already
loaded.
Changed
- Windows and Linux release artifacts no longer include multi-gigabyte CUDA
bundles. macOS remains CPU-only.
🚀 VieNeuTTS v0.1.8 — Crash Diagnostics, Windows Path Normalization & File Lock Resilience
🚀 VieNeuTTS v0.1.8 — Crash Diagnostics, Windows Path Normalization & File Lock Resilience
A stability and hardening release for VieNeuTTS — the fully on-device Vietnamese/English text-to-speech desktop workstation powered by VieNeu-TTS v3 Turbo.
All text and audio synthesis run 100% locally on your machine — private, offline, no telemetry, no cloud.
✨ What's New
-
🩺 Diagnostic Crash Reporter & Windows Native Dialog (
src/vienetts_app/crash.py)- Global Unhandled Exception Hooks: Installed global
sys.excepthookandthreading.excepthookhandlers during application bootstrap to intercept unhandled exceptions across main and worker threads. - Diagnostic Crash Logs: Automatically generates structured, timestamped
crash.logfiles in the user data directory (<UserData>/VieNeuTTS/logs/crash.log). Log entries capture OS release, architecture, Python runtime, PySide6/Qt versions, GPU status, thread name, exception type, and complete tracebacks. - Windows Native Dialog Fallback: Packaged GUI applications on Windows run without a console (
console=False), which previously caused unhandled exceptions to terminate silently. The app now displays a native Windows message box (ctypes.windll.user32.MessageBoxW) informing the user and directing them to the diagnostic log file. - GUI Boot Safety Guard: Wrapped Qt application instantiation in
run_app()to catch early initialization failures and present an actionable dialog before process exit. - Safe Controller Slot Wrappers: Protected synthesis and worker startup slots (
_begin_synthesis,_ensure_worker) with structured exception handlers, reporting user-facing error banners via_set_errorinstead of freezing or crashing the GUI on model load errors.
- Global Unhandled Exception Hooks: Installed global
-
🔒 Windows File Lock Resilience & Atomic Update Safeguards
- Retry-Bounded Atomic Replace: Files accessed by media players, antivirus software, or Windows indexing services can trigger transient
PermissionError(WinError 32) when overwritten. Added retry loops with bounded exponential backoff onos.replaceinIncrementalArtifactWriter,save_settings, andTTSEngine.persist_voices. - Zero-Audio-Loss Sibling Fallback: If the destination file remains locked after retries,
IncrementalArtifactWriterautomatically saves the synthesis result to a timestamped sibling file (<stem>_<ns>.wav), guaranteeing synthesized audio is never dropped. - Shielded Artifact Retirement: Wrapped
InteractiveArtifactStore.remove_if_unprotectedagainstOSErroron locked files and guardedrelease_retired_artifactswith exception suppression to prevent slot crashes during background cache cleanup. - Playback Stop Prior to Preview Overwrite: Halts active file playback before denoise preview generation or voice operations, utilizing retry-bounded atomic overwrites to avoid conflicting with active audio streams.
- Safe Export Copying: Wrapped
shutil.copyfilein bounded retry loops acrossexportWav,AudiobookLibrary.export_chapter, and audiobook batch chapter export.
- Retry-Bounded Atomic Replace: Files accessed by media players, antivirus software, or Windows indexing services can trigger transient
-
🌐 Cross-Platform Path Normalization (
src/vienetts_app/core/paths.py)- Comprehensive Path Utility: Added a dedicated cross-platform path normalization utility handling edge cases across Windows, macOS, and Linux:
- Normalizes QML
QUrlstring formats (file:///C:/...,file:///home/...,file://localhost/...). - Decodes URL percent-encoded characters (spaces, UTF-8 Vietnamese diacritics, and punctuation).
- Strips surrounding quotes from drag-and-dropped file paths.
- Robustly handles Windows extended-length paths (
\\?\,\\?\UNC\) and network shares. - Sanitizes Windows reserved device names (
CON,PRN,AUX,NUL,COM1-9,LPT1-9) and trailing spaces/dots in output filenames.
- Normalizes QML
- Universal Integration: Applied path normalization across document importers (
import_document), audiobook EPUB imports and chapter WAV exports, batch synthesis queue (BatchFileController), playback controller (PlaybackController), and main app controller.
- Comprehensive Path Utility: Added a dedicated cross-platform path normalization utility handling edge cases across Windows, macOS, and Linux:
-
📄 Document Importer & Encoding Hardening (
src/vienetts_app/core/importers.py)- BOM-Safe Text Decoding: Implemented
utf-8-sigdecoding inimporters.pyto seamlessly strip UTF-8 Byte Order Marks (\ufeff) from text files imported into Text and Paragraph studios. - Universal Newline Translation: Text document reading now standardizes Windows (
\r\n) and legacy Mac (\r) line endings cleanly across all platforms.
- BOM-Safe Text Decoding: Implemented
-
📢 Actionable Worker Error Diagnostics (
InferenceWorker._safe_error)- Classified Failure Reporting: Enhanced
InferenceWorkererror formatting to identify and present actionable messages for specific system resource constraints:- Out of Memory: Classifies
MemoryErrorand CUDA/CPU memory exhaustion, advising on memory limits. - Permission Denied: Classifies
PermissionErrorwhen accessing model or output paths. - Disk Space Exhaustion: Classifies disk-full conditions.
- Out of Memory: Classifies
- Eliminates opaque generic error messages, providing users with actionable diagnostic context in the UI.
- Classified Failure Reporting: Enhanced
-
✨ Voice Management & UI Polish
- Voice Name Sanitization:
TTSEngine.add_voicenow trims whitespace and validates against empty voice names with a clear localized error message ("Tên giọng không được để trống"). - Voice Clip Path Preservation: Preserves relative or local file paths that do not begin with
file://, while cleanly stripping quotes and normalizing URLs. - VoicePicker Label Regex: Cleaned up leading hyphen handling in
VoicePicker.qmlregex for cloned voice display labels (/^[▸—\-]\s*/).
- Voice Name Sanitization:
-
🛡️ Test Suite Coverage & Verification
- Added unit test suites
tests/unit/test_crash.pyandtests/unit/test_paths.py. - Expanded test coverage across
test_artifacts.py,test_controller.py,test_audiobook_controller.py, andtest_importers.py. - Full test suite passing with 917 tests (902 passed, 15 device-specific benchmarks skipped).
- Added unit test suites
📦 Platform Downloads & Installation
| Platform | File | Architecture | Notes |
|---|---|---|---|
| macOS | VieNeuTTS-0.1.8-macos-arm64.dmg |
Apple Silicon (M1/M2/M3/M4) | Open .dmg, drag to Applications. (See Gatekeeper note below) |
| Windows | VieNeuTTS-0.1.8-windows-x64.zip |
x64 (Windows 10/11) | Extract zip, double-click VieNeuTTS/VieNeuTTS.exe |
| Linux | VieNeuTTS-0.1.8-linux-x64.zip |
x64 (Ubuntu 22.04+ / glibc 2.35+) | Extract zip, run ./VieNeuTTS/VieNeuTTS — or sudo ./VieNeuTTS/share/linux/install.sh for a menu entry |
💡 Notes for First-Time Users
- Model Weights (~330 MB, one time): not bundled in the installers — the app downloads and verifies the official CPU baseline automatically on first launch. You can also import a verified offline pack (
backbone/+codec/) directly via Settings. After that it runs fully offline. - macOS Gatekeeper: the build is ad-hoc signed. On Sequoia/Tahoe, open the app once, then go to System Settings → Privacy & Security → Open Anyway; on Sonoma and earlier, right-click
VieNeuTTS.app→ Open → Open; any version via terminal:xattr -dr com.apple.quarantine /Applications/VieNeuTTS.app. - Linux Prerequisites:
sudo apt install libasound2 libpulse0 libgl1 libegl1 libxkbcommon0.
Full Changelog: v0.1.7...v0.1.8
🚀 VieNeuTTS v0.1.7 — Multi-File Batch Synthesis, Instant Voice Switching & Cancellation Hardening
🚀 VieNeuTTS v0.1.7 — Multi-File Batch Synthesis, Instant Voice Switching & Cancellation Hardening
A feature and stability release for VieNeuTTS — the fully on-device Vietnamese/English text-to-speech desktop workstation powered by VieNeu-TTS v3 Turbo.
All text and audio synthesis run 100% locally on your machine — private, offline, no telemetry, no cloud.
✨ What's New
-
📑 Multi-File Batch Synthesis Queue on Paragraph Tab (
BatchFileController&BatchQueueCard)- Off-Thread Batch Document Import: Select or drop multiple document files (
.txt,.md,.docx,.pdf,.srt) directly into the Paragraph Studio. Off-thread parsing keeps the GUI smooth and responsive, while an oversize guard protects against out-of-memory errors on giant documents. - Smart Drag & Drop Routing: Dropping multiple files anywhere onto the Paragraph tab automatically routes them to the Batch Queue; dropping a single file preserves the standard single-document editor import.
- Sequential Auto-Run with Bulk Streaming: Processes each document sequentially using the background streaming pipeline (
submit_stream_for_listener(kind="bulk")), without blocking the user interface. - Per-File Auto-Export: Each finished document's audio is automatically exported as
<stem>.wavto the chosen output directory, featuring collision-safe suffixing (_2.wav,_3.wav) to prevent accidental overwriting of existing audio files. - Interactive Batch Queue Card: Visual per-file progress bars, state badges (Chờ xử lý / Queued, Đang tổng hợp / Synthesizing, Hoàn thành / Done, Lỗi / Error), direct Play / Reveal in Folder / Remove actions per item, and a Run All / Cancel footer with queue progress summary.
- Voice & Settings Synchronization: Batch rendering automatically synchronizes with the active voice preset, reading speed, and sentence pause settings selected on the Paragraph tab.
- Failure-Continue Resilience: If an individual document fails during processing (e.g. unsupported encoding or corrupt formatting), the queue reports the error on that item and continues processing the rest of the queue uninterrupted.
- Disk Space Preservation: Automatic lifecycle cleanup removes intermediate synthesis chunk artifacts once a batch item is successfully exported to disk.
- Off-Thread Batch Document Import: Select or drop multiple document files (
-
⚡ Instant Voice Preset Switching & Cancellation Responsiveness
- Immediate Audition Termination: Selecting a voice in the VoicePicker instantly halts any active audition sample playback (
controller.stopAudition()), eliminating re-generation delays and playback overlap when changing voices. - Thread-Safe Cancellation Queue Tracking: Added
_cancel_requested_idswith lock-based tracking inInferenceWorkerto eliminate race conditions where a cancelled job could begin synthesizing if dequeued concurrently with the cancel call. - Early Abort Check in Synthesis Loop: Synthesis chunks check cancellation status before writing to the PCM transport (
_emit_audio_chunk), preventing unnecessary computation and audio buffer writes after cancellation. - Real-Time Cancellation UI Feedback: Updated Text and Paragraph tab action buttons with live status states (Đang chờ xử lý… / Queued…, Đang hủy… / Cancelling…, spinners, and disabled states) for immediate visual confirmation when cancelling queued or active synthesis jobs.
- Clean Controller Teardown: Fixed edge cases in
AppController.cancel()ensuring UI busy state and job states are always cleanly reset even if no foreground job ID or worker is active.
- Immediate Audition Termination: Selecting a voice in the VoicePicker instantly halts any active audition sample playback (
-
🌐 Expanded Bilingual Localization (i18n)
- Regenerated English localization catalogs (
vienetts_en.tsand compiled.qm) with complete translations for all new batch synthesis queue elements, queue item actions, and cancellation states. - Filled previously missing English translations for update checking, model downloading, and live preview toggles.
- Regenerated English localization catalogs (
-
🛡️ Quality & Test Suite Coverage
- Added unit tests for
BatchFileControllercovering document import, queue ordering, sequential progression, collision-resistant export naming, error tolerance, and artifact cleanup. - Added tests for voice picker audition termination, cancel tracking, and controller cancel state resets.
- Entire suite of 866 tests passing (865 passed, 1 device-specific skipped).
- Added unit tests for
📦 Platform Downloads & Installation
| Platform | File | Architecture | Notes |
|---|---|---|---|
| macOS | VieNeuTTS-0.1.7-macos-arm64.dmg |
Apple Silicon (M1/M2/M3/M4) | Open .dmg, drag to Applications. (See Gatekeeper note below) |
| Windows | VieNeuTTS-0.1.7-windows-x64.zip |
x64 (Windows 10/11) | Extract zip, double-click VieNeuTTS/VieNeuTTS.exe |
| Linux | VieNeuTTS-0.1.7-linux-x64.zip |
x64 (Ubuntu 22.04+ / glibc 2.35+) | Extract zip, run ./VieNeuTTS/VieNeuTTS — or sudo ./VieNeuTTS/share/linux/install.sh for a menu entry |
💡 Notes for First-Time Users
- Model Weights (~330 MB, one time): not bundled in the installers — the app downloads and verifies the official CPU baseline automatically on first launch. You can also import a verified offline pack (
backbone/+codec/) directly via Settings. After that it runs fully offline. - macOS Gatekeeper: the build is ad-hoc signed. On Sequoia/Tahoe, open the app once, then go to System Settings → Privacy & Security → Open Anyway; on Sonoma and earlier, right-click
VieNeuTTS.app→ Open → Open; any version via terminal:xattr -dr com.apple.quarantine /Applications/VieNeuTTS.app. - Linux Prerequisites:
sudo apt install libasound2 libpulse0 libgl1 libegl1 libxkbcommon0.
Full Changelog: v0.1.6...v0.1.7