English English

Audioansagen automatisch erstellen und abspielen - Shell-Skript

Wie man mittels einem Shellskript automatische Ankündigungen und Durchsagen im Audioformat durchführen kann. Damit kann man zum Beispiel Fehlermeldungen (von Diensten, Applikationen), Mitteilungen oder das Wetter über eine Audioschnittstelle (z.B.: Internetradio-Sender im Intranet oder Intranet, RSS-Podcast, etc.) automatisch ausgeben. 

Hier wird ein Anwendungsfall gezeigt, wo dieses Shellskript Ankündigungen über einen Radiostream automatisch erstellt und ausgibt. Dieser Anwendungsfall ist ähnlich wie die Durchsagen, die im Flughafen oder Bahnhof zu hören sind. Sowas ähnliches wird hier implementiert über ein Icecast2 streaming server, der im lokalen Netzwerk auch verwendet werden kann, um Mitteilungen im Audioformat über Lautsprecher zuhause oder im Unternehmen auszugeben.

Es kann auch dieses Shellskript, wenn es etwas bearbeitet für andere Anwendungsfälle eingesetzt werden.

 

Vorraussetzungen

Folgendes muss zuerst eingerichtet werden, bevor man das Shellskript erstellt:

1. Wenn Informationen oder Mitteilungen über RSS aufgerufen werden sollen: Das Programm RSStail
Kann man über Paketmanager apt installieren: sudo apt-get install rsstail

Mehr über rsstail: http://manpages.ubuntu.com/manpages/xenial/man1/rsstail.1.html

2. Internet-Radio-Streaming-Server (eingerichtet mit icecast2 und ices) mit funktionierendem Streaming
Dies wird hier verwendet als Medium für die Ausgabe der erstellten Ankündigungen. Das Internetradio hier ist stumm und spielt nichts ab außer, wenn Mitteilungen ausgegeben werden müssen.
Es gibt hier auf dieser Webseite auch ein Tutorial, wie man den Internet-Radio-Streaming-Server einrichtet.

Achtung! In diesem Anwendungsfall hier darf nur in der Playlist eine Audiodatei enthalten seien, die kein Ton ausgibt. Es kann hier die diese Audiodatei heruntergeladen und verwendet werden: https://ard-site.net/downloads/mute_state.mp3

Hier wird die Playlist playlist_live.pls verwendet, in der sich 5 Mal nur die Datei mute_state.mp3 befindet.

3. Das Programm jq
Ein Programm um Werte und Inhalte von JSON-Dateien auszugeben. Wird hier im Anwendungsfall verwendet um das Wetter auszugeben.
Kann man über apt-Paketmanager installieren: sudo apt-get install jq
Mehr über jq: http://manpages.ubuntu.com/manpages/bionic/man1/jq.1.html

4. Die Text-To-Speech-Software gtts
Gtts kann über den Paketmanager pip oder von der Webseite pypi installiert werden: (https://pypi.org/project/gTTS/)
Es gibt hier auf der Webseite ein Tutorial, wie man die diese Text-To-Speech-Software installieren kann.

5. Wenn eine Intro-Musik für die Ankündigungen hinzugefügt werden soll: Das Programm ffmpeg
Kann man über apt-Paketmanager installieren: sudo apt-get install ffmpeg

6. Die Audiodatei announcement_intro.mp3
Diese Audiodatei ist die Intromusik, die vor dem Ankündigung abgespielt wird. Diese darf nur im mp3-Format sein.

7. Eine Playlist mit nur der Audiodatei für die Ankündigung
Hier wird eine Playlist announcement_playlist.pls erstellt. Die nur die Datei /home/ubuntu/announcement.mp3 enthält.

 

Das Shellskript

  • Der als Audio auszugebene Text befindet sich hier in der Datei: /home/ubuntu/announcement_text.txt
  • Die Mitteilungen/Informationen von einem RSS-Feed werden in dieser folgenden Datei gespeichert: /home/ubuntu/announcement_information.txt

Hier wird das Benutzerkonto ubuntu verwendet. Es müssen gegebenenfalls einige Änderungen an dem Skript durchgeführt werden. Das Shellskript läuft hier als root.

Shellskript erstellen

vim /home/ubuntu/play_announcement.sh


Das Shellskript hat folgenden Inhalt:

#!/bin/sh

#Begrüßung
greetingtext="Dies ist eine wichtige Mitteilung. "
echo $greetingtext > /home/ubuntu/announcement_text.txt

#Aktuelle Uhrzeit ausgeben
_timetext="Es ist "
_timetext+=$(env TZ=Europe/Berlin date +"%-H")
_timetext+="Uhr ."
echo $_timetext >> /home/ubuntu/announcement_text.txt

#Auszugebene Mitteilungen/Informationen abrufen - Titel und Beschreibung eines Feedeintrags
su ubuntu -c "rsstail -N -d -z -P -n 1 -u http://myfeed.tld/myfeed_file.xml > /home/ubuntu/announcement_information.txt &"
cat /home/ubuntu/announcement_information.txt >> /home/ubuntu/announcement_text.txt

#Verabschiedungstext
endtext="Vielen Dank für Ihre Aufmerksamkeit. "
echo $endtext >> /home/ubuntu/announcement_text.txt

#Text in Audiodatei konvertieren - Bitte Sprache gegebenenfalls anpassen
rm /home/ubuntu/announcement.mp3
rm /home/ubuntu/announcement_temp.mp3
rm /home/ubuntu/announcement_temp2.mp3
su ubuntu -c "/usr/local/bin/gtts-cli -f /home/ubuntu/announcement_text.txt -l 'de' -o /home/ubuntu/announcement_temp.mp3"

#Audiodatei lauter machen
ffmpeg -i /home/ubuntu/announcement_temp.mp3 -filter:a "volume=16dB" -b:a 128k /home/ubuntu/announcement_temp2.mp3

#Eine Intro-Musik hinzugefügen - Die fertige Datei befindet sich nun in: /home/ubuntu/announcement.mp3
ffmpeg -y -i /home/ubuntu/announcement_intro.mp3 -i /home/ubuntu/announcement_temp2.mp3 -filter_complex "aevalsrc=0:d=4[s1]; [s1][1:a]concat=n=2:v=0:a=1[ac1]; [0:a][ac1]amix[aout]" -map [aout] -c:a libmp3lame /home/ubuntu/announcement.mp3

#Die Audiodatei nun im Internetradio-Stream ausgeben
#Aktuelle Playlist mit der Playlist von der Ankündigung ersetzen - Befehl mv verursacht keine Probleme beim laufendem Stream. 
_lastplayednr=$(sed -n '6 p' /home/ubuntu/ices/logs/ices.cue)
cp /home/ubuntu/ices/playlists/playlist_live.pls /home/ubuntu/ices/playlists/playlist_live_temp.pls 
cp /home/ubuntu/ices/playlists/announcement_playlist.pls /home/ubuntu/ices/playlists/announcement_playlist_temp.pls
mv /home/ubuntu/ices/playlists/announcement_playlist_temp.pls /home/ubuntu/ices/playlists/playlist_live.pls

#Nun die Playlist der Ankündigung abspielen
sleep 1
ps axf | grep "/home/ubuntu/ices/bin/ices -c /home/ubuntu/ices/etc/ices.conf" | grep -v grep | awk '{print "kill -10 " $1}' | sh

#Übertragung der Ankündigung wurde gestartet - Während der laufenden Ankündigung wird nun die normale Playlist wiederhergestellt. Damit wird die Ankündigung nur ein Mal abgespielt. Nach der Ankündigung wird die normale Playlist fortgesetzt
sleep 10
_eins="0"
_nownr=$(expr $_lastplayednr + $_eins)
tail -n +$_nownr /home/ubuntu/ices/playlists/playlist_live_temp.pls > /home/ubuntu/ices/playlists/playlist_live_temp2.pls
mv /home/ubuntu/ices/playlists/playlist_live_temp2.pls /home/ubuntu/ices/playlists/playlist_live.pls

Die Begrüßungen und Ansprache kann beliebig bearbeitet werden.
Die Informationen/Mitteilungen werden über ein das Programm rsstail von einem RSS-Feed abgerufen. Bitte vergessen Sie nicht die Adresse des RSS-Feeds zu ändern. Es wird nur ein Eintrag (der aktuellste) abgerufen. Hier kann auch stattdessen wget verwendet werden, um Informationen von einer Webseite statt einem RSS-Feed abzurufen. Die Informationen dürfen aber dann nur als unformatierter Text zur Verfügung stehen.

Den Shellskript nun die benötigten Dateirechte hinzugefügen.

chmod +x /home/ubuntu/play_announcement.sh 



Das Shellskript kann als Cronjob z.B.: jede Stunde laufen:

0 * * * * * /home/ubuntu/play_announcement.sh

Oder nur aufgerufen werden, wenn eine Webseite irgendein Text enthält (z.B.: Wenn eine Fehlermeldung statt einer leeren Seite ausgegeben wird). Hier als Beispiel in einem Shellskript:

ANNOUNCEMENTTEXT=$(su ran -c "wget -qO- \""https://WEBSITE.TLD\ARE_THERE_ANY_ERRORS"" ")

if [ ! -z "$ANNOUNCEMENTTEXT" ];
then
/home/ubuntu/play_announcement.sh 
fi

 

Weitere Anwendungsfälle

Ankündigungen können z.B.: auch über ein RSS-Podcastfeed zur Verfügung stellen.
Zuerst aber muss ein Template für das RSS-Podcastfeed erstellt werden. Und die Einträge des RSS-Podcastfeed werden automatisch über ein Shellskript hinzugefügt. Das zuvor estellte Shellskript kann durch den Shellskript für das RSS-Podcastfeed erweitert werden.

Das automatische Hinzufügen der Podcastfeed-Einträge kann zum Beispiel folgendermaßen realisiert werden:

#iTunes RSS feed podcast entry
echo "<item>" > /var/www/WEBSITE/rss/podcast_temp
titel="<title>"
_dateinametitel=$(env TZ=Europe/London date +"%d-%m-%Y %HH00 - ")
titel+=$_dateinametitel
titel+="Nachrichten auf Deutsch"
titel+="</title>"

echo $titel >> /var/www/WEBSITE/rss/podcast_temp
echo "<description>Die aktuellsten Nachrichten aus Österreich und der Welt. Sowie auch Hightech-Nachrichten. Alles kurz und kompakt.</description>" >> /var/www/WEBSITE/rss/podcast_temp

titel="<link>http://WEBSITE.TLD/rss/podcast_de/files/"
titel+=$_dateinamejetzt
titel+=".mp3</link>"
echo $titel >> /var/www/WEBSITE/rss/podcast_temp

titel="<enclosure url=\"http://WEBSITE.TLD/rss/podcast/files/"
titel+=$_dateinamejetzt
titel+=".mp3\" length=\""
rm /var/www/WEBSITE/rss/podcast_laenge
wc -c < /var/www/WEBSITE/rss/podcast/files/$_dateinamejetzt.mp3 | tee /var/www/WEBSITE/rss/podcast_laenge

_laenge=`cat /var/www/WEBSITE/rss/podcast_laenge`
titel+=$_laenge
titel+="\" type=\"audio/mpeg\"/>"
echo $titel >> /var/www/WEBSITE/rss/podcast_temp

titel="<pubDate>"
_datum=$(env TZ=Europe/London date +"%a, %d %b %Y %T %z")
titel+=$_datum
titel+="</pubDate>"
echo $titel >> /var/www/WEBSITE/rss/podcast_temp

titel="<itunes:summary> Latest Announcement"
titel+=" - Folge: "
titel+=$(env TZ=Europe/London date +"%d-%m-%Y %HH00")
titel+="</itunes:summary>"
echo $titel >> /var/www/WEBSITE/rss/podcast_temp

titel="<itunes:subtitle> This is the latest Announcement"
titel+=" - Episode: "
titel+=$(env TZ=Europe/London date +"%d-%m-%Y %HH00")
titel+="</itunes:subtitle>"
echo $titel >> /var/www/WEBSITE/rss/podcast_temp

echo "<itunes:image href=\"http://WEBSITE.TLD/podcast_images/podcast_logo_cover.png\"/>" >> /var/www/WEBSITE/rss/podcast_temp
titel="<itunes:duration>"
titel+=$(mp3info -p "%02m:%02s\n" /var/www/WEBSITE/rss/podcast/files/$_dateinamejetzt.mp3)
titel+="</itunes:duration>"
echo $titel >> /var/www/WEBSITE/rss/podcast_temp


echo "</item>" >> /var/www/WEBSITE/rss/podcast_temp
echo "" >> /var/www/WEBSITE/rss/podcast_temp
sed '/PodcastEntries/ r /var/www/WEBSITE/rss/podcast_temp' /var/www/WEBSITE/rss/podcast.xml > /var/www/WEBSITE/rss/podcast_temp2
cp /var/www/WEBSITE/rss/podcast_temp2 /var/www/WEBSITE/rss/podcast.xml
rm /var/www/WEBSITE/rss/podcast_temp2

Es müssen aber leere Templates für den RSS-Podcastfeed erstellt werden. Wo vor den Podcastfeed-Einträgen ein  Kommentar mit dem Text "PodcastEntries" steht.

Cookies erleichtern die Bereitstellung unserer Dienste. Mit der Nutzung unserer Dienste erklären Sie sich damit einverstanden, dass wir Cookies verwenden.
Ok