OpenKara thedavidweng
winget install --id=thedavidweng.OpenKara -e OpenKara is an open-source desktop karaoke app that turns songs you already own into karaoke tracks with on-device vocal separation, synced lyrics, and a portable local library.
winget install --id=thedavidweng.OpenKara -e OpenKara is an open-source desktop karaoke app that turns songs you already own into karaoke tracks with on-device vocal separation, synced lyrics, and a portable local library.
Turn your music library into a karaoke stage.
An open-source desktop karaoke app powered by on-device AI stem separation and synced lyrics.
I love singing karaoke at home, but every existing solution has its own set of problems.
The most mature option is probably Karafun — a paid service that sidesteps copyright by re-recording famous songs. That's neat, but it comes with issues:
Then there's Apple Music Sing, which offers on-device vocal removal for karaoke. Also neat — but Apple Music is yet another subscription, and I hate subscriptions.
To dodge the subscription trap, you could go the more traditional route — something like OpenKJ for playing CD+G/media+g files. But CD+G files are niche, hard to find, and have to be purchased separately.
That pretty much leaves scouring YouTube for karaoke videos of dubious origin and questionable copyright status. Not exactly a unified experience, and the song I want is missing half the time.
So my no-compromise solution was born: OpenKara uses open-source AI to separate the digital music you already own in unencrypted form — whether it's from CD rips, Bandcamp, Qobuz, iTunes, or your local library's music service. I know there are plenty of people who, like me, prefer to buy once and own forever. OpenKara turns my existing music library into a karaoke library, so I don't have to pay for KTV, and my catalog is shaped by my own taste — not the mainstream.
.lrc files..cdg graphics during fullscreen playback when a track includes them.Download the latest build for your platform from GitHub Releases:
| Platform | Format |
|---|---|
| macOS (Apple Silicon) | .dmg |
| macOS (Intel) | .dmg |
| Windows | .exe (NSIS installer) |
| Linux | .AppImage / .deb |
macOS (Homebrew):
brew install thedavidweng/tap/openkara
macOS Gatekeeper note: If macOS says the app is damaged or can't be opened, run:
xattr -rd com.apple.quarantine /Applications/OpenKara.app
On first launch, OpenKara will prompt you to create a Karaoke Library and start downloading the default AI model in the background.
Prerequisites:
git clone https://github.com/thedavidweng/OpenKara.git
cd OpenKara
pnpm install
./scripts/setup.sh # downloads Demucs ONNX model for local dev
pnpm tauri dev
src-tauri/icons/app-icon.png (1024x1024 master asset)pnpm icons:generatesrc-tauri/icons/ for Tauri desktop and future mobile targetsOpenKara uses custom ONNX builds of Demucs models for stem separation. Models are maintained in a separate repository:
openkara-models — Reproducible ONNX model conversion pipeline
| Model | Description | Input | Output | Format |
|---|---|---|---|---|
htdemucs | Standard — Hybrid Transformer Demucs | Stereo audio at 44.1 kHz (7.8s) | 4 stems: drums, bass, other, vocals | ONNX (opset 17) |
htdemucs_ft | High Quality — Fine-tuned 4-model ensemble | Stereo audio at 44.1 kHz (7.8s) | 4 stems: drums, bass, other, vocals | ONNX (opset 17) |
On first launch, OpenKara automatically downloads the standard model into the app data directory. The high quality model is optional and can be downloaded from Settings. See the openkara-models README for details on the conversion pipeline. For local development and deterministic tests, run ./scripts/setup.sh to populate src-tauri/models/.
| Layer | Technology | Purpose |
|---|---|---|
| Desktop framework | Tauri 2 | Rust backend + system WebView |
| Frontend | React 19 + TypeScript 5 | UI components |
| Bundler | Vite 7 | Dev server and build |
| Styling | Tailwind CSS 4 | Utility-first CSS |
| State | Zustand | Lightweight global state |
| Audio decode | symphonia | Pure-Rust codec support |
| Audio output | cpal | Cross-platform audio playback |
| AI inference | ONNX Runtime via ort | Demucs v4 stem separation |
| Lyrics | LRCLIB | Open synced lyrics API |
| Metadata | lofty | ID3v2, Vorbis, FLAC tag reading |
| Audio encode | vorbis_rs | OGG/Vorbis stem compression |
| Database | SQLite via rusqlite | Song, lyrics, and stems cache |
┌─────────────────────────────────────────────────────────────┐
│ Tauri Frontend (React) │
│ ┌────────────────┐ ┌──────────────────────┐ │
│ │ File Import │ │ Karaoke Player │ │
│ │ & Library │ │ / Mixer │ │
│ │ │ │ (lyrics sync) │ │
│ └────────────────┘ └──────────────────────┘ │
│ ┌────────────────┐ ┌──────────────────────┐ │
│ │ Playback │ │ Progress & Volume │ │
│ │ Controls │ │ Controls │ │
│ └────────────────┘ └──────────────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ Tauri Rust Backend │
│ ┌────────────────┐ ┌──────────────────────┐ │
│ │ Audio Decode │ │ AI Stem Separation │ │
│ │ & Playback │ │ (Demucs v4 / ONNX) │ │
│ └────────────────┘ └──────────────────────┘ │
│ ┌────────────────┐ ┌──────────────────────┐ │
│ │ Metadata │ │ Lyrics Fetcher │ │
│ │ Reader │ │ (LRCLIB + embedded) │ │
│ └────────────────┘ └──────────────────────┘ │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ Portable Library │ │
│ │ (SQLite + media files + stems) │ │
│ └───────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
| Format | Import | CD+G Graphics | Stem Separation |
|---|---|---|---|
| MP3 | ✅ | Same-name .cdg sidecar | ✅ |
| FLAC | ✅ | Same-name .cdg sidecar | ✅ |
| WAV | ✅ | Same-name .cdg sidecar | ✅ |
| OGG / Vorbis | ✅ | Same-name .cdg sidecar | ✅ |
| AAC / M4A | ✅ | Same-name .cdg sidecar | ✅ |
| MP3+G ZIP | ✅ | Embedded audio + .cdg bundle | N/A |
OpenKara imports same-name audio + .cdg pairs as managed CD+G tracks, and it can also import MP3+G ZIP archives directly. Standard audio tracks are resampled to 44.1 kHz stereo for the Demucs model. Managed CD+G tracks already contain accompaniment-only audio, so they skip stem separation.
OpenKara stores all data in a self-contained library directory:
MyKaraokeLibrary/
├── .openkara-library # marker file
├── openkara.db # SQLite database
├── media/ # imported standard audio copies
│ └── {hash}.mp3
├── media-g/ # managed CD+G assets
│ ├── {hash}.mp3 # paired audio for CD+G playback
│ ├── {hash}.cdg # paired CD+G graphics sidecar
│ └── {hash}.zip # MP3+G ZIP archive when imported as a bundle
└── stems/ # separated tracks for standard audio imports
└── {hash}/
├── vocals.ogg
├── accompaniment.ogg # 2-stem mode
├── drums.ogg # 4-stem mode
├── bass.ogg # 4-stem mode
└── other.ogg # 4-stem mode
All paths in the database are relative — including CD+G sidecars and MP3+G ZIP assets — so the whole library can be moved to a NAS, USB drive, or network share and opened by any OpenKara instance on any OS. Per-machine configuration (library location) is stored separately in the app data directory.
OpenKara v0.2.0 is the release that established the current core app flow.
.cdg pairsOpenKara v0.3.0 is the current stable release. It adds:
pnpm install
./scripts/setup.sh # download Demucs ONNX model to src-tauri/models/
pnpm tauri dev # start dev server with hot reload
scripts/setup.sh places the model in src-tauri/models/ for local development and deterministic testing only. End-user installs use the app data directory for runtime model downloads.
cd src-tauri && cargo test # backend tests (70+ tests)
pnpm lint # ESLint
pnpm format # Prettier check
pnpm tauri build # production build with platform-specific bundle
main trigger the CI workflow (.github/workflows/ci.yml) — lint, build, and test on macOS, Windows, and Linux.v0.3.0) triggers the release workflow (.github/workflows/release.yml) — builds and attaches binaries to a GitHub Release.Contributions are welcome! Please open an issue before starting major changes so we can discuss the approach.
git checkout -b feature/my-feature)cargo test)MIT — Copyright (c) 2025 David Weng