Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Praktische Anwendungen (Showcase)
    4. Offline Sprachausgabe in hoher Qualität

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Offline Sprachausgabe in hoher Qualität

    This topic has been deleted. Only users with topic management privileges can see it.
    • uweklatt
      uweklatt @wendy2702 last edited by uweklatt

      Lokaler Text2Speak (TTS) Server

      Ich beschreibe hier meine Vorgehensweise zur Einrichtung eines im lokalen Netzwerk befindlichen TTS-Servers. Dieser kann zum Erstellen von WAV-Sounddateien genutzt werden. Als Eingabe dient der gewünschte Text, den man über eine Webschnittstelle an diesen Server sendet und dann die WAV-Datei anschließend von diesem herunterladen und weiter verwenden kann.

      Es gibt diverse Stimmen in vielen Sprachen: https://github.com/rhasspy/piper/blob/master/VOICES.md

      Verwendete Softwarekomponenten:

      • Debian oder Devuan Linux (minimale Serverversion genügt)
      • Webserver mit PHP-CGI (lighttpd)
      • Python3 mit PIP
      • piper (AI-Sprachgenerierung) => https://github.com/rhasspy/piper

      Ich habe einen „neuen“ virtuellen Proxmox Server genutzt. Man kann aber auch einen RasPi oder einen anderen Linuxserver verwenden. Dann muss die Installation der einzelnen Softwarekomponenten evtl. angepasst werden. Ich haben Devuan 4 als Basis verwendet. https://www.devuan.org/

      Bei Debian/Deuvan basierten Linuxsystemen wird apt zur Softwareverwaltung verwendet.
      Das wird auch bei dieser Anleitung verwendet.

      Die folgenden Schritte habe ich als root-User durchgeführt:

      Installation des Devuan-Linux bzw. Nutzung eines vorhandenen Linux.
      Anschließend Update der aktuellen Software:

      apt update
      apt upgrade

      Installation von python und pip:

      apt install python3 pip

      Installation von piper:

      pip install piper-tts

      Test der piper Installation: (Optional)

      echo 'Willkommen!' | piper --model de_DE-thorsten-high --output_file welcome.wav

      Diese WAV-Datei sollte sich mit einem Player abspielen lassen.
      Beim ersten Aufruf von „piper“ wird die benutzte Stimme (hier de_DE_thorsten-high) heruntergeladen und im aktuellen Verzeichnis gespeichert. Die generierte WAV-Datei landet ebenfalls im aktuellen Verzeichnis.

      Installation des Webservers mit php-cgi:

      apt install lighttpd php-cgi

      Aktivierung von PHP fastcgi:

      ln -s /etc/lighttpd/conf-available/10-fastcgi.conf /etc/lighttpd/conf-enabled/10-fastcgi.conf
      ln -s /etc/lighttpd/conf-available/15-fastcgi-php.conf /etc/lighttpd/conf-enabled/15-fastcgi-php.conf

      Neustart des Webservers:

      /etc/init.d/lighttpd restart

      Damit die heruntergeladene Stimme und die WAV-Datei im WEB-Verzeichnis /var/www/html erstellt werden können, bekommt dieses Verzeichnis Schreibrechte für alle User! Das sollte man bei einem öffentlich erreichbaren Server so nicht tun!

      chmod 777 /var/www/html

      Im Webverzeichnis /var/www/html wird nun eine kleine PHP-Datei index.php erstellt, die zum Empfang des zu erstellenden Textes dient. Sie ruft dann piper mit den erforderlichen Parametern auf.

      /var/www/html/index.php:

      <?php
        $text = htmlspecialchars_decode($_GET['text']); 
        $text2 = escapeshellarg($text);
        exec("/bin/echo '".$text2."' | /usr/local/bin/piper --model de_DE-thorsten-high --output_file tts.wav");
      ?>
      

      Nun kann durch den Aufruf des Servers mit Übergabe des Textes eine entsprechende WAV-Datei erstellt werden:
      http://server-ip?text=Willkommen

      Die WAV-Datei kann anschliessend heruntergeladen werden:
      http://server-ip/tts.wav

      Im ioBroker nutze ich den Server per JavaScript mit dem Chromecast Adapter.
      Der gewünschte Text wird mit dem httpGet() Befehl zum Server übertragen und anschließend die URL der WAV-Datei im Chromecast Adapter im Objekt chromecast.0.Google_Home.player.url2play eingetragen und abgespielt.
      Damit das sauber funktioniert, musste ich nach dem Generieren der WAV-Datei eine kleine Pause (1 sec) einfügen, bevor die URL zum Chromecast gesandt wird.
      Der Code sieht wie folgt aus:

      function talk(text)
      {
          setState('chromecast.0.Google_Home.player.volume', 30);
          setState('chromecast.0.Google_Home.player.announcement', "http://ioBroker-ip:8082/sayit.0/tts.userfiles/mp3_silence_1sec.mp3");
          httpGet("http://server-ip/?text="+text, function() 
          {
              setTimeout(function()
              { 
                  setState('chromecast.0.Google_Home.player.url2play', 'http://server-ip/tts.wav'); 
              }, 1000);  
          });
      }
      

      Eine Demo für den Webbrowser liefert diese HTML-Datei. Sie bietet neben der Eingabemöglichkeit des Textes auch einen Player zum direkten Abspielen im Browser.

      <!doctype html>
      <head>
      <meta charset=utf-8>
      <title>TTS-Demo</title>
      </head>
      <body>
        <?php
          $text = htmlspecialchars_decode($_GET['text']); 
          $text2 = escapeshellarg($text);
          exec("/bin/echo '".$text2."' | /usr/local/bin/piper --model de_DE-thorsten-high --output_file play.wav");
        ?>
        <form action="/play.php">
          <input type="text" name="text" value="<?php echo $text;?>">
          <input type="submit" value="Generate">
        </form> 
        <audio id="audio" controls src="/play.wav"></audio><br>
        <a href="/play.wav">Download WAV</a>
        <script type="text/javascript">
          document.getElementById('audio').addEventListener("ended",function() {
              this.src = "/play.wav.php?nocache="+new Date().getTime();
              this.play();
          });
        </script>
      </body>
      </html>
      

      Evtl. ist das alles für den Einen oder Anderen nützlich.

      Tschau
      Uwe

      haselchen P 2 Replies Last reply Reply Quote 4
      • haselchen
        haselchen Most Active @uweklatt last edited by

        @uweklatt

        Hey...

        erstmal Hut ab für die Anleitung. Super gemacht.
        Kannst Du vielleicht ein paar Anwendungsfälle geben?

        Vielleicht habe ich auch nicht richtig um die Ecke gedacht.
        Text und MP3 kann ich ja auch so auf dem Google z.b. ausgeben lassen.
        Dazu muss natürlich die ganze Maschinerie laufen, aber das muss Dein Server ja dann auch.....

        uweklatt 1 Reply Last reply Reply Quote 0
        • uweklatt
          uweklatt @haselchen last edited by

          @haselchen sagte in Offline Sprachausgabe in hoher Qualität:

          Kannst Du vielleicht ein paar Anwendungsfälle geben?
          Text und MP3 kann ich ja auch so auf dem Google z.b. ausgeben lassen.

          Die Hauptmotivation war, ohne die Cloud auszukommen.
          Die gesamte Sprachgenerierung erfolgt offline, also ohne Cloud. Und das Ergebnis ist deutlich besser, als andere lokale Sprachgeneratoren.

          Durch die Implementierung in Verbindung mit einem Webserver kann man die Spracherzeugung leicht in viele Tools und Projekte integrieren.

          Längerfristig möchte ich auch die Spracheingabe lokal erledigen. 😊

          Tschau
          Uwe

          P.S: Hier das Ergebnis des Textes "Peiper funktioniert prima im lokalen Netzwerk": play.mp3

          1 Reply Last reply Reply Quote 0
          • liv-in-sky
            liv-in-sky @uweklatt last edited by

            @uweklatt

            wo findet letztlich die ausgabe statt ?

            uweklatt 1 Reply Last reply Reply Quote 0
            • uweklatt
              uweklatt @liv-in-sky last edited by

              @liv-in-sky sagte in Offline Sprachausgabe in hoher Qualität:

              wo findet letztlich die ausgabe statt ?

              In meinem Fall auf einem Google Home mini (mit dem Chromecast Adapter).
              Man kann die WAV-Datei aber auch mit einem anderen Netzwerkplayer ausgeben.

              Tschau
              Uwe

              liv-in-sky 1 Reply Last reply Reply Quote 0
              • liv-in-sky
                liv-in-sky @uweklatt last edited by

                @uweklatt

                also braucht man natürlich eine alexa oder google box

                uweklatt 1 Reply Last reply Reply Quote 0
                • uweklatt
                  uweklatt @liv-in-sky last edited by uweklatt

                  @liv-in-sky sagte in Offline Sprachausgabe in hoher Qualität:

                  also braucht man natürlich eine alexa oder google box

                  Nein, jedes "Gerät", das WAV-Dateien im lokalen Netzwerk abspielen kann, kann für die Ausgabe verwendet werden. (z.B. auch ein RasPi).

                  Im Prinzp kann der TTS Server auch selbst die Ausgabe übernehmen, wenn er einen Audioausgang hat. Dann kann die WAV-Datei mit z.B.

                  aplay /var/www/html/tts.wav

                  direkt ausgegeben werden. Noch eleganter ist es, die Ausgabe von Piper direkt als Stream in das Audiodevice zu leiten. Piper kann auch direkt Audiodaten als RAW Stream generieren...

                  Tschau
                  Uwe

                  J 1 Reply Last reply Reply Quote 1
                  • J
                    jwerlsdf @uweklatt last edited by jwerlsdf

                    @uweklatt
                    Vielen Dank für die Anleitung. Ich habe noch zwei/drei Fragen:

                    1. Gibt es eine Möglichkeit , anstatt Thorsten eine weibliche Frsuenstimme zu installieren? Wie sähe dies aus?
                    2. Gibt es die Möglichkeit anstatt wav eine mp3 zu erzeugen?
                    3. Anstatt chromecast könnte ich ja die Datei such über sonos abspielen?!

                    Beste Grüße

                    uweklatt 1 Reply Last reply Reply Quote 0
                    • uweklatt
                      uweklatt @jwerlsdf last edited by uweklatt

                      @jwerlsdf
                      Es gibt auch deutsche Frauenstimmen. Die Namen sind oben verlinkt.
                      Man muss dazu den Namen der Stimme in der PHP Datei austauschen.
                      In der verfügbaren Qualität "low" klingen die aber nicht so gut wie Thorsten "high".

                      Ein MP3 erfordert noch einen weiteren Konvertierungsschritt, z.B. mit ffmpeg.
                      Auch das kann man in das PHP Script integrieren.

                      Wenn man dem Sonos eine Datei zum Abspielen übermitteln kann, geht das.
                      Leider kenne ich die Sonos Geräte zu wenig, um das konkret zu beantworten.

                      Tschau
                      Uwe

                      Rene55 S 2 Replies Last reply Reply Quote 0
                      • Rene55
                        Rene55 @uweklatt last edited by

                        @uweklatt Ich geb mich die Tage auch mal dadran - ich hab den Sayit nie ans laufen bekommen (oder falsch verstanden). 👍

                        uweklatt 1 Reply Last reply Reply Quote 0
                        • uweklatt
                          uweklatt @Rene55 last edited by

                          @rene55
                          Du hast ja auch Proxmox am laufen. Mein Setup läuft ebenfalls als Proxmox LXC mit dem Devuan 4 Image.

                          Tschau
                          Uwe

                          1 Reply Last reply Reply Quote 0
                          • S
                            Shadowhunter23 @uweklatt last edited by

                            @uweklatt sagte in Offline Sprachausgabe in hoher Qualität:

                            In der verfügbaren Qualität "low" klingen die aber nicht so gut wie Thorsten "high".

                            Warum gibt es nur Thorsten als "high" Version?

                            uweklatt Thorsten-Voice 2 Replies Last reply Reply Quote 0
                            • uweklatt
                              uweklatt @Shadowhunter23 last edited by

                              @shadowhunter23
                              Keine Ahnung.

                              1 Reply Last reply Reply Quote 0
                              • Thorsten-Voice
                                Thorsten-Voice @Shadowhunter23 last edited by

                                Guude 👋 !
                                Bin durch @uweklatt auf diesen Thread aufmerksam geworden und habe mich auch gerade erst hier registriert. Sehr schöne Anleitung übrigens 👍 .

                                Mein Name ist Thorsten, Gründer von Thorsten-Voice und zugehöriger Stimmspender.

                                @Shadowhunter23 : Meine Stimme ist generell auch in der Qualitätsstufen "low" und "medium", sowie in div. Emotionen verfügbar. Woran hängt es denn?

                                Viele Grüße
                                Thorsten

                                uweklatt 1 Reply Last reply Reply Quote 0
                                • uweklatt
                                  uweklatt @Thorsten-Voice last edited by

                                  @thorsten-voice
                                  Die Frage war eher, warum es die anderen Stimmen nicht auch in hoher Qualität gibt.

                                  Tschau
                                  Uwe

                                  Thorsten-Voice 1 Reply Last reply Reply Quote 0
                                  • Thorsten-Voice
                                    Thorsten-Voice @uweklatt last edited by

                                    @uweklatt Ups, ich sollte tatsächlich richtig lesen 🤦‍♂️.

                                    Mike, der Entwickler von Piper hat die meisten Modelle in "medium" trainiert. Ich habe mein Thorsten Modell selber in "high" trainiert und bereitgestellt.
                                    Eventuell kann man in der Piper Community anfragen, ob er ein anderes deutschsprachiges Modell auch noch in "high" trainieren kann.

                                    1 Reply Last reply Reply Quote 0
                                    • P
                                      pejasus @uweklatt last edited by

                                      @uweklatt
                                      Danke für diese GENIALE Anleitung!, ich habe Sie auf einem Raspi4 installiert - ohne größere Probleme!

                                      1 Reply Last reply Reply Quote 0
                                      • First post
                                        Last post

                                      Support us

                                      ioBroker
                                      Community Adapters
                                      Donate

                                      1.0k
                                      Online

                                      31.7k
                                      Users

                                      79.7k
                                      Topics

                                      1.3m
                                      Posts

                                      9
                                      19
                                      1356
                                      Loading More Posts
                                      • Oldest to Newest
                                      • Newest to Oldest
                                      • Most Votes
                                      Reply
                                      • Reply as topic
                                      Log in to reply
                                      Community
                                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                      The ioBroker Community 2014-2023
                                      logo