{"id":1284,"date":"2023-05-01T14:59:59","date_gmt":"2023-05-01T12:59:59","guid":{"rendered":"https:\/\/benedikt-merz.de\/Blog\/?p=1284"},"modified":"2023-05-01T15:49:36","modified_gmt":"2023-05-01T13:49:36","slug":"eine-neue-stimme-fuer-den-saugroboter","status":"publish","type":"post","link":"https:\/\/benedikt-merz.de\/Blog\/?p=1284","title":{"rendered":"Eine neue Stimme f\u00fcr den Saugroboter"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Seit mehreren Jahren haben wir einen Saugroboter, den <strong>Roborock S5<\/strong>. Da mir nicht ganz wohl dabei war, dass der Roboter st\u00e4ndig mit der Cloud des Herstellers kommuniziert, habe ich ihn gerootet und <a href=\"https:\/\/valetudo.cloud\/\" target=\"_blank\" rel=\"noreferrer noopener\">Valetudo<\/a> installiert.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">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 \u00fcber die App des Herstellers sondern man verbindet sich mit dem Webserver, der auf dem Staubsauger l\u00e4uft. Ein cooles Konzept &#8230;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">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\u00fcr die Sprachausgabe aufgefallen. Diese liegen als <em>.wav<\/em>-Dateien im Verzeichnis<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/mnt\/data\/rockrobo\/sounds<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">und lassen sich z. B. per scp \u00fcberschreiben. Zwar gibt es im Internet Soundpakete, die sich \u00fcber die Oberfl\u00e4che installieren lassen. Mir haben diese aber nicht gefallen und der Weg \u00fcber die Konsole ist interessanter.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zun\u00e4chst 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\u00fcr <a rel=\"noreferrer noopener\" href=\"https:\/\/de.wikipedia.org\/wiki\/HAL_9000\" target=\"_blank\">HAL 9000<\/a>, dem Bordcomputer aus dem Film &#8222;2001: Odyssee im Weltraum&#8220;, entschieden.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/benedikt-merz.de\/Blog\/wp-content\/uploads\/2023\/04\/IMG_8087.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"684\" src=\"https:\/\/benedikt-merz.de\/Blog\/wp-content\/uploads\/2023\/04\/IMG_8087-1024x684.jpg\" alt=\"\" class=\"wp-image-1285\" srcset=\"https:\/\/benedikt-merz.de\/Blog\/wp-content\/uploads\/2023\/04\/IMG_8087-1024x684.jpg 1024w, https:\/\/benedikt-merz.de\/Blog\/wp-content\/uploads\/2023\/04\/IMG_8087-300x200.jpg 300w, https:\/\/benedikt-merz.de\/Blog\/wp-content\/uploads\/2023\/04\/IMG_8087-768x513.jpg 768w, https:\/\/benedikt-merz.de\/Blog\/wp-content\/uploads\/2023\/04\/IMG_8087.jpg 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">HAL 9000 im Gespr\u00e4ch mit Andrea<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hier will ich kurz die Schritte vorstellen, mit denen ich die Stimme unseres Saugroboters ersetzt habe.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Backup der Sounddateien<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">SSH-Verbindung als root auf den Saugroboter \u00f6ffnen<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/mnt\/data\/rockrobo\nscp -r sounds user@Rechner:\/path\/to\/working\/dir\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Sicherungskopie auf dem Roboter anlegen<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cp -r sounds sounds_backup<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Erzeugen der neuen Stimme<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Eine \u00dcbersicht \u00fcber die Ansagen habe ich <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/busti\/roborock-tiktok\/blob\/master\/audio_default.csv\" target=\"_blank\">hier<\/a> gefunden. Offenbar kommen mit Firmware-Updates gelegentlich neue dazu, weshalb bei mir einige fehlten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr die Sprachgenerierung habe ich <a rel=\"noreferrer noopener\" href=\"https:\/\/app.uberduck.ai\/\" data-type=\"URL\" data-id=\"https:\/\/app.uberduck.ai\/\" target=\"_blank\">Uberduck<\/a> verwendet. \u00dcber den Button &#8222;Text to Speech&#8220; ist die TTS-Engine erreichbar. Bevor man eigene Texte synthetisieren kann, muss man sich einen Account angelegen. Der ist aber (mit gewissen Einschr\u00e4nungen) kostenlos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der Rest ist dann selbsterkl\u00e4rend:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Stimme ausw\u00e4hlen (die Qualit\u00e4t der Stimmen ist sehr unterschiedlich)\n<ul class=\"wp-block-list\">\n<li>Text eingeben und &#8222;Synthesize&#8220; dr\u00fccken<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Actions \/ Download<\/li>\n\n\n\n<li>Umbenennen  der .wav-Datei in den Namen, den der Saugroboter erwartet<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Normalisieren<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die Stimme von HAL 9000 ist sehr leise. Spielt man die generierten Dateien direkt auf den Saugroboter sind die Ansagen nur schwer zu verstehen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ich habe deshalb die Audio-Dateien normalisiert, also die Lautst\u00e4rke soweit angehoben, dass der maximale Wert in der Datei 0 dB entspricht. Hintergrund und verschiedene Methoden sind in <a rel=\"noreferrer noopener\" href=\"https:\/\/superuser.com\/questions\/323119\/how-can-i-normalize-audio-using-ffmpeg\" target=\"_blank\">diesem Beitrag<\/a> sch\u00f6n erkl\u00e4rt. Ich habe mir f\u00fcr das manuelle Vorgehen ein kleines Shell-Skript geschrieben.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\n\ninputdir=$1\noutputdir=$2\n\nfor wav in \"$inputdir\"\/*.wav\ndo\n\techo $wav\n\tdatei=${wav##*\/}\n\techo $datei\n\tvolume=`ffmpeg -i $wav -af \"volumedetect\" -vn -sn -dn -f null \/dev\/null 2&gt;&amp;1 | grep max_volume | awk '{print $5}'`\n\techo $volume\n\tvolume_norm=`echo \"$volume * (-1)\" | bc -l`\n\techo $volume_norm\n\t\n\tffmpeg -i $wav -af \"volume=\"\"$volume_norm\"\"dB\" \"$outputdir\"\/\"$datei\"\ndone<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Es ben\u00f6tigt zwei Parameter: Das Input-Verzeichnis und das Verzeichnis, in das die normierten Dateien geschrieben werden sollen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Kopieren der Dateien auf den Saugroboter<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nun bleibt nur noch, die Sound-Dateien auf den Roborock zu \u00fcbertragen. Dazu wieder per SSH als root mit dem Saugroboter verbinden.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/mnt\/data\/rockrobo\/sounds\nscp user@Rechner:\/path\/to\/working\/dir\/*.wav .<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">&#8230; und fertig ist die Aktion. Ab sofort redet der Staubsauger mit der Stimme von HAL 9000.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das Skript und generierten Dateien finden sich <a rel=\"noreferrer noopener\" href=\"https:\/\/drive.google.com\/file\/d\/1BpRD_9gc0aMJ_e1a483C_pjG72M212iz\/view?usp=share_link\" target=\"_blank\">hier<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Seit mehreren Jahren haben wir einen Saugroboter, den Roborock S5. Da mir nicht ganz wohl dabei war, dass der Roboter st\u00e4ndig 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 &hellip; <a href=\"https:\/\/benedikt-merz.de\/Blog\/?p=1284\" class=\"more-link\"><span class=\"screen-reader-text\">Eine neue Stimme f\u00fcr den Saugroboter<\/span> weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":1289,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[128,122,129,126,130,124,127,125,121,123],"class_list":["post-1284","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technik","tag-hal-9000","tag-roborock","tag-rockrobo","tag-s5","tag-staubsaugroboter","tag-stimme","tag-tts","tag-uberduck","tag-valetudo","tag-voice-pack"],"_links":{"self":[{"href":"https:\/\/benedikt-merz.de\/Blog\/index.php?rest_route=\/wp\/v2\/posts\/1284","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/benedikt-merz.de\/Blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/benedikt-merz.de\/Blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/benedikt-merz.de\/Blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/benedikt-merz.de\/Blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1284"}],"version-history":[{"count":5,"href":"https:\/\/benedikt-merz.de\/Blog\/index.php?rest_route=\/wp\/v2\/posts\/1284\/revisions"}],"predecessor-version":[{"id":1292,"href":"https:\/\/benedikt-merz.de\/Blog\/index.php?rest_route=\/wp\/v2\/posts\/1284\/revisions\/1292"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/benedikt-merz.de\/Blog\/index.php?rest_route=\/wp\/v2\/media\/1289"}],"wp:attachment":[{"href":"https:\/\/benedikt-merz.de\/Blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1284"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/benedikt-merz.de\/Blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1284"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/benedikt-merz.de\/Blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1284"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}