So erstellen Sie Ihren eigenen Sprachassistenten mit Python und der ChatGPT-API

In diesem Beitrag wird beschrieben, wie Sie mit ChatGPT Ihren eigenen Sprachassistenten basierend auf der OpenAI-API erstellen. Der Assistent ist mit Python erstellt und verwendet Python-Bibliotheken für die Konvertierung von Sprache in Text und Text in Sprache. Zusätzlich enthält das Skript einige spezielle Befehle für die Aktivierung, Deaktivierung und den Testmodus.

Die Source ist auf Github verfügbar: https://github.com/benni-wdev/openai-voiceassistant

Sprachassistentenskript, das in Pycharm ausgeführt wird

Voraussetzungen

Sie benötigen einen Computer mit Linux (ich verwende in diesem Tutorial Linux Mint) mit Mikrofon und Ton. Zusätzlich benötigen Sie einen OpenAI-API-Schlüssel zum Aufruf der API von ChatGPT. Weitere Informationen finden Sie unter folgendem Link: how-to-fix-error-code-429-you-exceeded-your-current-quota-please-check-your-plan-and-billing-details-for-openai-api

Installieren Sie die benötigten Python-Pakete

Um das Skript auszuführen, werden einige zusätzliche Pakete benötigt.

$ sudo apt install python3-pyaudio
$ sudo apt install python3-dotenv
$ sudo apt install espeak

$ pip3 install pyttsx3
$ pip3 install speechrecognition
$ pip3 install openai


So installieren Sie das Skript und starten den Sprachassistenten

Man kann das Skript einfach kopieren, wir werden das Projekt von github hier direkt mittels git klonen (Um mehr über git zu lernen siehe post).

$ git clone https://github.com/benni-wdev/openai-voiceassistant.git
Cloning into 'openai-voiceassistant'...
remote: Enumerating objects: 14, done.
remote: Counting objects: 100% (14/14), done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 14 (delta 4), reused 7 (delta 3), pack-reused 0
Receiving objects: 100% (14/14), 6.11 KiB | 894.00 KiB/s, done.
Resolving deltas: 100% (4/4), done.

Jetzt muss die Umgebungsdatei erstellt werden, die Ihren OpenAI-API-Schlüssel für die Interaktion mit chatgpt enthält.

$ nano .env

Fügen Sie hier Ihren API-Schlüssel hinzu (Sie können einen hier erstellen Link)

OPENAI_API_KEY={your api key}

(Ersetzen Sie {your api key} durch Ihren konkreten Wert)

Nachdem Sie die Datei gespeichert haben, können Sie das Skript starten mit:

$ python3 voiceassistant.py

Sie sollten so etwas sehen.

$ python3 voiceassistant.py 
2023-12-03 14:33:30,050 INFO     Voice Assistant is listening...
ALSA lib pcm_dmix.c:1032:(snd_pcm_dmix_open) unable to open slave
ALSA lib pcm.c:2664:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2664:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2664:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib pcm_route.c:877:(find_matching_chmap) Found no matching channel map
ALSA lib pcm_oss.c:397:(_snd_pcm_oss_open) Cannot open device /dev/dsp
ALSA lib pcm_oss.c:397:(_snd_pcm_oss_open) Cannot open device /dev/dsp
ALSA lib confmisc.c:160:(snd_config_get_card) Invalid field card
ALSA lib pcm_usb_stream.c:482:(_snd_pcm_usb_stream_open) Invalid card 'card'
ALSA lib confmisc.c:160:(snd_config_get_card) Invalid field card
ALSA lib pcm_usb_stream.c:482:(_snd_pcm_usb_stream_open) Invalid card 'card'
ALSA lib pcm_dmix.c:1032:(snd_pcm_dmix_open) unable to open slave
ALSA lib pcm_dmix.c:1032:(snd_pcm_dmix_open) unable to open slave
ALSA lib pcm.c:2664:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2664:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2664:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib pcm_route.c:877:(find_matching_chmap) Found no matching channel map
ALSA lib pcm_oss.c:397:(_snd_pcm_oss_open) Cannot open device /dev/dsp
ALSA lib pcm_oss.c:397:(_snd_pcm_oss_open) Cannot open device /dev/dsp
ALSA lib confmisc.c:160:(snd_config_get_card) Invalid field card
ALSA lib pcm_usb_stream.c:482:(_snd_pcm_usb_stream_open) Invalid card 'card'
ALSA lib confmisc.c:160:(snd_config_get_card) Invalid field card
ALSA lib pcm_usb_stream.c:482:(_snd_pcm_usb_stream_open) Invalid card 'card'
ALSA lib pcm_dmix.c:1032:(snd_pcm_dmix_open) unable to open slave
2023-12-03 14:33:30,174 INFO     adjust noise
2023-12-03 14:33:30,386 INFO     Listening in mode 0
2023-12-03 14:33:35,379 INFO     audio captured

Ein Hinweis zu den ALSA-Logs: Diese Logs sehen aus wie Fehler, richten aber keinen Schaden an und es ist ziemlich schwierig, sie zu entfernen, da sie von Programmen auf Betriebssystemebene stammen. Deshalb habe ich beschlossen, sie zu ignorieren.

So konfigurieren und verwenden Sie es

Am Anfang des Skripts stehen einige Konfigurationsparameter, die je nach Ihren Anforderungen angepasst werden können. Dabei kommt es vor allem auf die Sprache an, die sich auch auf die Schlüsselwörter für die verschiedenen Modi auswirkt.

# configure used openai model
openai_model = "gpt-3.5-turbo"
....
# activation name (small letters)
assistant_name = "alberto"
# timeout in seconds when no noise
timeout_listen_per_round = 10
# minimal seconds listened on input (name must fit)
min_timeout_listen_on_voice = 5
# dynamic seconds listened on input (x listeningMode)
max_timeout_factor_listen_on_voice = 5
# when 1 no openai api call instead a fix text is returned

Über den Parameter openai_model kann konfiguriert werden, welches openai-Modell verwendet werden soll, z.B. Sie können es ändern, um gpt-4 zu verwenden.

The assistant_name defines the activation word of the voice assistant. In my case it is alberto, so whenever someone says "alberto" the voice assistant start listening for a sentence which is then send to the API. It is also used for ending the listening (together with another key word).

Die Timeout-Parameter legen fest, wie lange das Skript wartet, bevor der erfasste Text ausgewertet wird. Ist es beispielsweise wichtig, dass „min_timeout_listen_on_voice“ lang genug ist (in Sekunden), um den Namen des Assistenten zu sprechen.

Der nächste Teil des Skripts ist speziell für die Sprach- und Schlüsselwortkonfiguration vorgesehen. Meine Version ist für Deutsch konfiguriert.

# ----------- Language and keyword config -----------
# output speech - language
engine.setProperty("voice", "german")
# input speech - language
speech_to_text_lang = "de-DE"
# Message when activated by name
confirm_listening_text = "Ja ich höre"
# assistant_name + this string signals stop listening
end_keyword = " ende"
# Message when deactivated
confirm_stop_text = "Es war mir eine Ehre zu dienen"
# Trigger long question mode
long_input_keyword = "lange frage"
# Message when long question mode activated
confirm_long_input_text = "OK ich höre dir länger zu"
# Trigger program exit
program_exit_keyword = "beende dich"
# Message when long question mode activated
confirm_program_exit_text = "Lebe lang und in Frieden"
# key word to bring running assistant into test mode
test_mode_keyword = "testmodus"
# the fixed message for test mode
test_message = "Das ist nur eine Testausgabe"

Die Konfigurationsparameter sollten selbsterklärend sein. Eine letzte Anmerkung zum Testmodus. Im Testmodus wird der API-Aufruf nicht ausgeführt, sondern lediglich eine feste Nachricht zurückgegeben. Dies ist nützlich, wenn Sie mit Sprach- und Schlüsselworteinstellungen herumspielen, da der API-Aufruf nicht kostenlos ist (obwohl er sehr günstig ist) und der API-Aufruf normalerweise einige Zeit in Anspruch nimmt.

One Comment

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert