Umbra Tools 31cd9f7ce4 Record the paragraph-boundary drift and how it is now caught
The production Chinese re-flows the passage across paragraph ids in the
places where Pass 0 split the original mid-sentence. Measured: 439 of
3,038 translated paragraphs (14.5%) are sentence fragments, and in ch-15
the drift runs p0094-p0104 - eleven paragraphs whose Chinese is good but
attached to the wrong paragraph.

The alignment pass cannot see this by construction: a one-to-one paragraph
is a pure copy, so there is nothing to divide and nothing to disagree.

The verification stage finds it, and the spec records how it was made
precise. The first version asked two yes/no questions per paragraph and
was wrong in both directions - five of fifteen flags were paragraphs it
claimed were missing an adverb that was present, and it missed two
paragraphs that are drifted. The stage now asks which paragraph a
translation renders, shows the model its neighbours, and judges the
paragraphs as a window rather than one at a time.

On the real ch-15 window it now finds exactly the drift: ten paragraphs
dropped, p0094 kept and flagged because its Chinese correctly renders its
first two sentences.

Also recorded: the cost of the choice (a gap where a fragment inside a
broken window is dropped on an unreliable verdict) and the root cause
(the drafter is not told that each id must cover only its own English).
2026-11-06 21:26:21 -08:00

UmbraAudio

Quality-first multi-pass audiobook generation from English manuscripts.

Features

  • 5-pass pipeline: Analysis → Voice Design → Mapping → Test → Generate
  • Multi-engine TTS: Chatterbox (primary), Qwen3-TTS (secondary)
  • LLM-enhanced: BookNLP for NLP, LLM for profiling/emotion/pronunciation
  • Web review: FastAPI + HTMX at checkpoints for human approval

Quick Start

python -m umbraaudio.cli init <manuscript.epub> --name 'My Book'
python -m umbraaudio.cli analyze
python -m umbraaudio.cli voices
python -m umbraaudio.cli review

Requirements

  • Python 3.11+
  • NVIDIA GPU with CUDA support (RTX 3060 or better recommended)
  • ffmpeg

Development

pip install -e ".[dev]"
ruff check umbraaudio/
pytest tests/ -v

Commit cadence: commit at least once every Sunday. Never leave a week (let alone a month) of work uncommitted — a single accidental git checkout on 2026-09-20 wiped out a month of changes to umbraaudio/web/routes.py. See AGENTS.md → Commit Cadence.

scripts/commit_check.sh enforces the nudge: it exits non-zero once the tree has been dirty longer than a week. The LaunchAgent com.umbraaudio.commitcheck runs it every Sunday at 18:00 and posts a macOS notification when there is uncommitted work.

scripts/commit_check.sh            # warn if dirty > 7 days
scripts/commit_check.sh --days 3   # tighter threshold
scripts/commit_check.sh --any      # warn on any uncommitted change

Rebuilding from source

The repo tracks source only; large runtime data is reconstructed as needed.

  1. Models: weights are not committed (see .gitignore). Download them:

    bash scripts/download_models.sh   # ~9 GB, targets ./models
    
  2. Qwen3-TTS is a git submodule pinned to upstream commit 022e286:

    git submodule update --init --recursive
    

    The tts_server/web-demo backend includes a local UI customization to qwen_tts/cli/demo.py. It is preserved as a patch — reapply it after checking out the submodule:

    cd Qwen3-TTS && git apply ../scripts/qwen3_tts_demo_umbra_patch.patch
    
  3. Environment: copy/keep .env (contains secrets) and set UMBRA_TTS__* model paths under models/.

Book projects (e.g. DealHunterShip_...) are committed separately under their own project directories and are not part of this program repository.

Description
Quality-first multi-pass audiobook generation pipeline (5-pass: Analysis -> Voice Design -> Mapping -> Test -> Generate). FastAPI+HTMX review UI, Edge-TTS/Qwen3-TTS multi-engine voice, SQLite state.
Readme Apache-2.0 37 MiB
Languages
Python 84.8%
HTML 11.4%
Shell 3%
PLpgSQL 0.7%