The goal of this project is to convert a Bluetooth speaker into an Amazon Alexa enabled smart speaker using BeagleBoard.org®PocketBeagle®. The project was inspired by and most of the code was borrowed from Franklin Cooper's Hackster project: BeagleAlexa. This project will serve as more of a step by step guide to turning your Bluetooth speaker into a smart speaker. PocketBeagle® will receive spoken commands and perform 'fetches' from the internet and respond. We've added a set of LED lights as a notification strobe to give visual feedback to the user. For more background on the project and the software used read our blog.
Things you needHere is a list of hardware you will need to build a smart speaker
- PocketBeagle® is a $25 USB-key-fob computer that runs Debian Linux. The processor on board is the 1 GHz Octavo Systems OSD3358-SM System in Package(SiP).
- SD card (8GB or higher) to have the Linux image on
- USB type A Female Breakout board: https://www.sparkfun.com/products/12700
- USB Bluetooth+WiFi dongle: https://www.adafruit.com/product/2649
- USB to Micro-USB cable
- A powered USB hub: https://www.amazon.com/Link-Depot-Ports-Stand-Adapter/dp/B00A04IVBQ/
- Bluetooth speaker*: https://www.amazon.com/gp/product/B075JR26FG/
- Some green through hole LEDs
- 1K through hole resistors
- Through-hole prototyping pcb
- Jumper wires
- Small plastic case to enclose electronics
*Many Bluetooth speakers come with built-in microphones. But, using the same device for playing and recording sound would require using HSP(Head-set Profile)/HFP(Hands-free Profile) Bluetooth modes, which have known to be unreliable and produce poor quality audio. Using separate devices is a fun way to quickly get started (we found this cool microphone that reminded us of BB-8), however, please look for updates to this project later.
Step 1: Putting the hardware togetherTime to get your hands dirty by soldering the USB A breakout board to PocketBeagle. The following figure shows a Fritzing diagram providing the connections between the breakout board and PocketBeagle®.
Connect the following devices to the USB hub (shown in the figure)
- USB power brick to power the USB hub
- USB cable to connect to PocketBeagle
- USB cable for Microphone input
- Bluetooth/Wi-Fi USB dongle
Power the USB hub by plugging in the power adapter for the USB hub
Step 2: Make a bootable microSD cardLatest Linux images for PocketBeagle® are available at https://beagleboard.org/latest-images
The process of programming the microSD card with a Linux image listed in the page above is described in https://beagleboard.org/getting-started
Step 3: Booting the boardAfter making placing the Linux image onto the microSD card, insert it into the microSD card slot of the PocketBeagle® and power up the PocketBeagle® by connecting it to your computer's USB port by using the Micro-USB to USB cable. Make sure the USB hub is already powered using the brick adapter that comes with the USB hub. Open a web browser on the computer that is powering the PocketBeagle® and enter the URL: http://192.168.7.2:3000/ide.html This should bring up the Cloud9 IDE that allows you to develop software for the PocketBeagle®
Step 4: Connect to the internetInsert the Wi-Fi + Bluetooth dongle into the host USB port soldered onto PocketBeagle®
Check for wlan interface by running ifconfig:
debian@beaglebone:/var/lib/cloud9$ ifconfig
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 3200 bytes 232640 (227.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3200 bytes 232640 (227.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
usb0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.7.2 netmask 255.255.255.252 broadcast 192.168.7.3
inet6 fe80::6264:5ff:fe42:2972 prefixlen 64 scopeid 0x20<link>
ether 60:64:05:42:29:72 txqueuelen 1000 (Ethernet)
RX packets 581 bytes 109529 (106.9 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 405 bytes 112570 (109.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
usb1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.6.2 netmask 255.255.255.252 broadcast 192.168.6.3
ether 60:64:05:42:29:75 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
wlan0: flags=-28669<UP,BROADCAST,MULTICAST,DYNAMIC> mtu 1500
ether 08:bd:43:8a:2f:60 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
You should see a wlan(wlan0) wireless interface in the list of interfaces. Now run the connmanctl utility to connect to Wi-Fi
debian@beaglebone:/var/lib/cloud9$ connmanctl
connmanctl> enable wifi
Error wifi: Already enabled
connmanctl> scan wifi
Scan completed for wifi
connmanctl> agent on
Agent registered
connmanctl> services
SCSL wifi_08bd438a2f60_5343534c_managed_psk
octavo_wifi wifi_08bd438a2f60_6f637461766f5f77696669_managed_psk
SBG6900AC-C1D23 wifi_08bd438a2f60_5342473639303041432d4331443233_managed_psk
octavo_guest wifi_08bd438a2f60_6f637461766f5f6775657374_managed_psk
wifi_08bd438a2f60_hidden_managed_none
wifi_08bd438a2f60_hidden_managed_psk
connmanctl> connect wifi_08bd438a2f60_6f637461766f5f77696669_managed_psk
Agent RequestInput wifi_08bd438a2f60_6f637461766f5f77696669_managed_psk
Passphrase = [ Type=psk, Requirement=mandatory ]
Passphrase? OSD3358!
Connected wifi_08bd438a2f60_6f637461766f5f77696669_managed_psk
connmanctl> exit
debian@beaglebone:/var/lib/cloud9
Step 6: Install required packages- Increase size of Linux partition on microSD card
cd /opt/scripts/tools
sudo ./grow_partition.sh
sudo reboot
- Update repositories of Linux
sudo apt-get update
- Install required Linux packages
sudo apt-get install swig python-alsaaudio sox espeak libcurl4-openssl-dev libsox-fmt-mp3
- Install python packages
sudo pip install cherrypy requests
Step 5: Modify asound.conf file for proper pcm referenceEdit usr/share/alsa/alsa.conf to include the following change:
- Change defaults.ctl.card and defaults.pcm.card variables to 1
defaults.ctl.card 1
defaults.pcm.card 1
Reboot the board to let the changes go into effect
sudo reboot
Step 6: Connect to Bluetooth SpeakerEdit /etc/pulse/daemon.conf to make the following changes to the variables listed in the file. Remove the semicolons ahead of each of the lines to uncomment the lines, then modify as shown below:
- high-priority = yes
- exit-idle-time = 86400
Start pulseaudio daemon:
debian@beaglebone:/var/lib/cloud9$ pulseaudio --start
Use bluetoothctl utility to connect to Bluetooth speaker:
debian@beaglebone:/var/lib/cloud9$ bluetoothctl
[NEW] Controller 38:D2:69:DA:F0:39 beaglebone [default]
[bluetooth]# power on
Changing power on succeeded
[bluetooth]# agent on
Agent registered
[bluetooth]# default-agent
Default agent request successful
[bluetooth]# scan on
Discovery started
[CHG] Controller 38:D2:69:DA:F0:39 Discovering: yes
[NEW] Device 04:52:C7:A7:10:5F Bose Mini II SoundLink
[NEW] Device 43:88:48:B8:62:1A BS-01
[bluetooth]# pair 43:88:48:B8:62:1A
Attempting to pair with 43:88:48:B8:62:1A
[CHG] Device 43:88:48:B8:62:1A Connected: yes
[CHG] Device 43:88:48:B8:62:1A UUIDs: 00001101-0000-1000-8000-00805f9b34fb
[CHG] Device 43:88:48:B8:62:1A UUIDs: 0000110b-0000-1000-8000-00805f9b34fb
[CHG] Device 43:88:48:B8:62:1A UUIDs: 0000110e-0000-1000-8000-00805f9b34fb
[CHG] Device 43:88:48:B8:62:1A UUIDs: 0000111e-0000-1000-8000-00805f9b34fb
[CHG] Device 43:88:48:B8:62:1A ServicesResolved: yes
[CHG] Device 43:88:48:B8:62:1A Paired: yes
Pairing successful
[CHG] Device 43:88:48:B8:62:1A ServicesResolved: no
[CHG] Device 43:88:48:B8:62:1A Connected: no
[bluetooth]# connect 43:88:48:B8:62:1A
Attempting to connect to 43:88:48:B8:62:1A
[CHG] Device 04:52:C7:A7:10:5F RSSI: -51
[CHG] Device 43:88:48:B8:62:1A Connected: yes
Connection successful
[BS-01]# scan off
[BS-01]# exit
Verify by using aplay. Executing the following command should play the audio file Front_Center.wav
debian@beaglebone:/var/lib/cloud9$ aplay /usr/share/sounds/alsa/Front_Center.wav
Playing WAVE '/usr/share/sounds/alsa/Front_Center.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Mono
Ste 7: Add path variablesEdit /root/.bashrc file to include the following lines:
export LD_LIBRARY_PATH=/usr/local/lib
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
export PYTHONPATH=/usr/local/lib/python2.7/site-packages/
This will allow Python and Sphinx to find the various libraries we will be manually compiling soon. make sure to reboot the board after this step.
Step 8: Cloning repositories and building required utilitiesClone various repositories needed to /root/ folder:
cd /root/
git clone https://github.com/cmusphinx/sphinxbase.git
git clone https://github.com/cmusphinx/pocketsphinx.git
git clone https://github.com/neerajdantu/beagleman.git
Build Sphinxbase (This might take a while to build):
sudo apt-get install bison
cd /root/sphinxbase
./autogen.sh
make
make install
Build PocketSphinx:
cd /root/pocketsphinx/
./autogen.sh
make
make install
Step 9: Setup Amazon Voice Service and get tokensGather the following information from the process:
- Product ID
- Security Profile Description
- Security Profile ID
- Client ID
- Client Secret
- Make sure the allowed origins and allowed return URLs are the same as the ones shown in the above image
- Input credentials gathered in this step to creds.py file
cd /root/beagleman
cp example_creds.py creds.py
- Update python variables for ProductID, Security_Profile_Description, Security_Profile_ID, Client_ID and Client_Secret with values generated here. The updated file will look like the following(with the security variables blacked out).
- Execute the following command
python auth_web.py &
- Input url: 'http://192.168.7.2:5000' into a web browser of the computer the PocketBeagle® is connected to. If the PocketBeagle® has a different IP address, replace the IP address in the URL with PocketBeagle's IP address.
- Login to the Amazon account created for Amazon Voice Service, this will generate a token that will be displayed on screen
- Update beagleman.py with the mac address of the Bluetooth speaker being used in line 23.
# Start pulseaudio daemon
os.system('sudo -H -u debian pulseaudio --start')
os.system("echo 'connect 43:88:48:B8:62:1A' | bluetoothctl")
Step 10: Execute the programAs root, execute the script alexa_start.sh
cd /root/beagleman
./alexa_start.sh
The following figure shows the output of the shell program. When the terminal prompts the user to issue commands by printing 'Debug: Ready to receive request', Alexa can be activated by the key word 'dog'.
Make a logs directory:
cd /root/beagleman
mkdir logs
Edit crontab to start a cronjob:
sudo crontab -e
Add the following line to crontab file:
@reboot sh /root/beagleman/alexa_start.sh > /root/beagleman/logs/cronlog 2>&1
Step 12: Finishing upNow that you have everything set up, we will test PocketBeagle® Alexa's connection to the internet by asking it to tell us the weather in our city, tell us a random fact and a few surprises. At time of this writing, there are over 30,000 skills in the Alexa library. Let us know what you are able to do with your BeagleBoard.org® PocketBeagle® Alexa by entering it in the comments below!
Comments