install

Requirements:

  1. festival (a free speech sysnthesis system)
  2. play (command line audio player)
  3. robo (shell script)

This -and some basic shell scripting abilities- should get us up and running to dynamically convert text to voice. As audio player we use “play”, part of the package “sox”.

To use a different player, do not forget to edit /usr/local/bin/robo accordingly.

To use “robo” with other voices than English (e.g. German), you may install voices of the mbrola project. (More Instructions to follow.)

1. Install “festival” and “sox”

To simply get it working in English for Ubuntu install  with:

sudo apt-get install festival sox

2. Install “robo”

Copy the script beneath and paste it into an empty textfile.

#!/bin/sh
TXTTMP=/tmp/robo.txt            # where to save text
WAVTMP=/tmp/robo.wav            # where to save audio
echo $@ > $TXTTMP               # save input as text
text2wave $TXTTMP -o $WAVTMP    # convert to audio
cat $TXTTMP                     # write to console
play -q   $WAVTMP               # play as audio
rm $TXTTMP                      # delete tmp text
rm $WAVTMP                      # delete tmp audio

Now save the above script as /usr/local/bin/robo (requires root privileges).

Then make the script executable:

sudo chmod +x /usr/local/bin/robo

Chosing a different name than “robo” may be problematic, as shared scripts may expect this script to be named “robo”.

3. Test robo

Now start “robo” with:

robo hello world

or

robo Your kernel version is `uname -r`

For more info how to use robo, go to syntax

Further Information in German Language:
http://linuxnetz.wordpress.com/2009/09/22/robo/

Wie bringt man seine Ubuntubox dazu, beliebige Texte (auch dynamisch generierte) mit einer Computerstimme vorlesen zu lassen?
Der hier beschriebene Weg ist dabei nur einer von mehreren möglichen. Damit der Computer sagt, was wir wollen, basteln wir uns ein kleines Skript mit dem Namen „robo“, das auf der Sprachsynthetisierungssoftware „festival“ aufbaut. Außerdem benötigen wir eine Möglichkeit, die durch diese Software erzeugten wav-Dateien über die Konsole abzuspielen. Hier benutze ich den Befehl „play“ aus dem Paket „sox“. Unter Ubuntu installieren wir die benötigten Pakete mit:

sudo apt-get install festival sox

robo

„festival“ beinhaltet den Befehl „text2wave“, der (nomen est omen!) eine Textdatei in eine wav-Datei umwandeln kann. Beispiel:

text2wave /etc/hostname -o /tmp/hostname.wav

Obiger Befehl liest die Datei /etc/hostname (den Namen des Computers, hier: „ubuntukiste“) ein, wandelt den Text nach wav um und legt die generierte Sounddatei als /tmp/hostname.wav ab. Spielen wir nun die Datei /tmp/hostname.wav mit einem beliebigen Player (hier: play) ab, sagt der Computer: „ubuntukiste“. Für den Einzelgebrauch ist dies mehr als gut genug, doch wir wollen uns den Ablauf in einem Skript namens „robo“ möglichst so automatisieren, dass all diese Schritte zusammengefasst werden und „robo“ auch skriptgenerierte Texte vorlesen kann:

#!/bin/sh
TXTTMP=$HOME/.tmp.txt           # where to save text
WAVTMP=$HOME/.tmp.wav           # where to save audio
echo $@ > $TXTTMP               # save input as text
text2wave $TXTTMP -o $WAVTMP    # convert to audio
echo `cat $TXTTMP`              # write to console
play -q   $WAVTMP               # play as audio
exit                            # bye bye

Das Skript speichern wir nun als /usr/local/bin/robo ab und machen es ausführbar:

sudo chmod +x /usr/local/bin/robo

Im Prinzip ist unser kleiner Sprachroboter nun fertig und einsetzbar.

Direkte Texteingabe:
Damit „robo“ z.B. „hello world“ sagt starten wir ihn mit:

robo hello world

Vorhandene Textdatei einlesen:
„robo“ soll uns nun die Datei /home/ubufreak/greetings vorlesen, in die wir den Satz „hello ubuntuusers, how are you?“ hinterlegt haben:

robo `cat /home/ubufreak/greetings`

Dynamische Texte: Zur Erinnerung: Alles zwischen den seltsam anmutenden Anführungszeichen (`backticks`) wird als Befehlssubstitution ausgeführt, d.h. der zwischen den `backticks` stehende Befehl wird zuerst ausgeführt und dann die Ausgabe dieses Befehls an „robo“ als Argument übergeben. Dies können wir uns auch für andere Befehle als „cat“ zu Nutze machen. Beispiel:

robo `uname -r`

Mit obigem Befehl wird uns „robo“ die aktuelle Kernelversion vorlesen. Ein weiteres Beispiel:

robo "The time ... `date +'%H:%M'`"

Mit diesem Befehl liest „robo“ die aktuelle Zeit ein und sagt dann: „The time: 8:37″. Den ersten Teil nimmt „robo“ dabei als direkten Text auf, die Zeit selbst über die dynamisch generierte Kommandosubstitution. (In solchen Fällen die komplette Befehlskette mit regulären Anführungszeichen einrahmen). So ein Miniskript können wir z.B. in der Datei /etc/cron.hourly ablegen und ausführbar machen, damit „robo“ uns die Zeit jede Stunde ansagt.

Weierführende Infos: Damit sollten die grundlegenden Möglichkeiten von „robo“ deutlich geworden sein. Grundsätzlich sollte „robo“ auch unter anderen Linuxsystemen funktionieren. „festival“ ist standardmäßig mit einer männlichen englischsprachigen Stimme konfiguriert. Eine deutsche Stimme gibt es noch nicht. Längere Textdateien benötigen eine gewisse Zeit zum konvertieren. Mit „robo“ könnten wir z.B. auch bei sicherheitsrelevanten Ereignissen zeitnah alarmiert werden, z.B. könnten wir ein kleines Skript schreiben, dass regelmäßig die Logfiles nach bestimmten Ereignissen (z.B. Zugriffsversuch per SSH) grept und dies umgehend an uns verpetzt: „Attention! Secure Shell connection attempt from IP ***.***.***.***“.

Viel Spaß mit „robo“!

Advertisements

Post a Comment

Required fields are marked *

*
*

%d bloggers like this: