perminder-klair/subwave
Personal internet radio: Agentic AI DJ
What it solves
SUB/WAVE transforms a personal music library into a professional-sounding internet radio station. Unlike a personal playlist, it creates a shared broadcast where all listeners hear the same content simultaneously, managed by an AI DJ that handles track selection, transitions, and spoken commentary.
How it works
The system integrates several components to simulate a real radio experience:
- AI DJ Brain: Uses a swappable LLM (via Ollama, OpenAI, Anthropic, etc.) to curate tracks and write scripts for station idents, weather updates, and song intros.
- Voice Synthesis: Employs multiple TTS engines (including local options like Piper and Kokoro, or cloud services like ElevenLabs) to speak the DJ's scripts.
- Music Integration: Pulls music from a Navidrome server via the Subsonic API.
- Broadcast Engine: Uses Icecast and Liquidsoap to stream a single, shared audio feed to all listeners.
- Acoustic Analysis: Analyzes BPM, key, and loudness to create seamless crossfades and ensure the DJ doesn't talk over vocals.
Who it’s for
Music enthusiasts and self-hosters who want to actually "tune in" to their own music collection rather than just shuffling a playlist, and those who enjoy creating a curated, automated broadcast experience for others.
Highlights
- Plain-Language Requests: Listeners can ask for specific moods or artists in natural language, and the AI DJ slots them into the queue.
- Curation Tools: Includes a 24/7 scheduling grid, multiple DJ personas with distinct voices/styles, and a "Library Observatory" for visual music exploration via embeddings.
- Pluggable Skills: The DJ can be extended with custom skills (e.g., news feeds via RSS) without requiring code redeploys.
- Professional Transitions: Features vocal detection and stem blending to ensure high-quality, produced-sounding seams between tracks.
- Multi-Platform Access: Provides native iOS, Android, and desktop apps, as well as a web player with various skins.
Related
- Project
- Project
- Project
- Project
- Project