Zum Inhalt springen →

Mit Chat-GPT sprechen – VoiceGPT

Warum muss man eigentlich die ganze Zeit auf einer Tastatur rumhacken und den von Chat-GPT erstellten Text lesen? Das geht doch auch anders.

Also habe ich mich mal hingesetzt und eine kleine Android App erstellt, die es ermöglicht, sich mich Chat-GPT (bzw. GPT-3) in natürlicher Sprache zu unterhalten. Dazu ist die Kombination der folgenden Komponenten nötig.

  1. Spracherkennung
    Auf den meisten Android Geräten ist schon eine gute offline Speech2Text Funktion installiert, die man per API nutzen kann.
  2. Anbindung an OpenAI API („gpt-3.5-turbo“)
    Die OpenAI Chat API ist die zentrale Komponente. Die Prompts werden an die API gesendet und die Antworten im Chatverlauf angezeigt.
  3. Sprachausgabe
    Die vorinstallierte Sprachausgabe oder alternativ die ElevenLabs Inc. Sprachausgabe sorgt dafür, dass man nicht alles lesen muss. Die Sparchausgabe wird bei einem Klick auf die Chat-Message aktiviert. Evtl. möchte man nicht alles hören.
  4. GUI
    Eine einfache Nutzeroberfläche die sich an den bekannten Chat Apps orientiert. Zusätzlich noch einen Settings Screen wo API Keys und ein paar andere Kleinigkeiten konfiguriert werden können.
  5. Cache
    Cache für die ElevenLabs Inc. Audio-Downloads um die Nutzung der ElevenLabs API möglichst selten aufzurufen, da das kostenlose Kontingent schnell aufgebraucht ist.

Die fertige App sieht dann wie folgt aus:

Wie man sieht alles noch als Text. Wenn man auf das Mikrofon klickt, kann man eine Nachricht aufnehmen, die dann in Text umgewandelt wird. Auf der anderen Seite kann man eine Chat-Message im Verlauf anklicken um die Nachricht in (einigermaßen natürlicher) Sprache ausgeben zu lassen. So kann man dann mit Chat-GPT kommunizieren, ohne Schreiben oder Lesen zu müssen.

Einstellungen

Damit das funktioniert, müssen einige Einstellungen vorgenommen werden. Es muss mindestens ein Open-AI API Key eingetragen werden. So einen API Key kann man unter https://platform.openai.com/account/api-keys erstellen und dann in der App eintragen.

Die OpenAI Api ist nicht kostenlos, aber das verwendete „gpt-3.5-turbo“ Modell ist sehr preiswert und die „Kostenlose Testnutzung“ reicht sehr lange.

Ich habe das ganze Wochenende an der App gearbeitet und die Kosten für meine Tests belaufen sich gerade mal auf 4 Cent. Das liegt daran, dass „gpt-3.5-turbo“ nur 4096 Token in einem Request verarbeiten kann und 1000 Token gerade mal $0,002 kosten.

OpenAI API gpt-3.5-turbo Preis https://openai.com/pricing

Aus dem Grund werden in einem Request nur die letzten 4 Chat Elemente gesendet. Alles, was davor im Chat ausgetauscht wurde, kann das GPT-3 Modell nicht berücksichtigen (hier ist auf jeden Fall noch Optimierungspotential vorhanden).

TextToSpeech

Die Sprachausgabe der Messages in der App kann auf 2 Arten erfolgen. Mit einem Schalter in den Einstellungen kann man die Sprachausgabe umstellen.

Sprachausgabe über Android API

Für die Sprachausgabe von Texten gibt es unter Android eine fertige Lösung „android.speech.tts.TextToSpeech„. Diese funktioniert aber nicht auf allen Android Geräten und auch nur semi-gut. Aber die Stimme ist verständlich und in verschieden Sprachen (unter anderem auch deutsch) verfügbar

Sprachausgabe über ElevenLabs API

Die ElevenLabs Sprachausgabe ist deutlich besser und seit dem 27.04 endlich in vielen unterschiedlichen Sprachen verfügbar (https://beta.elevenlabs.io/blog/eleven-multilingual-v1/).

Heute freuen wir uns, Eleven Multilingual v1 vorstellen zu können – unser fortschrittliches Sprachsynthesemodell, das sieben neue Sprachen unterstützt: Französisch, Deutsch, Hindi, Italienisch, Polnisch, Portugiesisch und Spanisch. Aufbauend auf der Forschung, die Eleven Monolingual v1 angetrieben hat, nutzt unser aktueller Deep-Learning-Ansatz mehr Daten, mehr Rechenleistung und neuartige Techniken in einem immer ausgefeilteren Modell, das in der Lage ist, Textnuancen zu verstehen und eine emotionsgeladene Performance zu liefern. Dieser Fortschritt erweitert die kreativen Horizonte für Kreative, Spieleentwickler und Verlage und ebnet den Weg für die Nutzung generativer Medien, um mehr lokalisierte, zugängliche und fantasievolle Inhalte zu erstellen.

Quelle: https://beta.elevenlabs.io/blog/eleven-multilingual-v1/

Die Doku der ElevenLabs API ist unter https://api.elevenlabs.io/docs zu finden. Die HTTP-Requests sind recht einfach zu implementieren und eine eigene Bibliothek zu nutzen lohnt hier eigentlich nicht. In der VoiceGPT App übernimmt das die Methode speak in der Klasse ElevenLabsWrapper.java.

    public static void speak(Context context, String apiKey, String voiceId, String msg, {
        ...

            URL url = new URL(ELEVENLABS_API_URL+voiceId);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("POST");
            con.setRequestProperty("accept", "audio/mpeg");
            con.setRequestProperty("xi-api-key", apiKey);
            con.setRequestProperty("Content-Type", "application/json");
            con.setDoOutput(true);

            JSONObject payload = new JSONObject();
            payload.put("text", msg);
            payload.put("model_id", "eleven_multilingual_v1");
            payload.put("language_id", "de-de");
            JSONObject voiceSettings = new JSONObject();
            voiceSettings.put("stability", 0.15); // TODO Settings
            voiceSettings.put("similarity_boost", 0.65); // TODO Settings
            payload.put("voice_settings", voiceSettings);

            OutputStream os = con.getOutputStream();
            os.write(payload.toString().getBytes());
            os.flush();
            os.close();

            responseCode = con.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {

                FileOutputStream fileOutputStream = new FileOutputStream(downloadFile);
                byte[] buffer = new byte[1024];
                int bytesRead;
                while ((bytesRead = con.getInputStream().read(buffer)) != -1) {
                    fileOutputStream.write(buffer, 0, bytesRead);
                }
                fileOutputStream.close();
                playMediaFile(downloadFile);

            } else {
                String responseMessage = con.getResponseMessage();
                Log.d(TAG, responseMessage);
            }
            con.disconnect();

        ...
    }

Die VoiceId ist in der App erst mal fest eingetragen. Die Stimme wirkt etwas streng, ist aber deutlich besser als die Original Android TExtToSpeech Stimme. Hier könnte später noch die Stimme in den Settings ergänzt werden.

Die Sprachausgabe über die ElevenLabs API ist leider auch nicht unbegrenzt kostenlos. Es gibt zwar einen Free-Plan, aber die 10.000 Zeichen sind schnell verbraucht. Dann muss man auf den nächsten Monat warten oder die Android eigene Sprachausgabe verwenden.

Um die Nutzung der ElevenLabs API möglichst gering zu halten, gibt es in der App einen Cache, der alle Antworten der Sprach-Synthese speichert. So wird jeder für jeden Text im Chat die Sprachausgabe als Datei gespeichert bei Bedarf wiederverwendet.

Die fertige VoiceGPT App

Die fertige App kann man unter https://github.com/msoftware/VoiceGPT finden – viel Spaß damit :-).

PS: Es gibt in der App noch einiges zu verbessern. Wer also Lust hat, kann gerne daran weiter entwickeln un Pull Requests erstellen. 🙂

Fazit

Die VoiceGPT App ist ein Beispiel dafür was heute möglich ist. Mit ein paar Zeilen Code kann jeder eine App erstellen, die vor ein paar Jahren noch undenkbar gewesen wäre. Dabei habe ich hier nichts selbst entwickelt und nur fertige Komponenten zusammengesteckt. Bei der Entwicklung steht man auf den Schultern von Riesen die ihre Dienste für kleines Geld anbieten und es ermöglichen, so ein Projekt mal eben am Wochenende zu realisieren – was für eine Zeit und wo stehen wir in 5 – 10 Jahren?

Veröffentlicht in Allgemein