Una semplice Talking Machine

Di seguito troverete alcuni script per come fare il text-to-speech su Linux, basandosi su di un servizio Google o usando il programma pico2wave

Come prova ho realizzato uno script che fa dire al computer l'ora e la data, ed un altro che legge le news dell'ANSA. Ne ha anche uno che legge il meteo, ma purtroppo il servizio meteo a cui mi appoggiavo ha chiuso l'utilizzo free delle API e quindi "è tutto da rifare"!

Il servizio Google

Google offre questo servizio di Text to Speech ma non bisogna "sfruculiarlo" troppo! In pratica non bisogna fargli troppe richieste al minuto altrimenti ci bannerà!

Questa è la URL che dobbiamo inviare a Google per farci convertire in speech la parola "Ciao":

http://translate.google.com/translate_tts?tl=it&ie=UTF-8&q=Ciao&client=tw-ob

Google però ci risponderà con uno stream audio, per cui, per poterlo riprodurre, useremo il programma mpg123:

mpg123 -0 -o alsa -q "http://translate.google.com/translate_tts?tl=it&ie=UTF-8&q=$NEXTURL&client=tw-ob"

La richiesta a Google è idonea per generare una conversione "Text to Speech" in Italiano. Notate le opzioni tl=it.

mpg123 -0 -o alsa -q "http://translate.google.com/translate_tts?tl=it&ie=UTF-8&q=$NEXTURL&client=tw-ob"

Lo script completo che ho usato è questo che ho trovato in Internet e che ho chiamato speech_IT.sh:

#!/bin/bash
#################################
# Speech Script by Dan Fountain #
#      TalkToDanF@gmail.com     #
#################################


INPUT=$*
STRINGNUM=0

ary=($INPUT)
echo "---------------------------"
echo "Speech Script by Dan Fountain"
echo "TalkToDanF@gmail.com"
echo "---------------------------"
for key in "${!ary[@]}" 
  do
    SHORTTMP[$STRINGNUM]="${SHORTTMP[$STRINGNUM]} ${ary[$key]}"
    LENGTH=$(echo ${#SHORTTMP[$STRINGNUM]})
    #echo "word:$key, ${ary[$key]}"
    #echo "adding to: $STRINGNUM"
    if [[ "$LENGTH" -lt "100" ]]; then
      #echo starting new line
      SHORT[$STRINGNUM]=${SHORTTMP[$STRINGNUM]}
    else
      STRINGNUM=$(($STRINGNUM+1))
      SHORTTMP[$STRINGNUM]="${ary[$key]}"
      SHORT[$STRINGNUM]="${ary[$key]}"
    fi
done

for key in "${!SHORT[@]}"
  do
    #echo "line: $key is: ${SHORT[$key]}"

    echo "Playing line: $(($key+1)) of $(($STRINGNUM+1))"
    NEXTURL=$(echo ${SHORT[$key]} | xxd -plain | tr -d '\n' | sed 's/\(..\)/%\1/g')
    mpg123 -0 -o alsa -q "http://translate.google.com/translate_tts?tl=it&ie=UTF-8&q=$NEXTURL&client=tw-ob"
done

Per usarlo vi faccio vedere come ho fatto lo script per dire la data e l'ora:

#!/bin/bash

dt=$(LC_TIME="it_IT.utf8" date '+sono le ore %H e %M minuti, di %A %d %B %Y')
./speech_IT.sh $dt

Un'altro modo per scaricare l'audio da Google è usando wget:

wget -q -U Mozilla -O output.mp3 "http://translate.google.com/translate_tts?tl=it&ie=UTF-8&q=Ciao&client=tw-ob"

Il programma pico2wave

Il programma pico2wave si installa come un qualsiasi altro programma. Il suo utilizzo è semplice, ed anche lui ci genererà un audio che poi faremo riprodurre da un'altro programma.

Questo è uno script che ho fatto e che utilizzo per la lettura delle ANSA, si chiama play_speech.sh:

#!/bin/bash

TFILE=$(tempfile)
TFILE2=$TFILE.wav

pico2wave -l=it-IT -w=$TFILE2 "$1"
aplay $TFILE2
rm $TFILE
rm $TFILE2

Le opzioni con cui eseguiamo pico2play ci permettono di definire la lingua -l=it-IT ed il file di output. In questo caso ho usato il programma aplay per la riproduzione.

E adesso ci facciamo leggere le News ANSA!

Di seguito vi riporto alcuni script: il primo scarica le prime dieci news dal sito ANSA e le salva in altrettanti files sotto la directory /tmp. Gli altri due script non fanno altro che leggercele usando in un caso i servizi Google e in un altro caso il programma pico2wave:

Programma ansa_reader.py

import string
import feedparser
import os

while 1:
  print'.',
  d = feedparser.parse('http://www.ansa.it/sito/ansait_rss.xml')
  idx = len(d['items'])
  if idx > 0:
    break

tmp_path="/tmp/"

if ( idx < 10):
  myidx=idx
else:
  myidx=10
  
while( myidx):
  idx1 = 0
  e = d['items'][ myidx]

  titolo=e['title']

  descrizione=e['description']

  myfile=tmp_path+"ansa_news-"+str(myidx)+".txt"

  fansa = open(myfile, 'wb+')
  titolo_out = titolo.encode('utf-8')
  fansa.write( " "+titolo_out+". ")

  descrizione_out = descrizione.encode('utf-8')
  fansa.write( " "+descrizione_out+".\n")
  fansa.close()

  print titolo_out
  print " "+descrizione_out+"\n"

  myidx=myidx-1

Programma di lettura delle news usando i servizi Google

Questo script riproduce le news scaricate, una per volta. Usa lo script speech_IT.sh che abbiamo visto prima:

./speech_IT.sh "$(< /tmp/ansa_news-1.txt)"
sleep 2
./speech_IT.sh "$(< /tmp/ansa_news-2.txt)"
sleep 2
./speech_IT.sh "$(< /tmp/ansa_news-3.txt)"
sleep 2
./speech_IT.sh "$(< /tmp/ansa_news-4.txt)"
sleep 2
./speech_IT.sh "$(< /tmp/ansa_news-5.txt)"
sleep 2
./speech_IT.sh "$(< /tmp/ansa_news-6.txt)"
sleep 2
./speech_IT.sh "$(< /tmp/ansa_news-7.txt)"
sleep 2
./speech_IT.sh "$(< /tmp/ansa_news-8.txt)"
sleep 2
./speech_IT.sh "$(< /tmp/ansa_news-9.txt)"
sleep 2
./speech_IT.sh "$(< /tmp/ansa_news-10.txt)"
sleep 2

Programma di lettura delle news usando pico2wave

Questo script riproduce le news scaricate, una per volta. Usa lo script play_speech.sh che abbiamo visto prima:

./play_speech.sh "$(cat /tmp/ansa_news-1.txt)"
sleep 2
./play_speech.sh "$(cat /tmp/ansa_news-2.txt)"
sleep 2
./play_speech.sh "$(cat /tmp/ansa_news-3.txt)"
sleep 2
./play_speech.sh "$(cat /tmp/ansa_news-4.txt)"
sleep 2
./play_speech.sh "$(cat /tmp/ansa_news-5.txt)"
sleep 2
./play_speech.sh "$(cat /tmp/ansa_news-6.txt)"
sleep 2
./play_speech.sh "$(cat /tmp/ansa_news-7.txt)"
sleep 2
./play_speech.sh "$(cat /tmp/ansa_news-8.txt)"
sleep 2
./play_speech.sh "$(cat /tmp/ansa_news-9.txt)"
sleep 2
./play_speech.sh "$(cat /tmp/ansa_news-10.txt)"
sleep 2

Sorgenti dei script

I vari progammi sono su github: Talking Machine

Clemente Di Caprio (Sviluppo firmware)
Network administrator, Microcontroller fanatic, Embedded developer enthusiast, Boards Collector.
https://github.com/cledic
http://embeddednotes.org
https://www.youtube.com/results?search_query=cledic64

The TanzoLab Project

Il TanzoLab è una iniziativa senza fini di lucro, nata da un'idea di Sergio Tanzilli socio fondatore di Acme Systems srl nel Novembre 2015, per trasferire ad appassionati di elettronica e informatica, professionisti e aziende nel settore, le conoscenze necessarie per poter creare prodotti embedded adatti per la produzione industriale.

Le attività del TanzoLab si svolgono ogni lunedi sera, salvo casi speciali, dalle ore 18:30 presso i locali della Acme Systems srl e consistono in:

  • Talk monotematici a cura di professionisti in vari settori tecnologici
  • Workshop pratici su elettronica embedded, produzione e informatica
  • Progettazione e realizzazione di nuovi prodotti embedded per l'IT

Le attività vengono coordinate tramite questo sito, in cui vengono pubblicati tutti i lavori svolti o in via di sviluppo, e tramite un gruppo Telegram con cui per interagire direttamente via chat con gli altri membri.