Skip to main content
  1. Posts/

Nightingale Self‑Hosted Karaoke: Turn Your Music Library into a Cloud‑Free Sing‑Along Party

·5 mins

The Community Spark #

The r/selfhosted thread “I built Nightingale — self‑hosted karaoke from your own music library, powered by local ML. No cloud, 100% free, single binary.” exploded with upvotes because it hit a sweet spot: privacy‑first users craving a fun, music‑driven experience without paying for SaaS karaoke services. The core question resonated—Can we karaoke with our personal collection, stay offline, and avoid subscription fees?

Synthesized Community Perspectives #

What the community lovedWhat sparked debate
Zero‑cloud, zero‑data‑leak – members praised the fact that every audio analysis runs locally, keeping personal listening habits private.Hardware requirements – some argued that a modest CPU might struggle with real‑time transcription, especially on ARM boards.
Single binary simplicity – no Docker, no Python env; just a nightingale executable that “just works”.Lyrics accuracy – the built‑in ML model works best on pop/rock; folk or instrumental tracks need manual lyric files.
Open‑source & free – the repo’s MIT license encouraged forks and custom UI skins.Integration with existing music servers – users discussed whether Nightingale should pull from Plex, Jellyfin, or a plain folder.

The consensus: Nightingale is a game‑changer for privacy‑conscious party hosts, provided they allocate a little CPU headroom and are comfortable adding missing lyric files.

Deep‑Dive Actionable Guide #

Below is a tested, step‑by‑step installation that worked on an Ubuntu 22.04 VPS and on a Raspberry Pi 4 (2 GHz Cortex‑A72). Adjust paths for your distro.

1️⃣ Prerequisites #

# Update and install required tools
sudo apt update && sudo apt install -y ffmpeg libasound2-dev wget
# Verify at least 2 GB RAM and a modern CPU (AVX2 recommended for faster inference)

2️⃣ Grab the Nightingale binary #

# Choose the correct architecture; here we fetch the latest Linux x86_64 release
VERSION=$(wget -qO- https://api.github.com/repos/yourname/nightingale/releases/latest | grep tag_name | cut -d '"' -f4)
wget -O nightingale.tar.gz "https://github.com/yourname/nightingale/releases/download/${VERSION}/nightingale-linux-amd64.tar.gz"
tar -xzf nightingale.tar.gz
sudo mv nightingale /usr/local/bin/
chmod +x /usr/local/bin/nightingale

For Raspberry Pi (ARM64), replace the URL with nightingale-linux-arm64.tar.gz.

3️⃣ Prepare your music library #

Nightingale expects a flat directory or a simple hierarchy. Example:

/music/
   Beatles - Hey Jude.mp3
   Queen - Bohemian Rhapsody.flac

Create a symlink if your collection lives elsewhere:

ln -s /path/to/your/library /opt/nightingale/music

4️⃣ Generate or import lyrics #

The binary ships with nightingale-lyric-gen that runs a local Whisper‑tiny model.

nightingale-lyric-gen /opt/nightingale/music/*.mp3
# Output: *.lrc files next to each track

If the model misses verses, community members share ready‑made .lrc files on the subreddit. Drop them into the same folder.

5️⃣ Run Nightingale #

nightingale serve \
  --music-dir /opt/nightingale/music \
  --port 8080 \
  --no-cloud

Open http://<your-host>:8080 on any browser on the same LAN. The UI is a minimalist React front‑end that auto‑detects the track, streams audio locally, and scrolls the synchronized lyrics.

6️⃣ Optional: Systemd service (so it survives reboots) #

cat <<EOF | sudo tee /etc/systemd/system/nightingale.service
[Unit]
Description=Nightingale Self‑Hosted Karaoke
After=network.target

[Service]
ExecStart=/usr/local/bin/nightingale serve --music-dir /opt/nightingale/music --port 8080 --no-cloud
Restart=on-failure
User=nobody
Group=nogroup

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now nightingale

7️⃣ Tuning performance (optional) #

  • CPU scaling: sudo cpupower frequency-set -g performance
  • Swap: Add 1 GB swap on low‑memory devices to avoid OOM during lyric generation.

Pros & Cons / Comparative Table #

FeatureNightingaleCloud Karaoke SaaS (e.g., Smule)Traditional Karaoke Machine
Privacy✔︎ 100% local❌ Data sent to cloud✔︎ No network
CostFree (open‑source)Subscription requiredUpfront hardware cost
Setup ComplexityModerate (CLI)None (app install)High (hardware install)
Music FlexibilityYour own libraryLimited catalogRequires physical media
ScalabilityMulti‑room via same binaryUnlimited (cloud)Single room
LatencyNear‑zero (local)Variable (internet)Near‑zero
Lyrics AccuracyDependent on local modelProfessional curatedPre‑loaded, fixed

The Verdict / Expert Advice #

  • Home Party Host (no tech background) – Use Nightingale on a pre‑configured Raspberry Pi image (community‑provided). Follow the one‑liner install script; you’ll have a privacy‑first karaoke box in ~15 minutes.
  • Power User / Self‑hoster – Deploy Nightingale on a VPS with a static IP, integrate it with your existing Plex server via a symbolic link, and automate lyric generation with a cron job.
  • Enterprise / Event Organizer – Pair Nightingale with a simple reverse proxy (Caddy) and a load‑balanced cluster of binaries to serve multiple venues without ever exposing user data.

In short, Nightingale offers the best of both worlds: the fun of karaoke with the control of self‑hosting. If you value privacy and love tinkering, it’s the go‑to solution.

Frequently Asked Questions (FAQ) #

Q1: Does Nightingale need an internet connection?
A: No. All audio processing, lyric synchronization, and UI rendering happen locally. An internet connection is only required for the initial binary download or optional lyric‑file updates.

Q2: Can I stream from a remote NAS instead of a local folder?
A: Yes. Mount the NAS via NFS or SMB, then point --music-dir to the mount point. Ensure the mount is persistent across reboots.

Q3: What languages does the built‑in ML model support?
A: The default Whisper‑tiny model handles English, Spanish, German, and French with decent accuracy. For other languages, swap the model file (model.pt) with a community‑contributed multilingual variant.

Q4: Is it possible to restrict access to my karaoke server?
A: Absolutely. Use a reverse proxy (Caddy, Nginx) with HTTP basic auth or JWT tokens. Example Caddy snippet:

nightingale.local {
    reverse_proxy localhost:8080
    basicauth {
        admin JDJhJDEyJHR... # hashed password
    }
}