Thursday 15 December 2016

Get your Raspberry Pi to Speak the News


Talking devices are the in thing at the moment with the Amazon Echo and the newer Google Home, so I thought I would try to get my raspberry pi to read out the news.

Here's what you need to do:

1, Install mplayer (audio player) on your raspberry pi
2. Setup a script to invoke Google Translates text to speech engine
3. Create a Python Script to pull the latest headlines from the BBC rss feed and then read them out
4. Add the script as a cron job to run every hour

Below is the detail behind each step

1. Install mplayer on your raspberry pi

(The below instructions are based on http://elinux.org/RPi_Text_to_Speech_(Speech_Synthesis))

a. First you will need to update Raspian (this can take up to an hour if not run in some time)

sudo apt-get update
sudo apt-get upgrade

b. Add sound utilities

 sudo apt-get install alsa-utils

c. Edit the follow file with the line

sudo nano /etc/modules

to have line

 snd_bcm2835 

d. Install mplayer

sudo apt-get install mplayer

2. Setup a script to invoke Google Translates text to speech engine

a. Create a file call speech.sh with the following content:




#!/bin/bash
say() { local IFS=+;/usr/bin/mplayer -volume 100 -ao alsa -really-quiet -noconsolecontrols "http://translate.google.com/translate_tts?ie=UTF-8&client=tw-ob&q=$*&tl=En-us"; }
say $*


b. Add execute permissions to the script

chmod u+x speech.sh

c. Test it out









./speech.sh Hello I can talk

Remember you will need speakers plugged into your raspberrypi to hear anything!

3. Create a Python Script to pull the latest headlines from the BBC rss feed and then read them out

a, Install feedparser which is a python libararyto read RSS feeds. Follow the instructions from the below link:

https://pypi.python.org/pypi/feedparser#downloads

b. Create a file getNews.py with the following content


##!/usr/bin/env python

import subprocess
import feedparser
import time 


d = feedparser.parse('http://feeds.bbci.co.uk/news/rss.xml?edition=uk')

introMessage = "BBC News Headlines at " + time.strftime("%H:%M") 

subprocess.call(["/home/pi/Documents/speech.sh", introMessage])

maxItems = 3
itemCounter = 0 

for post in d.entries:
        print post.title
 subprocess.call(["/home/pi/Documents/speech.sh", post.title])
 itemCounter = itemCounter + 1
 if itemCounter == maxItems:
  break

Remember to change the location to where you saved speech.sh
Also change maxItems if you want the script to read out more than 3 headlines. 
You could change the link to another news website of your choice as long as they provide a rss feed.

c. Test the file








python getNews.py

You should hear the top 3 headlines read out

4. Add the script as a cron job to run every hour (or how every frequently you want)

a. Open crontab with:

crontab -e

b. Add the line








@hourly python /home/pi/Documents/getNews.py > /dev/null 2>&1


Check out the following site on how to set up cron jobs if not familiar:
http://www.howtogeek.com/101288/how-to-schedule-tasks-on-linux-an-introduction-to-crontab-files/


And there you go, you now have a news reading speaking rasperberry pi. You could adapt this to read out any other type of site which uses rss feeds.

The following files can be downloaded from the links below:

getNews.py
speech.sh