Skip to content

Releases: NguyenSiTrung/VieNeuTTSApp

VieNeuTTS v0.3.0 — Five-Destination Redesign, Responsiveness Hardening & Platform Fixes

Choose a tag to compare

@github-actions github-actions released this 12 Oct 08:33

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
    arm64 onnxruntime wheel is macosx_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.Effects RectangularShadow. The lock already resolves 6.11.2.
  • Navigation ids changed (create, audiobook, voices, studio,
    settings). The legacy ids text, paragraph and cloning are 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 under torch.inference_mode, footprint reads use
    /proc on 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.
    ...
Read more

VieNeuTTS v0.2.0 — Optional Qwen Engines: Multilingual TTS, GGUF Formats & Engine-Aware Workflows

Choose a tag to compare

@github-actions github-actions released this 24 Sep 15:03

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 ignore instruct).
  • 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_0 chip
    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.cpp engine,
    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 MB Q8_0 / 255 MB Q4_K_M) — a profile pair at the same quantization
    never duplicates it.
  • Variant-aware everything. Readiness, pickers and provenance know the
    exact build identity: a Q4_K_M render is never replayed as Q8_0, and
    switching format is explicit, never automatic.
  • Isolated GGUF host (--qwen-gguf-host) on the same framed protocol, with
    the app's auto/mps device 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 bfloat16 precision rather
    than float32; MPS releases its cache and falls back to CPU for ops the
    backend does not implement.
  • Windows: sox ships 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-built linux-x64-cpu pack 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 no python -m to 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-in scripts/qwen_release_smoke.py and scripts/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-cpu is 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) stay pending real-devic...
Read more

VieNeuTTS v0.1.16 — Studio Tab UX Refinement & Component Extraction

Choose a tag to compare

@github-actions github-actions released this 15 Sep 17:20

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 new chip button 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.qml decomposed into StudioRackModule,
    StudioParamRow, and StudioClipRow (1757 → 1398 lines); AppCard gained
    clickable/cardHovered/cardClicked for whole-card tap targets.
  • Localization: English catalog regenerated for the moved/new strings;
    i18n contract test updated for the new component contexts.
  • All tested objectName contracts preserved; 1055 tests green.

VieNeuTTS v0.1.15 — SRT Subtitle Studio, Studio Pinned Transport & Workflow Redesign

Choose a tag to compare

@github-actions github-actions released this 15 Sep 12:57

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.qml backed by SubtitleController).
    • 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 by UNIT_MAX_CHARS and UNIT_GAP_MS guards) for continuous, natural
      narration without robotic cue-by-cue pauses.
    • Streaming Track Render & Smart Caching: Clip-by-clip streaming render directly to
      PCM_16 track.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.
  • 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.
  • Paragraph Tab Redesign & Mode Composition:

    • Segmented 3-Mode Architecture: Refactored monolithic 948px scrolling tab into three
      dedicated views via a segmented ModeTabs control: "Một tài liệu" (DocumentEditorCard),
      "Nhiều tệp" (BatchQueueCard), and "Phụ đề (SRT)" (SubtitleCard).
    • Docked Synthesis Action Bar: Docked bottom SynthesisBar keeps 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.

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, and cudaRuntimeRequiredBytes from 32-bit int to qlonglong,
      preventing OverflowError crashes 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 null shutdown errors.
  • Audio & Platform Reliability:

    • Windows Soundfile Lock on Abort: Explicitly released underlying soundfile handle during
      synthesis cancellation/abort, preventing WinError 32 file 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 on accentSubtle chips; tuned Theme.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.
  • 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.md with Audio Studio, MP3 export, and
      Paragraph batch queue documentation, and regenerated all 6 application screenshots.

VieNeuTTS v0.1.14 — Pro Audio Studio, Async Transport & Performance Polish

Choose a tag to compare

@github-actions github-actions released this 10 Sep 05:22

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 into test_benchmark_pack.py with 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

Choose a tag to compare

@github-actions github-actions released this 09 Sep 12:15

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 the exportFormat setting (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

Choose a tag to compare

@github-actions github-actions released this 07 Sep 10:38

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

Choose a tag to compare

@github-actions github-actions released this 06 Sep 17:54

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

Choose a tag to compare

@github-actions github-actions released this 04 Sep 12:14

🚀 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.excepthook and threading.excepthook handlers during application bootstrap to intercept unhandled exceptions across main and worker threads.
    • Diagnostic Crash Logs: Automatically generates structured, timestamped crash.log files 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_error instead of freezing or crashing the GUI on model load errors.
  • 🔒 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 on os.replace in IncrementalArtifactWriter, save_settings, and TTSEngine.persist_voices.
    • Zero-Audio-Loss Sibling Fallback: If the destination file remains locked after retries, IncrementalArtifactWriter automatically 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_unprotected against OSError on locked files and guarded release_retired_artifacts with 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.copyfile in bounded retry loops across exportWav, AudiobookLibrary.export_chapter, and audiobook batch chapter export.
  • 🌐 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 QUrl string 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.
    • 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.
  • 📄 Document Importer & Encoding Hardening (src/vienetts_app/core/importers.py)

    • BOM-Safe Text Decoding: Implemented utf-8-sig decoding in importers.py to 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.
  • 📢 Actionable Worker Error Diagnostics (InferenceWorker._safe_error)

    • Classified Failure Reporting: Enhanced InferenceWorker error formatting to identify and present actionable messages for specific system resource constraints:
      • Out of Memory: Classifies MemoryError and CUDA/CPU memory exhaustion, advising on memory limits.
      • Permission Denied: Classifies PermissionError when accessing model or output paths.
      • Disk Space Exhaustion: Classifies disk-full conditions.
    • Eliminates opaque generic error messages, providing users with actionable diagnostic context in the UI.
  • ✨ Voice Management & UI Polish

    • Voice Name Sanitization: TTSEngine.add_voice now 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.qml regex for cloned voice display labels (/^[▸—\-]\s*/).
  • 🛡️ Test Suite Coverage & Verification

    • Added unit test suites tests/unit/test_crash.py and tests/unit/test_paths.py.
    • Expanded test coverage across test_artifacts.py, test_controller.py, test_audiobook_controller.py, and test_importers.py.
    • Full test suite passing with 917 tests (902 passed, 15 device-specific benchmarks skipped).

📦 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

  1. 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.
  2. 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.
  3. 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

Choose a tag to compare

@NguyenSiTrung NguyenSiTrung released this 04 Sep 09:37

🚀 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>.wav to 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.
  • ⚡ 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_ids with lock-based tracking in InferenceWorker to 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.
  • 🌐 Expanded Bilingual Localization (i18n)

    • Regenerated English localization catalogs (vienetts_en.ts and 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.
  • 🛡️ Quality & Test Suite Coverage

    • Added unit tests for BatchFileController covering 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).

📦 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

  1. 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.
  2. 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.
  3. Linux Prerequisites: sudo apt install libasound2 libpulse0 libgl1 libegl1 libxkbcommon0.

Full Changelog: v0.1.6...v0.1.7