Spaces:
Running on Zero
Running on Zero
Commit History
-
Feature parity with original Blocks UI Running
Three additions to close gaps with the original gradio.Blocks app: 1. Microphone recording (clone mode) - The reference section now has Upload / Record tabs - Record uses MediaRecorder + getUserMedia, with a big red pulsing mic button, live time display, and a 60s cap - Stopping the recording turns it into a File the same way an upload would, so the rest of the pipeline is identical 2. Lazy example caching (like gr.Examples(cache_examples='lazy')) - On boot, the first 3 examples are pre-synthesized in the background and their audio is held in an in-memory cache - Clicking a cached chip plays the pre-built audio instantly; uncached chips synthesize on click (and then become cached) - Each chip shows a status glyph (... / ✓ / !) so you can see what's been warmed 3. Download button - Round ↓ icon next to play/stop in the transport - Downloads the current WAV with a sensible filename (gepard-<voice>-<label>.wav for cached examples, …f12cb60 -
Mobile + tablet responsive layout
Three breakpoints: 900px (tablet), 600px (phone), 380px (small phone). Phone (< 600px): - Top bar: drop the "Session" project info, keep just the brand and the Ready/Rendering status pill - Stage: tighter padding, 22px type, more vertical room - Transport: full-width skip/play buttons with 44px tap targets, voice info row hidden - Console source row stacks vertically (mode toggle full-width, voice select full-width below, Advanced toggle as its own row) - Advanced panel single-column sliders - Examples wrap above the render button; render is full-width primary CTA with a 12px vertical padding - Toast slides up from the bottom as a fixed bar so it stays visible above the on-screen keyboard Tablet (< 900px): tighter margins, 2-column advanced summary Co-Authored-By: Claude <noreply@anthropic.com>9652c03
-
Unified script stage + advanced settings + refined design language
Single-stage script editor: - The text area in the viewport doubles as both the input and the highlight-on-playback display. Placeholder shown when empty. - On focus, word highlighting clears so the user can edit freely; re-tokenizes into word spans when audio loads. - Auto-plays after render. Click the script area to edit; the highlight pauses until focus is lost. Advanced settings collapsed by default: - A summary line shows current values (Temperature 0.30, Top-K 0, etc.) in a single row, behind a chevron toggle. - Expanding reveals the sliders in a responsive grid. - Default state hides them to keep the surface calm. Render button: - Compact pill-style button with a 14px icon + label, sitting inline in the action row next to the example chips. - Dark surface (var(--text)) on white background, subtle shadow, hover lift. Design language: - Light surface (#fafafa), warm gray text, hairline borders - SF Pro / Inter type stack with refined -0.015em letter spacing on the…db8cff9 -
Replace waveform with highlighted lyrics, condense controls, drop channel strip
- Viewport output is now the LYRICS preview, not a waveform: 28pt centered text with the current word glowing amber + scaled up, past words fading to 55% opacity, upcoming words at 35%. Auto- scrolls to keep the current word in view. - Click anywhere in the lyrics viewport to seek (vertical position maps to time, like a waveform scrub). - Removed the channel strip (fader/meter/pan/mute). The audio graph and metering were tied to those controls, so the visual meter is gone with them — playback still works. - Combined the bottom 3 panels (Source+Script, Mix+Render, Channel) into ONE "Console" panel with a 2-column body: Source/Script on the left, Parameters/Library/Render on the right. - Render button is now smaller and inline at the bottom-right of the Console panel, with the toast next to it. Co-Authored-By: Claude <noreply@anthropic.com>27faf0f -
Video-studio layout: audio viewport dominates the screen
New hierarchy with the audio output as the centerpiece: - Top bar: project header (logo + "Untitled Session" + version tag) - AUDIO VIEWPORT (full-width, dominant): - Program header with red REC dot + Stage pill (Idle / Rendering / Playing / Paused / Ready / Error) - Big HH:MM:SS:FF timecode display (38pt) with Duration / SR / Ch metadata on the right - Large 220px waveform with amber playhead (arrow tip at top) - TIMELINE strip with HH:MM:SS ruler ticks and a single track containing an amber "Clip" block that fills as audio plays, plus a synced mini-playhead - Transport: round skip-back + round amber play button, with Voice / Codec info on the right - WORKSPACE (3-column below the viewport): - Source + Script (with contenteditable word highlighting) - Mix + Render (sliders, examples, Render button) - Channel (fader, meter, pan, mute) - Word-by-word highlight still tied to (currentTime/duration) - Timecode FF field computed from sub-second progress (…7b05c4f -
Pure DAW layout with word-by-word script highlight
Pure DAW: dropped the ChatGPT conversation style, back to a 3-column Track / Master / Channel Strip layout — but kept the clean dark surface, DAW-style sliders, and proper transport bar. Script editor with word-level highlight as audio plays: - Replaced the plain textarea with a contenteditable script panel - Tokenizes into per-word <span> nodes on input (whitespace preserved) - After audio loads, requestAnimationFrame loop computes the current word index from (currentTime / duration) * wordCount - The current word gets an amber background + bold; past words fade to faint. Stays in sync visually for short utterances. - Highlighting clears on stop / track-end Channel strip keeps the working fader -> GainNode, pan knob -> StereoPannerNode, and LED meter -> AnalyserNode. Co-Authored-By: Claude <noreply@anthropic.com>2c6404d -
Garageband + ChatGPT-style UI
White surface, conversational interface. Layout: - Left sidebar: voice list as horizontal track rows (Garageband-style) with avatar, voice name, and voice key tag - Center: ChatGPT-style conversation. User messages bubble on the right ("You"), assistant responses bubble on the left ("G"). Each generation shows up as an audio bubble with its own play button, waveform, time display, and click-to-seek. - Composer at the bottom: large text input that auto-resizes, with Preset/Clone toggle on the left and a gradient send button on the right. Enter to send, Shift+Enter for newline. - Right sidebar: generation parameters as ChatGPT-style sliders, plus a collapsed reference uploader for clone mode - Top bar: just the logo, nothing elseichten - Examples appear as small chips below the composer - Audio bubbles get their own waveform drawing and playback (no shared transport) Co-Authored-By: Claude <noreply@anthropic.com>fedd281 -
Prune UI to studio essentials
Dropped: - Top bar connection dot / busy indicator (state shows on the generate button itself) - "TRACK · INPUT" / "MASTER · OUTPUT" / "CHANNEL 01" subheadings - Status footer (queue / ETA / latency / codec bar at the bottom) - Live-generating animated waveform bars (the button spinner covers it) - Stop / loop transport buttons - Solo button (mute is enough) - "Library" panel for examples (moved inline under generate) - Sample-rate / channels metadata (decoding clutter) - Radial gradient body background Kept (the studio signature): - 3-column work area: Track | Master | Channel - Functional channel strip: vertical fader → GainNode, pan knob → StereoPannerNode, real LED meter via AnalyserNode - RMS waveform with click-to-seek playhead - DAW-style sliders with mono right-aligned values - Segmented mode control Co-Authored-By: Claude <noreply@anthropic.com>f108f27 -
Add professional channel strip to UI
Three-column DAW layout: Track | Master | Channel Strip. Channel strip includes real pro-studio controls: - Functional vertical fader with draggable cap, mapped to a Web Audio GainNode so it actually controls output volume - Segmented LED-style level meter that reads from an AnalyserNode and lights up green/yellow/red while audio plays - Rotary pan knob (pointer-drag) mapped to a StereoPannerNode - Mute / Solo buttons with console-style styling - Transport bar now has Play/Pause, Stop, and Loop buttons Other polish: - Denser dark surface, smaller radius, lower-contrast lines - RMS-style waveform in the master section - Status footer streams queue position/ETA via Gradio's SSE Co-Authored-By: Claude <noreply@anthropic.com>d7a4755 -
Redesign UI as a professional DAW-style audio studio
Linear/Logic/Ableton-inspired single-surface layout with: - Top bar: brand mark + live connection dot - Two-column work area: TRACK (source/script/mix) + MASTER (output) - Channel-strip master output with transport (large mono time display, RMS-style waveform, click-to-seek progress overlay) - Live waveform state during generation (animated amber bars) while the audio is being synthesized - DAW-style sliders: thin track + square amber thumb + monospace right-aligned value - Segmented control for mode toggle (preset vs clone) - Status footer: Stage / Queue / ETA / Latency / Codec - Switched from client.predict() to client.submit() so the JS client streams Gradio status events (queue position, ETA, stage) via SSE and updates the footer in real time as the request moves through pending -> generating -> complete Co-Authored-By: Claude <noreply@anthropic.com>0d0185f -
Serve / as HTMLResponse so the browser renders it
The plain `return f.read()` was being returned as `text/plain` (FastAPI's default for str). Browsers render text/plain as literal source — which is why the UI showed the raw HTML/CSS dump instead of the page. Switch to `HTMLResponse(content=...)` to set Content-Type: text/html. Co-Authored-By: Claude <noreply@anthropic.com>c42b6ea -
Add editdistance + remaining [tts]-extra deps
editdistance was dropped during the requirements.txt rewrite — NeMo's asr.metrics.wer imports it at module load (pulled in transitively by the audio codec import chain). Restored. Also pre-install the remaining platform-conditional [tts]-extra deps: bitsandbytes==0.45.5 and sox<=1.5.0 (both linux x86_64, which is what HF Spaces runs on). nemo_text_processing is intentionally left out — it pulls pynini==2.1.6.post1, a heavy C++ build. Add only if the runtime hits an ImportError naming it. Co-Authored-By: Claude <noreply@anthropic.com>19911a2 -
Pre-install the full NeMo [tts] dep graph at build time
Stop playing ImportError whack-a-mole. The --no-deps nemo install was discovering NeMo's ~40 transitive deps one missing module at a time (regex, tokenizers, matplotlib, seaborn, …). Now every dep NeMo's [tts] extra needs — minus the one conflicting `transformers<=4.52` pin — is pre-installed at build time, so installing nemo-toolkit itself with --no-deps at runtime doesn't miss anything. Complete list sourced from pypi.org/pypi/nemo-toolkit/2.4.0/json (the `tts` extra): librosa, soundfile, omegaconf<=2.3, webdataset, pandas, matplotlib, seaborn, einops, kornia, lhotse, lightning, peft, torchmetrics, datasets, hydra-core<=1.3.2, nltk, janome, jieba, pypinyin, mediapy==1.1.6, sentencepiece<1.0.0, sacremoses, texterrors<1.0.0, jiwer, pydub, pyloudnorm, resampy, pyannote.core, pyannote.metrics, optuna, marshmallow, fiddle, cloudpickle, wandb, cdifflib, attrdict, braceexpand, kaldi-python-io, whisper_normalizer, num2words, inflect, numba, ruamel.yaml, scikit-learn, tensorboard, onnx, prot…0bd0eaf
-
Add matplotlib (NeMo TTS losses runtime dep)
nemo.collections.tts.parts.utils.helpers imports matplotlib.pylab at module load, triggered by importing AudioCodecModel. Was skipped by the --no-deps nemo install path. Co-Authored-By: Claude <noreply@anthropic.com>810f18c -
Pin tokenizers to transformers 5.3.0's accepted range
transformers 5.3.0 requires tokenizers>=0.22.0,<=0.23.0; the resolver pulled 0.23.1 which fails dependency_versions_check at import time. Pin to the accepted range. Co-Authored-By: Claude <noreply@anthropic.com>34830b7 -
Pre-add tokenizers (transformers 5.x runtime dep)
Avoids another build-fail cycle if the next import in transformers' boot path needs it. Small Rust extension, ~5MB. Co-Authored-By: Claude <noreply@anthropic.com>64cc6da -
Add regex to requirements (transformers 5.x runtime dep)
transformers/utils/auto_docstring imports regex at module load. Was missed by the --no-deps nemo install path. Pin it at build time so the Space starts without ImportError. Co-Authored-By: Claude <noreply@anthropic.com>77c7ef9 -
Move nemo-toolkit install to runtime to unblock gradio 6.20 build
The previous upgrade failed at build time because: - gradio 6.20 requires huggingface-hub>=1.2 - nemo-toolkit[tts]==2.4.0 pins transformers<=4.52 (4.51.x) - transformers 4.51.x requires huggingface-hub<1.0 pip refuses to resolve these together. Move the nemo install to create_env.py so it happens after we've pinned transformers==5.3.0 + hub>=1.2 with --no-deps — sidestepping the resolver conflict. - requirements.txt: remove nemo-toolkit[tts]; list its common runtime deps explicitly (librosa, soundfile, omegaconf, webdataset, pandas, etc.) since --no-deps skips them. - create_env.py: rewrite as a 3-step install — pin transformers+hub, install nemo with --no-deps, cap numpy<2.0. - README.md: document the new install dance. - app.py: update the startup-order docstring. Co-Authored-By: Claude <noreply@anthropic.com>98ed9bf -
Upgrade gradio to 6.20
Bump sdk_version to 6.20.0 in README frontmatter and pin gradio==6.20.0 in requirements.txt. Drop the now-irrelevant comments about the 5.49 bridge release and the NeMo/huggingface-hub conflict. Co-Authored-By: Claude <noreply@anthropic.com>7e251df -
Convert to gradio.Server backend with custom HTML frontend
Replace the gr.Blocks UI with a self-contained dark-themed HTML/CSS/JS frontend served at /, and expose synthesis via @app.api("/synthesize") so it flows through Gradio's queue (concurrency, ZeroGPU, gradio_client). - app.py: gradio.Server with @app.api() for synthesize, @app.get("/") for the HTML, @app.get("/config.json") for frontend bootstrap data. Same 9-parameter synthesize() signature; audio saved as 16-bit PCM WAV to _out/ and returned as FileData. - index.html (new): dark studio layout — gradient header, status badge, mode toggle, speaker dropdown, drag-drop reference upload, collapsible generation-settings panel, canvas waveform player with seek, example chips. Talks to the backend via @gradio/client JS. - requirements.txt: add scipy (used for WAV writing). - README.md: document the new architecture. - .gitignore: ignore the _out/ WAV directory. Co-Authored-By: Claude <noreply@anthropic.com>c2a69f5
-
Update speaker list
6676f44 -
Change speakers list
9a6fdca
-
Make final list of speakers
5c7da41 -
Update README.md
Verified signatureca53e94 -
Update config.yaml
Verified signature6b05df7 -
Swap example voices: Tony->Sean (Boston chat), Sofía->Diego (Spanish)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>dd45678 -
Shorten example phrases (~8-10s); neutral Sofía line, drop Tony's "capisce"
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>b1d8e94 -
Expand preset roster to 18 multilingual voices with labeled examples
- Add regional voices (Brazilian, Boston, Oakland, American, Mexican, Dutch, Scottish, Scouse) plus Elon; drop Ulan - Give every speaker a flag-emoji human-readable label - Replace examples with 10 rows, one per accent group, each in its native language (pt-BR, es-MX, nl) or accented English, ~15-20s each Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>89cc2b2 -
Simplify header subtitle
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>a0e6b2d -
Trim generation UI: cap sliders, slimmer styling, drop stop-threshold
- Max frames slider now 43..1075 step 43 (2s/notch, 50s ceiling) so it can't exceed the intended cap. - Slimmer sliders via CSS (thinner track + smaller thumb). - Temperature slider max 1.5 -> 1.0 (usable band only). - Remove Stop threshold slider; value comes from config.defaults like CFG. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>583db09 -
Length-gate text-CFG, hide CFG knobs, cap max_frames
- Runner disables CFG (cfg_scale->1.0) when text exceeds generation.cfg_max_text_tokens (default 10): CFG helps short phrases but rushes/flattens long ones. - AppConfig parses generation.cfg_max_text_tokens; engine passes it to the runner. - Remove CFG scale / CFG frames sliders from the UI; strength now comes from config defaults, application from the length gate. app.py sources both from config.defaults. - Default max_frames 2000 -> 1075 (~50s at 21.5 fps). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>18101d9 -
Add preset examples table at page bottom
Replace the inline text-only examples with a full-width (speaker, text) table below the settings. Clicking a row loads the pair and plays its audio into the output player; cache_examples="lazy" generates once in a ZeroGPU request then replays from cache. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>0ec888c -
Restore Generated speech label on output audio
Keep the output label visible; it names the result rather than reading like a button. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>7d3e1f3 -
Hide redundant/button-like field labels in UI
Preset speaker, Voice source, Text and Generated speech labels rendered as orange chips that read like buttons. Hide them with show_label=False (labels kept for screen readers). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>48220a9 -
Button to the right side
4ed8ce4
-
Update README.md
Verified signature78b1525 -
fix deps 1
42a3194 -
init
f45c5e8 -
initial commit
Verified signaturebc7cd12