Files
audio-demo/webui
steve-adminandClaude Sonnet 5 7569cdc322 Fix Characters tab: every selection errored, dropdown went stale
Real bug, not user error: Gradio refuses to serve a file back to the
browser unless it lives under the app's own directory, the system
temp dir, or an explicit allowlist. Every character's reference audio
lives in the-service-station repo, a completely different path, so
selecting *any* character in the Characters tab threw
gradio.exceptions.InvalidPathError server-side (visible in the server
log, not surfaced usefully in the browser's generic error toast).
Fixed with launch(allowed_paths=[SERVICE_STATION_DIR]), the documented
fix for this exact error.

Also: the character dropdowns choices were fixed at server-start time,
so a character created earlier in the same running session did not
show up without manually clicking Refresh. Added a demo.load() hook to
refresh both dropdowns automatically on page load, in addition to
keeping the manual Refresh button for mid-session use without a full
reload.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Y1oQ4h4WE4R9KRvMQLr5Ey
2026-09-16 10:39:12 +00:00
..

webui

A pipeline studio: strip a voice with demucs, edit it with AuK (emotion, pitch, speed, free-form instructions — with preview and undo/reset), then generate new speech in that voice with MOSS-TTS.

Why this exists

Manually chaining demucs → AuK → MOSS-TTS across three separate venvs (via SSH one-off scripts) worked but made it slow to experiment — especially with AuK's pitch/emotion controls, where you really want to preview a result and back out if it's wrong (see the pitch-overshoot findings in auk/README.md) rather than committing to a specific edit blind.

Architecture

A single lightweight Gradio app (app.py) that shells out to each tool's own isolated venv via subprocess, rather than merging their dependencies into one environment — MOSS-TTS pins transformers==5.0.0, AuK needs 4.57.6; they can't coexist in one venv. This app's own venv only needs gradio itself.

Each stage's output becomes the next stage's input by filesystem path; a history list backs the undo/reset buttons in the voice editor.

Setup

python3 -m venv .venv && . .venv/bin/activate
pip install gradio

Assumes demucs/, auk/, and tts/ (siblings in this repo) already have their own working venvs and, for auk/, downloaded model weights — see their READMEs.

Running

python3 app.py

Serves on 0.0.0.0:7860. The app automatically calls ComfyUI's /free endpoint (if its queue is empty) before each heavy step, to reduce GPU contention on a shared box — see the DNS/routing and GPU-contention notes earlier in this project's history for why that matters here.

Known limitations (inherited from the underlying tools)

  • AuK's real usable clip length is ~25-30s, not several minutes — feeding it a long recording will OOM even with --cpu_offload (see auk/README.md). This app doesn't chunk long inputs automatically; keep reference clips short.
  • AuK's pitch-editing instruction-following is unreliable — even "1 semitone" has measured out at ~4+ semitones of actual shift in testing. The UI surfaces a warning; preview before trusting a pitch edit.
  • Each stage is a blocking subprocess call (model load + inference each time) — the UI will appear to hang for anywhere from ~10s to a couple of minutes per click, with no progress bar yet.
  • No queueing/locking across browser tabs or concurrent users — this is a single-GPU box, so two simultaneous generations will contend for VRAM.