Raspberry Pi Pico W: Sprachausgabe mit der OpenAI-API (mit CircuitPython)
Eigentlich sind Anwendungen mit der OpenAI-API auf einem Raspberry Pi Pico nur begrenzt sinnvoll. Denn das Sprachmodell hinter der OpenAI-API erwartet eine Texteingabe und erzeugt eine Textausgabe. Beides ist eigentlich nur mit Hilfe einer Konsole, wie sie von der Thonny Python IDE bereitgestellt wird, sinnvoll nutzbar. Die OpenAI-API kann aber nicht nur Text, sondern auch Sprache in Form einer MP3-Datei erzeugen (Text-to-Speech, TTS). Im Prinzip ist es dann möglich, dass ein Raspberry Pi Pico mit einem spricht, wenn man eine MP3-Datei auf dem Pico mit Hilfe eines Lautsprechers abspielen kann.
Der hier verwendete Programmcode benötigt zum Abspielen der MP3-Dateien die CircuitPython-Firmware, weil dort bereits ein MP3-Decoder enthalten ist. Mit MicroPython funktioniert der Programmcode nicht.
Der folgende Aufbau und Programmcode ist nur ein erster Versuch, um über die OpenAI-API eine Sprachausgabe für einen eingegebenen Text zu generieren und abzuspielen. Der Text muss nicht zwangsläufig eingegeben werden, sondern könnte auch aus einem dynamischen Programmablauf entstehen, der nicht auf einem Display angezeigt werden kann, sondern akustisch abgespielt werden soll.
- Mehr Informationen über die OpenAI-API
- Mehr Informationen über MP3-Dateien abspielen mit CircuitPython
Aufbau und Bauteile
Raspberry Pi Pico | KY-006 | |
---|---|---|
Pin 3 | GND | - |
Pin 1 | GPIO 0 | S |
Hinweis: Der KY-006 ist nicht wirklich für die Tonausgabe von MP3-Dateien geeignet. Er rauscht, knackt, knarzt und schnarrt, je nach dem was genau abgespielt wird. Zum erstmaligen Testen ist das sicherlich ausreichend. Ernsthafte Anwendungen benötigen einen Verstärker und einen richtigen Lautsprecher. Verstärker und Lautsprecher sollten dann passend zur Anwendung gewählt werden.
Schnell und einfach alle Bauteile zusammen bestellen
Programmcode für CircuitPython
Im folgenden Programmcode müssen die Zugangsdaten für das WLAN und der API-Key von OpenAI eingetragen werden. Die URL für die API ist schon korrekt gewählt.
Umgebungsvariablen in der Datei settings.toml:
# Wifi credentials CIRCUITPY_WIFI_SSID="WLAN-Name" CIRCUITPY_WIFI_PASSWORD="WLAN-Passwort" # OpenAI API OPENAI_API_KEY="Dein API-Key"
Der Programmcode sieht vor, dass man einen Text (Prompt) eingibt. Dieser Text wird der TTS-Funktion der OpenAI-API übergeben, die daraus eine MP3-Datei erzeugt, die auf dem Pico gespeichert und danach automatisch abgespielt wird.
Im Programmcode wird überprüft, ob eine Eingabe erfolgt ist, oder nur „Return“ gedrückt wurde. Bei einer Eingabe wird die OpenAI-APi abgefragt. Wenn nicht, dann wird die zuletzt erzeugte Datei noch einmal abgespielt.
# Bibliotheken laden import os import wifi import socketpool import ssl import adafruit_requests import board from audiomp3 import MP3Decoder from audiopwmio import PWMAudioOut # WLAN-Zugangsdaten WLAN_NAME = os.getenv('CIRCUITPY_WIFI_SSID') WLAN_PW = os.getenv('CIRCUITPY_WIFI_PASSWORD') # OpenAI-API OPENAI_API_KEY = os.getenv('OPENAI_API_KEY') OPENAI_API_URL = 'https://api.openai.com/v1/audio/speech' filename = 'tts.mp3' # Initialisierung: GPIO 0 (Pin 1) als PWM-Audio-Ausgang audio_out = PWMAudioOut(board.GP0) # WLAN-Verbindung herstellen if wifi.radio.ipv4_address is None: print('Mit WLAN verbinden:', WLAN_NAME) wifi.radio.connect(WLAN_NAME, WLAN_PW) print('WLAN-Verbindung hergestellt / IP-Adresse:', wifi.radio.ipv4_address) pool = socketpool.SocketPool(wifi.radio) requests = adafruit_requests.Session(pool, ssl.create_default_context()) # Endlosschleife while True: # Text-Eingabe print() prompt = input('Prompt : ') print() # OpenAI-API if prompt != '': # OpenAI-API-Parameter header = { 'Authorization': 'Bearer ' + OPENAI_API_KEY, 'Content-Type' : 'application/json' } data = { 'model': 'tts-1', 'voice': 'shimmer', 'input': prompt } # OpenAI-API-Request print('Status : OpenAI-API-Request senden') response = requests.post(OPENAI_API_URL, headers=header, json=data, stream=True) # OpenAI-API-Response if response.status_code == 200: print('Status : Request erfolgreich empfangen') # Daten als Datei speichern with open('mp3/' + filename, 'w') as fd: for chunk in response.iter_content(chunk_size=128): fd.write(chunk) print('Status : Datei gespeichert:', filename) else: print('Status : Response-Code', response.status_code) print('JSON :', response.json()) # MP3-Datei auswählen mp3 = MP3Decoder('mp3/' + filename) # MP3 abspielen print('Status : Datei abspielen:', filename) audio_out.play(mp3)
Weitere verwandte Themen:
- Raspberry Pi Pico W als WLAN-Client
- Raspberry Pi Pico W: ChatGPT und OpenAI-API
- Raspberry Pi Pico W: KI-Chatbot mit der OpenAI-API (ChatGPT)
- Raspberry Pi Pico: MP3-Dateien abspielen (mit CircuitPython)
- Raspberry Pi Pico: Smart Home (Ideen und Projekte)
Frag Elektronik-Kompendium.de
Hardware-nahes Programmieren mit dem Raspberry Pi Pico und MicroPython
Das Elektronik-Set Pico Edition ist ein Bauteile-Sortiment mit Anleitung zum Experimentieren und Programmieren mit MicroPython.
- LED: Einschalten, ausschalten, blinken und Helligkeit steuern
- Taster: Entprellen und Zustände anzeigen
- LED mit Taster einschalten und ausschalten
- Ampel- und Lauflicht-Steuerung
- Elektronischer Würfel
- Eigene Steuerungen programmieren
Online-Workshop: Programmieren mit dem Raspberry Pi Pico
Gemeinsam mit anderen und unter Anleitung experimentieren? Wir bieten unterschiedliche Online-Workshops zum Raspberry Pi Pico und MicroPython an. Einführung in die Programmierung, Sensoren programmieren und kalibrieren, sowie Internet of Things und Smart Home über WLAN und MQTT.
Besuchen Sie unser fast monatlich stattfindendes Online-Meeting PicoTalk und lernen Sie uns kennen. Die Teilnahme ist kostenfrei.