[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-75024":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":23,"hasPages":23,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":45,"readmeContent":46,"aiSummary":47,"trendingCount":16,"starSnapshotCount":16,"syncStatus":48,"lastSyncTime":49,"discoverSource":50},75024,"nightingale","rzru\u002Fnightingale","rzru","Machine learning powered Karaoke app (with scores!) ","https:\u002F\u002Fnightingale.cafe",null,"TypeScript",1149,79,10,5,0,7,19,43,21,81.51,"GNU General Public License v3.0",false,"master",[26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44],"ai","bevy-engine","demucs","karaoke","karaoke-application","karaoke-game","machine-learning","machine-learning-algorithms","ml","party","react","rust","shadcn","tailwind","tauri","tauri-app","whisper","whisper-ai","whisperx","2026-06-12 04:01:17","\u003Cp align=\"center\">\n  \u003Cimg src=\"client\u002Fsrc\u002Fassets\u002Fimages\u002Flogo.png\" alt=\"Nightingale\" width=\"400\">\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  Karaoke from any song in your music library, powered by neural networks.\n\u003C\u002Fp>\n\n---\n\nNightingale scans your music folder, separates lead vocals from instrumentals using the [UVR Karaoke model](https:\u002F\u002Fgithub.com\u002FAnjok07\u002Fultimatevocalremovergui) (or [Demucs](https:\u002F\u002Fgithub.com\u002Ffacebookresearch\u002Fdemucs)), transcribes lyrics with word-level timestamps via [WhisperX](https:\u002F\u002Fgithub.com\u002Fm-bain\u002FwhisperX), and plays it all back with synchronized highlighting, pitch scoring, key\u002Ftempo controls, profiles, and dynamic backgrounds.\n\nShips as a single binary. No manual installation of Python, ffmpeg, or ML models required — everything is downloaded and bootstrapped automatically on first launch.\n\n## Features\n\n🎤 **Stem Separation** — isolates lead vocals from instrumentals using the UVR Karaoke model (default) or Demucs, with adjustable guide vocal volume. The karaoke model preserves backing vocals in the instrumental for a more natural sound\n\n📝 **Word-Level Lyrics** — automatic transcription with alignment, or fetched from [LRCLIB](https:\u002F\u002Flrclib.net) when available\n\n🈯 **CJK Lyric Support** — Japanese, Chinese, and Korean songs get per-character forced alignment and romanized readings (Hepburn \u002F pinyin \u002F Revised Romanization) shown above each token\n\n🗣️ **Pluggable ASR Engines** — choose Whisper (default, broad language coverage) or **Parakeet v3 (experimental)** for ~25 European languages, with NeMo on CUDA and ONNX Runtime everywhere else\n\n🎼 **UltraStar Deluxe Songs (experimental)** — drop USDX song folders (`.txt` or `.usdx` plus sibling audio\u002Fvocals\u002Finstrumental\u002Fvideo) into your library; pitch and lyric data come from the file directly, no analyzer pass needed. See [docs\u002Fusdx](site\u002Fdocs\u002Fsrc\u002Fusdx.md)\n\n🎯 **Pitch Scoring** — real-time microphone input with pitch detection, star ratings, and per-song scoreboards\n\n🎚️ **Key & Tempo Shifts** — adjust song key and tempo after analysis, with cached playback variants for quick retries\n\n👤 **Profiles** — create and switch between player profiles; scores are tracked per profile\n\n🎬 **Video Files** — drop video files (`.mp4`, `.mkv`, etc.) into your music folder; vocals are separated from the audio track and the original video plays as a synchronized background\n\n🌌 **Audio-Reactive Backgrounds** — 10 GPU shaders that react to your microphone in real time (Plasma, Waves, Nebula, Starfield, Sonar, Voronoi, Vortex, Metaballs, Spectrum, Oscilloscope), Pixabay video loops in 5 flavors (Nature, Underwater, Space, City, Countryside), plus source-video playback for video files\n\n🧭 **Sidebar + Library Filters** — quick filters, metadata cleanup buckets, artist\u002Falbum groups, and an **Analyze All** action for bulk analysis\n\n🎙️ **Mic Mirroring** — optionally route your live mic into playback for low-latency practice and monitoring, with an adjustable monitor gain (0–200%) in Settings\n\n🎮 **Gamepad Support** — full navigation and control via gamepad (D-pad, sticks, face buttons)\n\n📺 **Adaptive UI Scaling** — scales to any resolution including 4K TVs\n\n📦 **Self-Contained** — ffmpeg, uv, Python, PyTorch, and ML packages are downloaded automatically during setup. Video backgrounds are pre-downloaded so the first session is ready to go\n\n⬆️ **In-App Updates** — on macOS and Windows, auto-checks for new releases at launch, badges the sidebar avatar when one is available, and downloads and installs signed updates with one click. Linux is manual: the **Update** entry opens GitHub Releases for you to grab the new build\n\n## Quick start\n\nDownload the latest release for your platform from the [Releases](..\u002F..\u002Freleases) page and run it. On first launch, Nightingale shows setup steps, lets you pick a data folder, then installs the Python environment and ML models automatically.\n\n## Updates\n\nOn macOS and Windows, Nightingale checks for new releases once at launch. When one is available, the sidebar avatar grows a small green dot and the **Update** entry in the dropdown menu opens a dialog with the release notes. Click **Install & Restart** and the app downloads the signed bundle, installs it, and relaunches. On Windows the installer runs in `passive` mode — a small progress window flashes and the app comes back automatically once the install finishes.\n\n### Linux\n\nAuto-update is **not supported on Linux** — the app ships without the updater plugin. The **Update** entry still appears in the sidebar menu, but it just opens a dialog explaining this with a one-click button to the [Releases](..\u002F..\u002Freleases) page so you can grab the new `.deb` or `.rpm` and install it the usual way for your distro.\n\n### macOS\n\nmacOS quarantines files downloaded from the internet. Since Nightingale isn't signed with an Apple Developer ID, Gatekeeper will block it with a message like _\"app is damaged and can't be opened\"_. To fix this, remove the quarantine attribute after moving the Nightingale.app to Applications:\n\n```bash\nxattr -cr \u002FApplications\u002FNightingale.app\n```\n\n### Supported formats\n\nAudio: `.mp3`, `.flac`, `.ogg`, `.wav`, `.m4a`, `.aac`, `.wma`. Video: `.mp4`, `.mkv`, `.avi`, `.webm`, `.mov`, `.m4v`. UltraStar: `.usdx`, plus `.txt` files whose contents look like USDX.\n\n## Controls\n\n### Navigation\n\n| Action           | Keyboard       | Gamepad            |\n| ---------------- | -------------- | ------------------ |\n| Move             | Arrow keys     | D-pad \u002F Left stick |\n| Confirm \u002F Select | Enter          | A (South)          |\n| Back \u002F Cancel    | Escape         | B (East) \u002F Start   |\n| Switch panel     | Tab            | —                  |\n| Search songs     | Type to filter | —                  |\n\n### Playback\n\n| Action                  | Keyboard          | Gamepad   |\n| ----------------------- | ----------------- | --------- |\n| Pause \u002F Resume          | Space             | Start     |\n| Exit to menu            | Escape            | B (East)  |\n| Toggle guide vocals     | G                 | —         |\n| Guide volume up\u002Fdown    | + \u002F -             | —         |\n| Cycle background theme  | T                 | —         |\n| Cycle video flavor      | F                 | —         |\n| Toggle microphone       | M                 | —         |\n| Next microphone         | N                 | —         |\n| Toggle mic mirroring    | R                 | —         |\n| Toggle fullscreen       | F11               | —         |\n| Skip Intro \u002F Skip Outro | On-screen buttons | A (South) |\n\n## How it works\n\n```mermaid\nflowchart TD\n    A[\"Audio or video file\"] --> B[\"UVR Karaoke \u002F Demucs\"]\n    A2[\"USDX bundle (.txt \u002F .usdx)\"] --> E[\"Tauri App (Rust + React)\"]\n    B -->|\"vocals + instrumental\"| C[\"LRCLIB\"]\n    C -->|\"synced lyrics if available\"| D[\"WhisperX or Parakeet v3 (exp.)\"]\n    D -->|\"word-level alignment, CJK reading\"| E\n    E --> F[\"Plays instrumental + synced lyrics with pitch scoring, key\u002Ftempo, mic mirroring, audio-reactive backgrounds\"]\n```\n\nThe analyzer runs as a persistent local process: Nightingale starts it once and talks to it over a token-authenticated loopback TCP socket using newline-delimited JSON, so per-song startup overhead (model load, CUDA init) is paid only once.\n\nAnalysis results are cached using blake3 file hashes. Re-analysis only happens if the source file changes, the user triggers it manually, or you choose to shift key\u002Ftempo and create playback variants. USDX songs skip stem separation entirely when `#VOCALS` and `#INSTRUMENTAL` are provided.\n\n## Hardware\n\nThe Python analyzer uses PyTorch and auto-detects the best backend:\n\n| Backend | Device        | Notes                                       |\n| ------- | ------------- | ------------------------------------------- |\n| CUDA    | NVIDIA GPU    | Fastest                                     |\n| MPS     | Apple Silicon | macOS; WhisperX alignment falls back to CPU |\n| CPU     | Any           | Slowest but always works                    |\n\nThe UVR Karaoke model uses ONNX Runtime and enables CUDA acceleration automatically on NVIDIA GPUs, or CoreML on Apple Silicon.\n\nA song typically takes 2–5 minutes on GPU, 10–20 minutes on CPU.\n\n## Data storage\n\nDuring setup, you can choose where Nightingale stores data (default: `~\u002F.nightingale`). Most runtime data is stored in that selected data folder, while `config.json` and `nightingale.log` remain in `~\u002F.nightingale`.\n\nTypical selected data folder layout:\n\n```\n\u003Cselected-data-folder>\u002F\n├── cache\u002F               # Stems, transcripts, lyrics, shifted variants, covers, playable videos\n├── songs.db             # SQLite song library and analysis metadata\n├── profiles.json        # Player profiles and scores\n├── videos\u002F              # Cached Pixabay video backgrounds\n├── sounds\u002F              # Sound effects (celebration)\n├── vendor\u002F\n│   ├── ffmpeg           # Downloaded ffmpeg binary\n│   ├── uv               # Downloaded uv binary\n│   ├── python\u002F          # Python 3.10 installed via uv\n│   ├── venv\u002F            # Virtual environment with ML packages\n│   ├── analyzer\u002F        # Extracted analyzer Python scripts\n│   └── .ready           # Marker indicating setup is complete\n└── models\u002F\n    ├── torch\u002F           # Demucs model cache\n    ├── huggingface\u002F     # WhisperX model cache\n    └── audio_separator\u002F # UVR Karaoke model cache\n```\n\n`~\u002F.nightingale\u002Fconfig.json` stores app settings, including the selected data folder path.\n\n### Video backgrounds\n\nPixabay video backgrounds use the [Pixabay API](https:\u002F\u002Fpixabay.com\u002Fapi\u002Fdocs\u002F). The API key is embedded in release builds. For development, create a `.env` file at the project root:\n\n```\nPIXABAY_API_KEY=your_key_here\n```\n\n## Building from source\n\n### Prerequisites\n\n| Tool       | Version                                                                                                               |\n| ---------- | --------------------------------------------------------------------------------------------------------------------- |\n| Rust       | 1.85+ (workspace uses edition 2024)                                                                                   |\n| Node.js    | 20+                                                                                                                   |\n| pnpm       | latest                                                                                                                |\n| Linux only | `libwebkit2gtk-4.1-dev`, `libssl-dev`, `libayatana-appindicator3-dev`, `librsvg2-dev`, `libxdo-dev`, `libasound2-dev` |\n\n### Development\n\n```bash\ngit clone \u003Crepo-url> nightingale\ncd nightingale\ncargo desktop dev\n```\n\n### Release build\n\n```bash\ncargo desktop build\n```\n\n## Supported platforms\n\n| Platform       | Target                      |\n| -------------- | --------------------------- |\n| Linux x86_64   | `x86_64-unknown-linux-gnu`  |\n| Linux aarch64  | `aarch64-unknown-linux-gnu` |\n| macOS ARM      | `aarch64-apple-darwin`      |\n| macOS Intel    | `x86_64-apple-darwin`       |\n| Windows x86_64 | `x86_64-pc-windows-msvc`    |\n\n## Releasing\n\nReleases are cut by [`.github\u002Fworkflows\u002Frelease.yml`](.github\u002Fworkflows\u002Frelease.yml) on any `v*` tag push. The workflow:\n\n1. Verifies the tag matches the `version` in [`client\u002Fsrc-tauri\u002Ftauri.conf.json`](client\u002Fsrc-tauri\u002Ftauri.conf.json), [`client\u002Fsrc-tauri\u002FCargo.toml`](client\u002Fsrc-tauri\u002FCargo.toml), and [`client\u002Fpackage.json`](client\u002Fpackage.json).\n2. Extracts the matching `## [\u003Cversion>]` section from [`CHANGELOG.md`](CHANGELOG.md) as the release body.\n3. Creates a draft release and, in parallel, builds and uploads:\n   - Linux x86_64: `.deb`, `.rpm` (on `ubuntu-22.04`)\n   - Linux aarch64: `.deb`, `.rpm` (on `ubuntu-24.04-arm`)\n   - macOS ARM \u002F Intel: `.dmg` + `.app.tar.gz` (+ `.sig`) for the in-app updater\n   - Windows x86_64: `*-setup.exe` (NSIS, + `.sig`), `*_en-US.msi` (+ `.sig`)\n   - `latest.json` covering `darwin-aarch64`, `darwin-x86_64`, and `windows-x86_64` — Linux is intentionally absent since the updater plugin isn't compiled in for Linux.\n4. Leaves the release as a draft. Smoke-test the artifacts from the draft, then flip it to **Published** with the \"Set as the latest release\" checkbox in the GitHub Releases UI to make `https:\u002F\u002Fgithub.com\u002Frzru\u002Fnightingale\u002Freleases\u002Flatest\u002Fdownload\u002Flatest.json` (the URL hard-coded in [`tauri.conf.json`](client\u002Fsrc-tauri\u002Ftauri.conf.json)) resolve to it and start rolling out the in-app update.\n\nCutting a release:\n\n```bash\n# bump versions in client\u002Fsrc-tauri\u002Ftauri.conf.json, client\u002Fsrc-tauri\u002FCargo.toml, client\u002Fpackage.json\n# add a `## [\u003Cversion>] - YYYY-MM-DD` section to CHANGELOG.md\ngit tag v\u003Cversion>\ngit push origin v\u003Cversion>\n```\n\nRequired repository secrets:\n\n| Secret                                | Purpose                                                                                                                            |\n| ------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |\n| `TAURI_SIGNING_PRIVATE_KEY`           | Minisign private key whose public counterpart is the `pubkey` in [`tauri.conf.json`](client\u002Fsrc-tauri\u002Ftauri.conf.json). Generate once with `pnpm tauri signer generate`. |\n| `TAURI_SIGNING_PRIVATE_KEY_PASSWORD`  | Password for the signing key. Omit the secret entirely if the key was generated passwordless — GitHub rejects empty-string secrets, and a missing one resolves to empty at workflow runtime, which is what `minisign` expects. |\n| `PIXABAY_API_KEY`                     | Embedded at compile time so release builds can fetch video backgrounds.                                                            |\n\n## License\n\nGPL-3.0-or-later — see [LICENSE](LICENSE).\n","Nightingale 是一个基于机器学习的卡拉OK应用程序，能够从你的音乐库中任意选择歌曲进行演唱，并提供评分功能。其核心功能包括使用神经网络分离人声与伴奏、歌词自动转录及对齐、实时音高检测和评分等。技术上，Nightingale 支持多种语言的歌词识别，包括中文、日文和韩文，并且内置了多个音频反应背景效果来增强用户体验。该应用适合家庭聚会、朋友娱乐以及个人练习歌唱技巧等多种场景。作为一个单文件二进制程序，用户无需手动安装额外的软件或模型，所有必要的组件都会在首次启动时自动下载并配置好。",2,"2026-06-11 03:51:59","high_star"]