A DIY, open-source smart speaker built on Raspberry Pi.
Features • Installation • Hardware • Configuration • Support
Nexo converts a standard Raspberry Pi into a high-fidelity, network-aware smart speaker. Unlike standard Bluetooth speakers, Nexo acts as a central audio hub that intelligently manages input sources.
It runs a headless Python controller that seamlessly switches between Spotify Connect (High Quality WiFi streaming) and Bluetooth (for guests/offline use). It also features professional-grade DSP (Digital Signal Processing) via Carla, allowing for active crossover tuning, EQ, and room correction directly on the device.
- Priority Audio Switching: Automatically switches inputs. Playing Spotify pauses Bluetooth; stopping Spotify wakes Bluetooth back up.
- Smart Connectivity:
- Spotify Connect: Stream directly from the cloud.
- Bluetooth 5.0: High-quality A2DP sink with intelligent pairing.
- Hardware Control: Sonos-inspired play/pause/skip middle button, with side volume buttons, and status LEDs.
- Pro-Audio Engine: Uses PipeWire & mp; Carla for low-latency audio processing and equalization.
- API Controlled: Built-in FastAPI backend for mobile app integration and smart home control.
- Persistent Settings: Remembers volume and EQ profiles across reboots.
- Pretty good frequency response: The exact speaker with the listed parts has a decent frequency response:
Measured with an uncalibrated microphone with poor high frequency coverage and at 40 % speaker total volume.
Prerequisites:
- Raspberry Pi 3B+, 4 or 5 (Recommended)
- Raspberry Pi OS (Bookworm or newer)
Installer: SSH into your Raspberry Pi and run this command. It will install dependencies, compile Spotifyd, and configure system services automatically..
sudo apt update &∓& sudo apt install -y git &∓& \
git clone https://github.com/st7712/nexo.git &∓& \
cd nexo &∓& chmod +x install.sh &∓& sudo ./install.shNote: The installation may take 10-20 minutes depending on your Pi model (compiling Rust dependencies takes time).
| Button Input | Action |
|---|---|
| Vol + / - (Click for 5% / Hold for 10% continuous) | Changes Volume (Synchronized with Spotify/Bluetooth) |
| Play (1 Click) | Play / Pause |
| Play (2 Clicks) | Next Track |
| Play (3 Clicks) | Previous Track |
| Play (Hold) | Force Pairing Mode / Restarts Spotify (Disconnects current user from Bluetooth if Bluetooth active and also restarts Spotifyd) |
The speaker hosts a local API at http://. You can control playback, volume, EQ, and fetch metadata via REST.
Nexo is designed to work with generic I2S DACs (like HiFiBerry, Pimoroni, or generic PCM5102).
Advanced users can tweak GPIO pins and audio settings.
- System Config: Edit
assets/configs/nexo_config.json(created after first run) orDEFAULT_CONFIGinsrc/data_handler.pydirectly.
- Change
device_nameto whatever name you'd like - Set
soundswhether or not you want to have sound effects - Modify
eq_presetsto change the equalizer presets to your liking - Edit
max_volumeto match your specific amplifier Switch(multi-room is in development)masterif you'd like to have the specific speaker as just a listener, not a broadcaster
- Pin Layout: Edit
src/led_helper.pyif you use different GPIO pins for LEDs andsrc/main.pyfor buttons. - Specific Carla settings: Edit
src/carla_osc.pyif you somehow changed the Carla config and are using different plugins.
Contributions are welcome! Please open an issue or submit a pull request.
- Fork the repo.
- Create your feature branch (
git checkout -b feature/AmazingFeature). - Commit your changes.
- Push to the branch.
- Open a Pull Request.
- Spotifyd - Lightweight Spotify Client
- Carla - Audio Plugin Host
- FastAPI - Modern Python Web Framework
- Linux Studio Plugins - VST Plugins Used In Carla
Created by @stitoo. Reach out on Discord or open a GitHub Issue!