1 Punkte von GN⁺ 4 시간 전 | 1 Kommentare | Auf WhatsApp teilen
  • Lokale Sprachsynthese kann inzwischen auch ohne dedizierte GPU eine durchaus praxisnahe Qualität liefern; in der Beispielumgebung bleibt die GPU für LLM-Inferenz frei, während die CPU das TTS übernimmt
  • Kokoro ist ein Modell mit 82M Parametern, unterstützt aber mehrere Sprachen wie Englisch, Chinesisch und Hindi, bietet rund 50 Stimmen und ist am stärksten für Englisch optimiert
  • Die einfachste Einrichtung ist das Starten des Kokoro-FastAPI-Containers; das Sprachmodell ist bereits enthalten, daher ist das Image etwa 5 GB groß
  • Es bietet eine mit der OpenAI Speech API kompatible Schnittstelle, sodass sich bestehende Programme auf Basis von Sprach-APIs relativ einfach auf lokales TTS umstellen lassen
  • Die Synthese kurzer Absätze liegt bei etwa 4,7 Sekunden auf einem Intel Core i7-4770K, 4,5 Sekunden auf einem Apple M2 Pro und 1,5 Sekunden auf einem AMD Ryzen 7 8745HS, sodass sich lokale LLM-Antworten anhören statt lesen lassen

Kokoro TTS nur mit CPU ausführen

  • Noch vor ein paar Jahren war realistische lokale Sprachsynthese schwierig, heute lassen sich jedoch hochwertige Stimmen erzeugen, ohne sensible Daten an externe Dienste zu geben
  • Das Beispiel läuft auf einer zuvor behandelten GTX-1080-Ti-Maschine für lokale LLMs
    • Die dedizierte GPU dieser Maschine ist für LLM-Inferenz reserviert
    • Die Sprachsynthese nutzt ausschließlich die CPU
  • Verwendet wird das Modell Kokoro
    • Es ist ein Modell mit 82M Parametern
    • Es erzeugt realistische Stimmen in mehreren Sprachen wie Englisch, Chinesisch und Hindi
    • Es bietet etwa 50 Stimmen und ist vor allem für Englisch optimiert
  • Die einfachste Server-Konfiguration nutzt das Container-Image Kokoro-FastAPI
    • Es enthält bereits heruntergeladene Sprachmodelle
    • Deshalb ist das Container-Image etwa 5 GB groß
  • Docker- oder Podman-Startbefehl:
    podman run -p 8880:8880 ghcr.io/remsky/kokoro-fastapi-cpu
    
  • Nach dem Start lässt sich das Web-UI unter localhost:8880/web öffnen; dort kann Text eingegeben, Audio erzeugt und automatisch abgespielt werden

OpenAI-kompatible API und Beispielausführung

  • Der Kokoro-FastAPI-Container bietet neben dem Web-UI auch eine mit der OpenAI Speech API kompatible TTS-Schnittstelle
    • Bestehende Programme, die die OpenAI Speech API nutzen, lassen sich leicht anpassen
    • Beispielcode für JavaScript und Python findet sich unter github.com/remotebrowser/speak
  • JavaScript-Beispiel:
    export TTS_API_BASE_URL=http://127.0.0.1:8880/v1
    ./speak.js "Good morning! How are you today?"
    
  • Python-Beispiel:
    export TTS_API_BASE_URL=http://127.0.0.1:8880/v1
    ./speak.py "Good morning! How are you today?"
    
  • Das erzeugte Audio wird als MP3-Datei gespeichert
    • Wenn SoX oder Sound eXchange installiert ist, wird das Audio automatisch abgespielt
    • Informationen zu SoX gibt es unter sox.sf.net
  • Um eine andere Stimme auszuwählen, wird die Umgebungsvariable TTS_VOICE gesetzt
    export TTS_API_BASE_URL=http://127.0.0.1:8880/v1
    export TTS_VOICE="am_eric"
    ./speak.js "Good morning! How are you today?"
    
  • Die vollständige Liste verfügbarer Stimmen steht in Kokoro VOICES.md

Synthesezeiten je CPU und Alternativen

  • Bei der Synthese eines kurzen Testabsatzes mit der Stimme am_eric ergaben sich auf Basis des besten Ergebnisses aus drei Durchläufen folgende Zeiten:
    • Intel Core i7-4770K: 4,7 Sekunden
    • Apple M2 Pro: 4,5 Sekunden
    • AMD Ryzen 7 8745HS: 1,5 Sekunden
  • Die erste CPU in der Liste wurde vor 12 Jahren veröffentlicht, was zeigt, dass auch ältere Prozessoren diese Aufgabe bewältigen können
  • Als OpenAI-kompatible, containerisierte TTS-Alternative gibt es auch Speaches
    • Anders als bei Kokoro-FastAPI sind die Sprachgewichte nicht im Container-Image enthalten und müssen explizit per API heruntergeladen werden
    • Es bietet auch hochwertige STT-Funktionen einschließlich Whisper
    • Wenn eine Anwendung sowohl TTS als auch STT benötigt, kann dies eine Option sein, beides an einer Stelle zu bündeln
  • In Kombination mit einem lokalen LLM wird ein Nutzungsszenario möglich, bei dem LLM-Antworten als Sprache gehört statt gelesen werden

1 Kommentare

 
GN⁺ 4 시간 전
Hacker-News-Kommentare
  • Ich habe Kokoro ziemlich oft für Accessibility-Produkte verwendet, und es war angenehm damit zu arbeiten, weil man keine NVidia-GPU braucht, wie sie viele andere TTS-Lösungen mit ähnlicher Qualität verlangen.
    Besonders gut gefällt mir, dass man IPA-Aussprachehilfen manuell einfügen kann. Es gab Fälle, in denen wichtige Wörter Homographe waren und Kokoro sie falsch ausgesprochen hat.
    Allerdings ist es schwach, wenn man es nur ein oder zwei Wörter sprechen lässt. Wenn man es zum Beispiel nur "six" sagen lässt, sagt es fast immer etwas wie "ah-six-ah". Gibt man stattdessen einen längeren Satz wie "The word is: six" ein, liest es korrekt, und weil die Kokoro-API Zeitstempel für jedes Wort im Satz liefert, kann man mit einem Python-Skript nur das gewünschte Wort herausschneiden. Die Intonation ist etwas flach, aber sehr stabil.
    Auf Discord wurde mir gesagt, das sei eine Grenze der kleinen Parametergröße, und zur Verteidigung von Kokoro: Selbst Stimmen von eleven-labs haben dieses Problem gelegentlich.

    • Den gleichen Trick nutze ich auch bei vielen anderen Tools. Wenn man zu Wispr oder Google "Knight" sagt, wird daraus "night", aber man kann einfach "Knight to f3" sagen und dann nur "to f3" löschen.
    • Das ist tatsächlich eine häufige Schwäche von TTS-Modellen.
      Mein Anwendungsfall besteht fast nur aus einzelnen Wörtern, daher passt es für mich nicht, weil ich die Verkettung oder Aufteilung von Eingabe und Ausgabe nicht extra behandeln möchte.
  • Das ist tatsächlich ein Thema, das mich interessiert, daher ist es spannend.
    Früher habe ich whisperx separat gepflegt, weil mir neben der einfachen Transkription auch Timing und Sprechererkennung wichtig sind, wie man sie etwa für Untertitel braucht. Es hängt aber von pyannote ab, und wegen der unklaren Lizenz ist auch die Installationsautomatisierung schwieriger.
    Also habe ich nach etwas gesucht, das bessere Transkription liefert und zugleich Sprechertrennung unterstützt, und mich dann für parakeet bei der Transkription und softformer bei der Sprechertrennung entschieden. Die meisten verfügbaren Engines enthalten softformer allerdings nicht.
    Ich habe einen OpenAI-kompatiblen Server für parakeet-rs mit softformer-Unterstützung gebaut (https://github.com/altunenes/parakeet-rs) und nutze ihn zusammen mit OpenWhispr, einer Desktop-Transkriptions-App, die verschiedene Komfortfunktionen abdeckt.
    Meine GPU ist für andere Dinge reserviert, daher habe ich noch keinen GPU-Pfad hinzugefügt und transkribiere derzeit nur auf der CPU, aber es fühlt sich sehr mächtig an, Transkription bei Bedarf lokal laufen lassen zu können.

    • Das hier ist Text-to-Speech, das dort ist Speech-to-Text.
      Für das, was du machen willst, funktioniert Senko zusammen mit parakeet sehr gut bei der Sprechertrennung. Auf meinem MacBook war es schneller und genauer als Pyannote und whisper.
    • Mit einfachem whisper.cpp geht das ähnlich.
  • Dieses Modell ist wirklich gut. Es war schade, dass ich wegen GPU-Mangel kaum mit lokalen Modellen spielen konnte, aber vor etwa einem Monat habe ich Kokoro auf einer GTX1650 installiert und daraus ein TTS zum Vorlesen von Artikeln gebaut.
    In einer einfachen WebUI füge ich eine URL oder einen kopierten Textblock ein, Python bereinigt das und schickt es an Kokoro, erzeugt TTS und stellt das Ergebnis dann als RSS für Apple Podcasts bereit. Ich nutze das, um beim morgendlichen Pendeln aufgesparte Artikel oder Blogposts nachzuholen.
    Irgendwann möchte ich vielleicht auch etwas wie NotebookLM bauen, das mehrere Stimmen verteilt einsetzt und gesammelte News-Einträge wie eine morgendliche Radiosendung vorliest.

  • Vor ein paar Monaten habe ich eine Chrome-Erweiterung gebaut, die das auf jeder Webseite erledigt und dabei den gerade gelesenen Satz hervorhebt.
    Damit kann man sowohl das Starten eines Containers als auch das Kopieren und Einfügen des Webseiteninhalts überspringen, also könnte es für Leute nützlich sein, die Kokoro bequemer nutzen wollen.
    https://chromewebstore.google.com/detail/local-reader-ai-on-...

  • TTS hat sich wirklich stark weiterentwickelt, und es gibt viele Optionen. Da ist Kokoro, und Pocket TTS ist ein kleines 100M-Modell, das sogar Stimmklonen beherrscht.
    Chatterbox Turbo ist etwas größer, unterstützt dafür aber die Steuerung von Emotionen in der Stimme besser, und Fish Audio S2 ist noch größer, erlaubt dafür aber eine praktisch unbegrenzte und viel feinere Kontrolle über Tonfall und Emotion. Das alles läuft problemlos auf einem MacBook.

  • Ein gutes Repository, um Vergleiche von TTS-Modellen zu beginnen, ist https://github.com/5uck1ess/tts-bench.
    Wenn man bedenkt, dass Kokoro ein vor 1,5 Jahren veröffentlichtes Modell ist, ist es wirklich sehr gut und liefert gemessen an seiner Größe starke Leistung: https://5uck1ess.github.io/tts-bench/scores.html

  • Früher habe ich Piper für lokales TTS verwendet, aber Kokoro wirkt ebenfalls interessant.

  • Sehr cool. Ich nutze Linux und kann daher Aqua oder Whipsrflow und Ähnliches nicht verwenden, deshalb arbeite ich seit Januar mit einer selbstgebauten Lösung.
    Kürzlich habe ich sie aufgeräumt und einfacher installierbar gemacht. Falls es jemanden interessiert: https://github.com/Hugo0/voiceio
    Sie verbessert sich mit der Zeit selbst, läuft auf der lokalen Maschine und ist insgesamt brauchbare Software. Inzwischen laufen 60 % meiner PC-Interaktionen rein über Spracheingabe.

    • Das hier ist Text-to-Speech, das dort ist Speech-to-Text. Trotzdem sieht das STT interessant aus.
  • Ich mag Kokoro wirklich sehr. Ich nutze es, um E-Books ohne Hörbuchversion lesbar zu machen, und dafür funktioniert es ziemlich gut.
    Ich habe ein Python-Skript geschrieben, das epub/html liest, das Modell ausführt und dann mp3-Dateien schreibt.
    Die Zahl der von Kokoro unterstützten Sprachen ist begrenzt, daher musste ich für Niederländisch ein anderes Modell verwenden, dessen Qualität aber nicht annähernd so gut ist. Meistens ist es deutlich langsamer und auch größer, sodass es für 8 GB VRAM zu groß ist.
    Am Ende habe ich sogar die eingebaute Windows-TTS verwendet; sie klingt zwar nicht natürlich, kann aber zumindest die meisten Wörter aussprechen und ist sehr schnell.

  • Ich habe einen Tag lang mit AI herumgebastelt und aus Kokoro die teuren Layer entfernt, wodurch es auf einer Smartphone-CPU und mit MNN dreimal schneller läuft.
    Die Qualität ist sehr ähnlich. Das kann je nach Umgebung variieren, aber das Skript ist hier: https://github.com/DavidVentura/translator-rs/blob/master/sc...