Skip to content

v0.9.0

Latest

Choose a tag to compare

@github-actions github-actions released this 06 Jul 14:45

Features

  • Docker support for self-hosted web mode — a multi-stage docker/Dockerfile and docker/compose.yaml build the server binary (with the React bundle embedded) into a container that runs without the systemd/Caddy/Avahi installer. The same Dockerfile produces both a CPU image (debian:bookworm-slim) and a CUDA/GPU image (via --build-arg RUNTIME_BASE=nvidia/cuda:... plus the NVIDIA Container Toolkit). The ML toolchain still bootstraps on first launch into the mounted /data volume, so the image stays small and dependencies persist across recreates. The data folder is fixed to /data (the setup wizard skips the data-folder step) and the music library follows a /songs convention via a new NIGHTINGALE_LIBRARY_PATH env var (defaulted in the image) — mount your music at /songs and Nightingale pins a folder source there on startup and hides the in-app source pickers, so nothing needs typing in the browser. Mic scoring still needs a TLS reverse proxy for a secure context. See docs/docker.
  • Cantonese (yue) lyric support — Cantonese now joins Japanese, Mandarin, and Korean as a first-class CJK language. It rides the same per-character forced-alignment path as Mandarin (reusing the Chinese wav2vec2 model and jieba tokenization, since Cantonese is written in the same Han characters), works with the Qwen alignment backend, and shows Jyutping romanized readings above each token. The per-song language override now lists Mandarin and Cantonese separately (the former "Chinese" label). Existing installs should re-run setup so the new Cantonese romanization dependency is installed.
  • Experimental CTC forced-alignment backend — Settings → Analysis → Forced alignment can now use torchaudio's forced_align C++/CUDA kernel instead of WhisperX's pure-Python Viterbi. It computes each word's start/end points with a different algorithm, and is much faster on CUDA GPUs and Apple Silicon (where WhisperX alignment runs on the CPU). It also speeds up LRCLIB lyrics alignment and automatically falls back to WhisperX on error. Defaults to WhisperX, so existing behavior is unchanged unless you opt in.
  • Experimental Qwen forced-alignment backend — Settings → Analysis → Forced alignment can also use Qwen3-ForcedAligner-0.6B, a non-autoregressive model that timestamps every token in one forward pass from audio + transcript (no wav2vec2, no phonetic step). It's fast and covers 11 languages, runs on CUDA and Apple Silicon MPS (as well as CPU), and falls back to WhisperX for unsupported languages, over-length audio, or any error. Timing quality varies song to song, but it can do better on CJK. Defaults to WhisperX, so existing behavior is unchanged unless you opt in. Existing installs should re-run setup so the new Qwen dependencies are installed.
  • Adjustable vocal-detection sensitivity — Settings → Analysis → Vocal detection sensitivity exposes the RMS threshold that decides where a song's vocals start and end. Lower it when quiet intros, outros, or soft singing get trimmed; raise it to cut more silence. Defaults to 15%, matching previous behavior.

Improvements

  • Clearer analysis settings — the vocal separator, transcription model, and alignment model options now have plain-language descriptions explaining what each choice actually changes.
  • Smoother lyrics display across short pauses — a finished line now stays on screen with its already-sung word colors until the next line's lead-in begins, instead of vanishing the moment it ends. Longer gaps still show the countdown as before.

Fixes

  • Fixed Settings page focus rings: tabs, buttons, and the beam/batch number pickers no longer show clipped borders or a brief shrink flicker on hover. The page now uses the same focus-ring style as the rest of the app (removing the ring-offset that got clipped by the scroll containers) and the number pickers have room for the ring.