diff --git a/TODO.md b/TODO.md index 5ea33f6..8085c34 100644 --- a/TODO.md +++ b/TODO.md @@ -193,6 +193,63 @@ rules beat what was built up by hand, and to feed every difference back into the to compare against; worth revisiting only as an alternate TTS backend for a second opinion on narration quality, or its MCP server for a quick engine A/B). No integration started. +### UI/UX and feature ideas from the VoiceStudio comparison — set 2026-09-29 + +From the deep-dive UI/UX comparison (`architecture/voicestudio-comparison.md`, "UI/UX and +feature-parity deep dive"). User picked these to build; telephony integrations (Twilio/ +Plivo/Telnyx) were in the same gap list but deliberately not picked -- leave that one alone. + +- [ ] **Projects menu: group Audiobooks, Magazines, Script Rehearsals and Video Dubbing + under one "Projects" nav section.** Currently `Reader` (audiobook), `Magazine` and + `Rehearser` are three separate top-level `nav-tree-head` sections in the sidebar + (`static/index.html`/served nav — see `data-nav-section="s-reader"` / + `"s-magazine"` / `"s-rehearser"`). Add a new "Projects" parent with these three as + submenu items, plus a fourth submenu item for the new Video Dubbing feature below (a + placeholder entry is fine until that feature exists, but say so in its UI rather than + linking to nothing silently). Update `Manual.md`'s navigation description and any + Playwright specs that assert the current nav structure. +- [ ] **Video Dubbing feature.** New capability, not currently in this app at all: upload a + video/audio file or paste a URL, transcribe it, translate to a target language (offer a + local/offline model, not only an LLM call -- see VoiceStudio's NLLB-200 option), then + re-synthesize speech timed to the original and mux it back into the video. This is a + multi-day feature (needs its own data model, a job pipeline, and a review UI, likely + similar in shape to the magazine pipeline's box/undo conventions) -- plan it properly + (goals, data model, API contract, error/offline behaviour) before implementing, per the + planning workflow, rather than bolting it onto an existing route file. +- [ ] **Live STT Dictation.** A global hotkey that starts listening, transcribes speech, and + inserts the resulting text into whatever field/app currently has focus -- distinct from + the existing "global hotkey daemon" in Connect Apps, which triggers TTS *playback*, not + speech-to-text insertion; do not conflate the two or reuse its name for this. Needs a + small native/OS-level component (focus capture, text insertion) similar in spirit to + VoiceStudio's Rust control sidecar -- decide the platform(s) to support first (this + household's own machines) rather than building a generic cross-platform solution + speculatively. +- [ ] **Onboarding / setup wizard.** Either (a) detect the local stack already configured + (Qwen3-TTS, vision OCR, the LLM router -- these already have URLs in Settings) and walk a + new install through pointing at them with a live check per engine, or (b) a single + one-click installer/setup flow that provisions everything needed, mirroring VoiceStudio's + tiered model packs (Fast/Balanced/Quality/Max, disk size shown before committing). Decide + which of (a)/(b) fits this app's actual deployment story (self-hosted, one household, engines + usually already running on the DGX) before building -- (a) is likely the better fit and + the smaller change; (b) only makes sense if this app starts bundling/installing its own + models rather than calling existing engine URLs. +- [ ] **Global command palette + cross-app "recent" history.** A `Ctrl`/`Cmd`+`K` palette to + jump to any section/action, and a unified "recent generations" view spanning Voice Clone/ + Design/Conversation/Magazine/Reader, not just each feature's own history (the magazine's + 20-step undo stack stays separate -- this is about *finding* a past generation across + features, not undoing one). Survey existing per-feature history/list endpoints first + (`/api/*/history`-shaped routes already exist for several features) so the palette reuses + them rather than duplicating state. +- [ ] **Curated voice-design preset gallery, integrated into the existing preset system.** + `s-design.html` already has save/load/delete for named presets (`design-preset-*`, + `routes` behind `design-preset-save`/`-load`/`-delete`) -- add a small built-in gallery of + named example personas (in VoiceStudio's style: "The Librarian", "The Anchor", …), each + with a one-line pitch and a pre-rendered demo clip, "Use this design →" filling the + description box from it. Ship a handful covering common needs (audiobook narrator, news + anchor, casual conversational, storyteller) rather than trying to match VoiceStudio's + exact catalog. Generate and store the demo clips once (not on every page load) and keep + them small (the existing 24 kHz mono WAV convention). + ### P0 — do first - [x] **S — Stop provider API keys from reaching frontend JavaScript or logs.** Provider keys are masked in settings