Eine neue Stimme für den Saugroboter

Seit mehreren Jahren haben wir einen Saugroboter, den Roborock S5. Da mir nicht ganz wohl dabei war, dass der Roboter ständig mit der Cloud des Herstellers kommuniziert, habe ich ihn gerootet und Valetudo installiert.

Valetudo wird auf dem Roboter installiert und dockt sich an die Cloud-Schnittstelle an. Die Kommunikation mit der Cloud des Herstellers ist dann abgeschnitten. Die Befehle sendet man an den Roboter dann nicht mehr über die App des Herstellers sondern man verbindet sich mit dem Webserver, der auf dem Staubsauger läuft. Ein cooles Konzept …

Da mit der Installation die Root-Schnittstelle in Form eines SSH-Zugriffs bereits offen war, habe ich mich etwas umgesehen. Dabei sind mir die Sound-Dateien für die Sprachausgabe aufgefallen. Diese liegen als .wav-Dateien im Verzeichnis

/mnt/data/rockrobo/sounds

und lassen sich z. B. per scp überschreiben. Zwar gibt es im Internet Soundpakete, die sich über die Oberfläche installieren lassen. Mir haben diese aber nicht gefallen und der Weg über die Konsole ist interessanter.

Zunächst hatte ich die Ansagen mit meiner eigenen Stimme aufgenommen und die Dateien ersetzt. Zwischenzeitlich gibt es aber mehrere Text-To-Speech (TTS) Portale, die Ansagen mit cooleren Stimmen erlauben. Ich habe mich für HAL 9000, dem Bordcomputer aus dem Film „2001: Odyssee im Weltraum“, entschieden.

HAL 9000 im Gespräch mit Andrea

Hier will ich kurz die Schritte vorstellen, mit denen ich die Stimme unseres Saugroboters ersetzt habe.

Backup der Sounddateien

SSH-Verbindung als root auf den Saugroboter öffnen

cd /mnt/data/rockrobo
scp -r sounds user@Rechner:/path/to/working/dir/

Sicherungskopie auf dem Roboter anlegen

cp -r sounds sounds_backup

Erzeugen der neuen Stimme

Eine Übersicht über die Ansagen habe ich hier gefunden. Offenbar kommen mit Firmware-Updates gelegentlich neue dazu, weshalb bei mir einige fehlten.

Für die Sprachgenerierung habe ich Uberduck verwendet. Über den Button „Text to Speech“ ist die TTS-Engine erreichbar. Bevor man eigene Texte synthetisieren kann, muss man sich einen Account angelegen. Der ist aber (mit gewissen Einschränungen) kostenlos.

Der Rest ist dann selbsterklärend:

  • Stimme auswählen (die Qualität der Stimmen ist sehr unterschiedlich)
    • Text eingeben und „Synthesize“ drücken
  • Actions / Download
  • Umbenennen der .wav-Datei in den Namen, den der Saugroboter erwartet

Normalisieren

Die Stimme von HAL 9000 ist sehr leise. Spielt man die generierten Dateien direkt auf den Saugroboter sind die Ansagen nur schwer zu verstehen.

Ich habe deshalb die Audio-Dateien normalisiert, also die Lautstärke soweit angehoben, dass der maximale Wert in der Datei 0 dB entspricht. Hintergrund und verschiedene Methoden sind in diesem Beitrag schön erklärt. Ich habe mir für das manuelle Vorgehen ein kleines Shell-Skript geschrieben.

#!/bin/bash

inputdir=$1
outputdir=$2

for wav in "$inputdir"/*.wav
do
	echo $wav
	datei=${wav##*/}
	echo $datei
	volume=`ffmpeg -i $wav -af "volumedetect" -vn -sn -dn -f null /dev/null 2>&1 | grep max_volume | awk '{print $5}'`
	echo $volume
	volume_norm=`echo "$volume * (-1)" | bc -l`
	echo $volume_norm
	
	ffmpeg -i $wav -af "volume=""$volume_norm""dB" "$outputdir"/"$datei"
done

Es benötigt zwei Parameter: Das Input-Verzeichnis und das Verzeichnis, in das die normierten Dateien geschrieben werden sollen.

Kopieren der Dateien auf den Saugroboter

Nun bleibt nur noch, die Sound-Dateien auf den Roborock zu übertragen. Dazu wieder per SSH als root mit dem Saugroboter verbinden.

cd /mnt/data/rockrobo/sounds
scp user@Rechner:/path/to/working/dir/*.wav .

… und fertig ist die Aktion. Ab sofort redet der Staubsauger mit der Stimme von HAL 9000.

Das Skript und generierten Dateien finden sich hier.