Edit: Bose have discontinued the SleepBuds and are offering everyone a full refund if they return them. As such, I’m not going to spend any more time trying to hack the Bose Sleep app.
This is going to be a pretty niche post, I’m mainly putting this information up so I can find it later if I need to, and it may be useful to a couple of other people who have Bose Sleepbuds.
For those who aren’t familiar with what they are, Sleepbuds are tiny in-ear devices that work partly as an ear plug to block outside sounds and partly as in-ear earphones to mask outside sounds. They are completely wireless, and each bud is positively tiny, so they can sit in your ear, even if you’re sleeping on your side at night. They have a claimed battery life of 16 hours of continuous playback, however they can’t play music off your phone or stream audio off the internet. They have memory in each bud that stores a pre-made sound library, you select a sound via the app on your phone before you go to sleep and then that sound loops, either on a set timer, or continuously all night long. They have a very nicely built storage/charging case – each bud magnetically locates itself in the case when you put it back so the charging pins are aligned correctly and they don’t fall out.
The reason these are likely to remain a niche product is because of the price. I’ve previously been using soft, mouldable silicone ear plugs to cut out noise at night and help me sleep. These ear plugs are super comfortable and cost a couple of dollars a pair. The Bose Sleepbuds on the other hand retail for nearly $380. I’m fortunate to have won a pair in a competition recently, so let the hacking begin.
The main point of contention most people seem to have on the Bose Community forums is that the sound library doesn’t have the right sound for them. This is an area where personal preferences know no bounds – clearly there is no perfect sound for everyone and Bose have done a decent job of covering most bases with their, currently, 20 preset sound loops, however there’s always room to improve here.
Looking at these devices, right off the bat it’s clear that they are simply not capable of streaming audio files from another device over Bluetooth. In order to conserve battery life, they use Bluetooth Low Energy with what must be a very low bitrate for data transfers – in my estimates it’s around 5kB/s. This is lower than even the lowest bandwidth, and lowest quality, codecs for voice as used by VOIP devices, so nowhere near good enough for music. It also seems that the audio files the Sleepbuds play back are raw, uncompressed PCM audio – the tradeoff being that flash storage space uses less battery power than a hardware decoder for compressed audio.
There was a comment from a moderator on the Bose forums claiming that the audio had to be equalised in various ways for the driver in the sleep buds to reproduce it clearly. In my testing this is false, or misleading at best.
What I’ve found is that the audio format the Sleepbuds use is raw 24-bit PCM audio at an 8192 kHz sample rate. Each Sleepbud is given one half of a stereo file and they synchronise their playback pretty well such that I haven’t heard them get out of sync.
Now, I’ll be the first to say that this particular audio format seems like some strange design decisions have been made. I understand using raw PCM audio instead of MP3 or AAC as flash storage uses less power than a hardware audio codec would. What I don’t understand is the use of 24-bit audio over 16-bit. Yes, 24-bit is higher resolution, so therefore better quality than 16-bit, however given the drivers in the Sleepbuds, and the fact that they are designed to be listened to at very low sound levels, there is no way you would be able to hear any difference. So, 24-bit audio just takes up more space.
What I find even weirder is the 8kHz sample rate. This means that the hardware is only capable of reproducing frequencies up to 4kHz. Whilst this is good enough for background sounds, it is not good enough for music and if people were to download their own sounds then this limitation would quickly become apparent. I’m guessing that a lower sample rate allows the use of a lower powered DAC, and again this helps extend the battery life. Once I manage to get my own sounds onto the Sleepbuds, I’ll revisit this and determine how much of a limitation it is.
The next step I took was to take apart the Android app. I grabbed the .apk of the app from the Play Store and unzipped it. Inside the app, I found that there was no audio embedded, but rather a .json file that the app uses to load the sounds in the library from Bose’s servers.
Each sound in the library is listed in this .json file with background images for the app to display for each sound, a 32-bit floating-point, 44.1 kHz or 48 kHz audio preview in WAV format and a square thumbnail image.
Listening to the WAV preview and then listening to the raw audio for each bud shows that other than the hard cut-off at 4kHz, the sounds are otherwise identical. I didn’t hear any EQ applied to them.
My next step is to make my own audio file, pack it into the correct format, supply some images in various sizes, upload it to a web server and then modify the .json file to include it. I then need to re-pack and re-sign the apk and I’ll load it onto my Pixel tablet and see if I can transfer the audio to the Sleepbuds.