The people
Beltr exists because people kept telling me what was wrong with it.
Thank you to r/karaoke, where this started as a half-finished idea and got taken seriously anyway. Thank you to everyone in the Beltr Discord who files the bug reports nobody wants to write, argues about lyric timing at one in the morning, and posts photos of their living rooms mid-party.
The r/karaoke Discord is also a room full of people building their own karaoke and audio tools, which is rarer than it sounds. Ideas get thrown back and forth in there until one of them turns out to be worth building, and a fair few of the ones in Beltr started as somebody else's. Beltr now imports stems straight from StemDeck and other separator apps, which is one of those ideas.
Beltr was developed with the assistance of AI coding tools. All product decisions, testing, and final code are reviewed and directed by its developer.
Built on
Beltr is a small app standing on decades of other people's work. These are the projects doing the heavy lifting.
- FFmpeg decodes, converts and mixes every audio and video file Beltr touches
- FluidSynth turns imported MIDI and .kar karaoke files into real audio
- GeneralUser GS (S. Christian Collins) provides the instruments those MIDI files are played through
- UVR-MDX-NET Inst HQ 3 (Anjok07 & aufr33, MDX-Net by kuielab) splits a song into a vocal track and an instrumental one
- Parakeet-TDT 0.6B v2 (NVIDIA; ONNX export by Igor Stupakov) transcribes lyrics from scratch when no synced words can be found
- ONNX Runtime runs every model Beltr uses, on CPU or GPU
- FastAPI runs the server behind the TV, the phones and the dashboard
- SwiftF0 hears which note you are singing, in real time
- Electron wraps Beltr into the desktop app
- yt-dlp fetches music videos to play behind the lyrics
- LRCLIB supplies the synced lyrics Beltr looks for first, every time
Licenses
The complete list of third-party components Beltr ships, downloads, talks to, or reads the output of, and the license each is used under.
Bundled with Beltr
| Component | License |
|---|---|
| FFmpegDecodes, converts and mixes every audio and video file Beltr touches | LGPL-2.1-or-later |
| FluidSynthTurns imported MIDI and .kar karaoke files into real audio | LGPL-2.1-or-later |
| GeneralUser GS (S. Christian Collins)Provides the instruments those MIDI files are played through | CC-BY-4.0 |
Machine-learning models
| Component | License |
|---|---|
| UVR-MDX-NET Inst HQ 3 (Anjok07 & aufr33, MDX-Net by kuielab)Splits a song into a vocal track and an instrumental one | MIT |
| wav2vec2 base 960h (Meta)Lines each word of the lyrics up with the moment it is sung | MIT |
| Parakeet-TDT 0.6B v2 (NVIDIA; ONNX export by Igor Stupakov)Transcribes lyrics from scratch when no synced words can be found | CC-BY-4.0 |
| Silero VAD (Silero Team)Finds where the singing actually is inside a track | MIT |
| Qwen3-ForcedAligner-0.6B (Alibaba Qwen team)Times each word on Japanese, Korean and Chinese songs, once the word-timing pack is installed | Apache-2.0 |
| UniDic Lite (The UniDic Consortium, NINJAL)Supplies the Japanese dictionary fugashi reads for the romanized line, once the Japanese dictionary pack is installed | BSD-3-Clause |
Python libraries
| Component | License |
|---|---|
| ONNX RuntimeRuns every model Beltr uses, on CPU or GPU | MIT |
| FastAPIRuns the server behind the TV, the phones and the dashboard | MIT |
| UvicornServes it | BSD-3-Clause |
| onnx-asr (Igor Stupakov)Drives the Parakeet transcription model | MIT |
| SwiftF0Hears which note you are singing, in real time | MIT |
| ONNX Runtime WebRuns the SwiftF0 live pitch model on the TV page (opt-in, issue #751) | MIT |
| MidoReads MIDI and .kar karaoke files | MIT |
| librosaPowers the audio analysis throughout the preparation pipeline | ISC |
| SoundFileReads and writes the stem files | BSD-3-Clause |
| NumPyHolds the arrays all of the audio work happens in | BSD-3-Clause |
| PillowHandles artwork | MIT-CMU |
| PydanticValidates everything crossing the API | MIT |
| tinytagReads tags out of your music files | MIT |
| python-zeroconfLets TV apps find your Beltr on the network | LGPL-2.1-or-later |
| watchdogNotices new files in your watched folders | Apache-2.0 |
| HTTPXMakes every outbound request Beltr sends | BSD-3-Clause |
| aiofilesKeeps file work off the event loop | Apache-2.0 |
| python-multipartHandles file uploads | Apache-2.0 |
| bcryptHashes the host PIN | Apache-2.0 |
| truststoreUses your operating system's certificates, so Beltr still works behind a corporate TLS proxy | MIT |
| PyYAMLParses configuration | MIT |
| PyThaiNLPRomanizes Thai lyrics for the line under the words | Apache-2.0 |
| cutletRomanizes Japanese lyrics for the line under the words | MIT |
| fugashiSplits Japanese lyrics into words for cutlet | MIT AND BSD-3-Clause |
| pypinyinRomanizes Chinese lyrics for the line under the words | MIT |
| tokenizersReads the word-timing pack's text model once it is installed | Apache-2.0 |
Desktop app
| Component | License |
|---|---|
| ElectronWraps Beltr into the desktop app | MIT |
| Node.jsRuns Electron | MIT |
| electron-builderBuilds the installers | MIT |
| electron-updaterDelivers updates | MIT |
| electron-storeRemembers your settings between launches | MIT |
Installed on request
| Component | License |
|---|---|
| yt-dlpFetches music videos to play behind the lyrics | Unlicense |
| DenoRuns the sandboxed JavaScript yt-dlp needs | MIT |
| cloudflaredOpens an optional tunnel, for phones joining from outside your home | Apache-2.0 |
Services Beltr talks to
| Component | License |
|---|---|
| LRCLIBSupplies the synced lyrics Beltr looks for first, every time | Open API, CC0 lyrics data |
| MusicBrainzFills in missing album, year and genre tags | Open data (CC0 / CC-BY-NC-SA) |
| Apple iTunes Search APILooks up artwork and metadata | Public API |
| fanart.tvSupplies artist artwork | Public API, key required |
| DiscogsSupplies album artwork when nothing else has it | Public API, token required |
| Last.fmSupplies artist biographies and tags | Public API, key required |
Tools Beltr works with
| Component | License |
|---|---|
| StemDeckSplits a song into stems Beltr imports directly | Apache-2.0 |
About the LGPL components
FFmpeg, FluidSynth and python-zeroconf are licensed under the GNU Lesser General Public License. Beltr ships FFmpeg and FluidSynth as unmodified binaries and runs them only as separate processes; it never links against them. python-zeroconf is included unmodified as an installed Python package.
You are entitled to the complete source for these components, and to replace them with builds of your own. The sources are available from each project's own site, linked above. If you would rather have them from us, email support@beltr.app and we will send you the exact sources used to build the binaries we ship, for at least three years from the date you received this software.