- Format endpoint now calls ACE-Step /format_input REST API directly instead of
spawning Python, fixing ENOENT errors on Windows (#44, #27, #34)
- isGradioAvailable() tries /gradio_api/info, /info, / in sequence to handle
Gradio 4.x/5.x/6.x version differences, fixing generation fallback (#53, #20)
- Storage getUrl/getPublicUrl normalize /audio/ prefix to prevent double-prefix
URLs when reference tracks are used for cover generation (#10)
- Gradio args: fix normalization_db default from 0.0 to -1.0 (Gradio default)
- Volume popover: add 400ms delay before hiding to prevent accidental dismissal (#51)
- Polling: skip setSongs state update when nothing changed to reduce re-renders (#51)
- FFmpeg: add jsdelivr CDN fallback when unpkg fails (#30)
- Model switching: add switchModelIfNeeded() via /v1/init REST API (#45)
- Replace all acestep-api/api_server.py references with acestep --enable-api
- Update Quick Start, Usage, and Configuration sections for Gradio
- Document AI Enhance toggle and its effect on genre accuracy
- Add troubleshooting entry for ballad output issue
- Wait message changed to "API endpoints enabled"
When enabled, uses the LLM to enrich genre/style tags into detailed
music descriptions and generate proper BPM, key, and time signature
metadata (CoT features). Fixes genre tags like "pop, rock" producing
ballad-like output by matching Gradio UI default behavior.
- Add enhance toggle in Style of Music card header
- Gate CoT metas/caption/language by enhance OR thinking flag
- Remove unsupported --lm-backend/--lm-model from Python fallback
- Add i18n translations (en/zh/ja/ko) with tooltip
- Make bottom player empty state a clickable button that plays first available song
- Guard togglePlay to show toast when audioUrl is missing instead of silently failing
- playNext/playPrevious now skip songs without audioUrl or still generating
- repeatMode 'none' stops at queue boundaries instead of wrapping
- Add ShareModal to mobile fullscreen player (was missing, share silently failed)
- Add spacebar play/pause keyboard shortcut (skips when typing in inputs)
- Add onPlayFirst prop to Player component
- Add selectSongToPlay i18n key (en, zh, ja, ko)
- Migrate backend from REST API to Gradio @gradio/client for generation
- Fix Gradio parameter alignment (positions 36-49) for reference/cover audio
- Add LoRA training pipeline with dataset upload, preprocessing, and export
- Add News page with dismiss/restore and GitHub star button
- Add localization info icon in Settings language section
- Fix upload audio URL prefix, add missing MIME types
- Add training API routes and Python preprocess script
- Update i18n with news keys for all languages
Phase 4.3: Largest component change. Adds cascading genre picker using
Phase 3 style data, DiT model selector with backend sync, EditableSlider
for all numeric parameters, LoRA load/unload panel, bulk generate, vocal
gender selector. Batch size max kept at 4 (not 8), inference steps max
kept at 32 (not 200) to prevent OOM. Added LoRA API stubs to api.ts.
Added ditModel to GenerationParams type.
Phase 4: i18n all 15 components from PR #19. Sidebar gains collapse/expand
toggle. Player gets playback speed selector (0.25x-2.0x) fixing bug B1
(hardcoded Chinese '正常'). SongList adds inline title editing and model
version badge. Delete actions now use ConfirmDialog instead of
window.confirm. Volume persisted to localStorage. Training nav item
deferred to Phase 7.
- ConfirmDialog: modal confirm with Escape/backdrop dismiss, danger styling, i18n labels
- EditableSlider: click-to-edit numeric slider with clamping and keyboard support
- vite-env.d.ts: type declarations for .txt raw imports
- Fixed missing title prop in EditableSlider interface from PR
- Add I18nContext provider with useI18n hook and localStorage persistence
- Add translations.ts with complete strings for English, Chinese, Japanese, Korean
- Wrap App in I18nProvider, replace hardcoded toast messages with t() calls
- Add language selector to SettingsModal with Globe icon
- Add localization credits in About section
- Default language: English
- Add I18N_USAGE.md documentation
AudioMass uses a custom fork of wavesurfer.js with getLoudness()
and other extensions. The dist/ folder was excluded by server/.gitignore.
Added gitignore exception for audio-editor/dist/.
- Add lmModel parameter through full chain (types, API, routes, service)
- Add LM Model dropdown in Advanced Settings (defaults to 0.6B)
- Pass lmModel and lmBackend to format/enhance endpoint
- Update format_sample.py to accept --lm-model and --lm-backend args
- Auto-download model from HuggingFace if not present locally
- Persist model selection in localStorage
- Improve format route error logging with exit code and stdout/stderr
Fixes#9
On Windows, 'localhost' can resolve to IPv6 ::1 instead of IPv4
127.0.0.1, causing ECONNREFUSED when the Vite dev proxy tries to
reach the Express server. Using explicit 127.0.0.1 avoids this.
Fixes#12
The onToggleLike handler expected a string songId but RightSidebar
was passing the entire Song object, causing a FOREIGN KEY constraint
error when SQLite received '[object Object]' as the song_id.
Fixes#22