Ubuntu Core Smart Speaker

Alan Pope

on 20 December 2018

With the holidays coming up, many of us can expect to spend time with our friends and families, often listening to seasonal music, or indeed escaping the seasonal music! Whether you’re joining in or getting away from the crowd, this simple project can help.

This is part one of a series of posts where I build up my own ‘smart’ speaker using a Raspberry Pi, some Open Source software, and a few other inexpensive components. In this part I’ve built a simple music player which shows up as a Spotify Connect device on the network. That means it can be controlled via the official Spotify app on any computer or mobile device.

Once setup, the device can have headphones, speakers, TV or a full sound system attached to stream music and podcasts from my favourite Spotify playlists. All I needed for this project was a network-connected Raspberry Pi 2 and some headphones or speakers. The Spotifyd software used requires a premium Spotify account. Many thanks to Simon Persson who created Spotifyd and published it in the Snap Store.

I used a Raspberry Pi 2 which is more than capable, but this project will also work on newer, faster, Raspberry Pi 3. The software I’m using is Spotifyd which registers as a ‘Spotify Connect’ device and can play audio on demand, when instructed by other devices running the official Spotify app.

Get The Party Started

In a previous blog post – Secure VPN Connection with Ubuntu Core I selected Ubuntu Core for the OS on the Pi. I’m following the same path with this project, using the latest download of Ubuntu Core to get started.

Ubuntu Core is a lean, secure, automatically updated OS designed for devices like the Raspberry Pi. It’s perfect for an appliance you want to setup and leave somewhere, safe in the knowledge it’s kept up to date

The steps for grabbing the Ubuntu Core image and flashing to a microSD card are quick and straightforward. Much like installing any other OS on a Pi. There is a setup process on first boot which walks you through connecting to wired or WiFi network (if available).

If you already have a Raspberry Pi 2 or better running a recent install Raspbian, you can use that instead of Ubuntu Core. You just need to sudo apt install snapd before continuing with the rest of these steps.

Refractions in the Plastic Pulse

Next up I needed to install PulseAudio which the Spotifyd daemon will connect to later. It’s a good idea to also install PulseMixer, which enables us to control the volume and check everything is working. Installing both is simple as they’re both available as snaps.

snap install pulseaudio
snap install pulsemixer

PulseAudio will run as root in the background and listen out for incoming connections. We can check the audio levels by running sudo pulsemixer on the Pi in an SSH session. Here’s what that looks like. Note the bcm2835 device which is the sound ‘card’ in the Raspberry Pi. We can adjust the volume with the arrow keys.

Red Chip Installation

Now we’re ready to install Spotifyd. This is as simple as:

snap install spotifyd

Once installed, Spotifyd will automatically start without any configuration. However, it defaults to using ALSA, but we’d like to use PulseAudio as the backend. Spotifyd is built with the PulseAudio backend, so we need to make sure it’s used. That’s pretty easily done with a configuration file. On the Pi, issue the following commands:

$ sudo mkdir -p /root/snap/spotifyd/current/.config/spotifyd

Once created, we can add a configuration file:

$ sudo vi /root/snap/spotifyd/current/.config/spotifyd/spotifyd.conf

Add the following lines to the file, and save it.

backend = pulseaudio
device_name = pi

Note I’ve also added a device_name which is what you’ll see in the official Spotify client under ‘Connect to device’. If you setup more than one device, you could name each differently, perhaps based on what room they’re in. There are some limits such as name cannot contain spaces. For more details on the options in the configuration file, check out the upstream Spotifyd project on GitHub.

For the changes to take effect, restart Spotifyd.

sudo snap restart spotifyd

That’s it! Plug in some headphones, open up the Spotify client on a mobile device or PC and start playing on the Pi!

Buggin’ Out

If things aren’t playing nicely, there’s a couple of things we can do to debug. On the Pi we can use sudo pulsemixer to see what the volume is set to, adjust it, and confirm whether Spotifyd is connected to PulseAudio.

Sometimes the daemon needs restarting, which can be done with a simple sudo snap restart spotifyd. We can also get to the logs of Spotifyd with snap logs spotifyd. If you uncover interesting bugs, I’d recommend filing them on the upstream Spotifyd issue tracker.

End Game

There’s a few things I can imagine doing to improve this. It might be cool to have some audio visualization output on the HDMI port while music is playing. That would be great if used as a jukebox as a party, with a big screen on. It could also potentially display track information on the display too.

The audio circuitry in the Raspberry Pi isn’t what you might call ‘Studio’ quality. So another option might be to add a 3rd party USB sound card with a higher quality Digital to Analog Converter.

In a further update I will add the ability to voice control the device via Alexa, but that can wait until after the Christmas holidays. If you setup an Ubuntu Core Smart Speaker, do let us know over on the snapcraft forums!

Happy holidays everyone! 🎄

Ubuntu desktop

Learn how the Ubuntu desktop operating system powers millions of PCs and laptops around the world.

Newsletter signup

Select topics you’re
interested in

In submitting this form, I confirm that I have read and agree to Canonical’s Privacy Notice and Privacy Policy.

Related posts

A snap confined shell based on Mir: Mircade

Mircade: An example snap confined user shell There are various scenarios and reasons for packaging a Snap confined shell and a selection of applications...

A blast from the past – Shutter

The wheel of software turns, and apps come and go. But the end of development does not always mean the end of usefulness. Sometimes, programs stubbornly...

Installing ROS in LXD Containers

It’s the season for updates. The last few weeks have ushered in ROS 1 Noetic and ROS 2 Foxy, both of which target the recently released Ubuntu 20.04 Focal...