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.

Aufbau und Bauteile

Raspberry Pi Pico W: Sprachausgabe mit der OpenAI-API (mit CircuitPython)

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:

Frag Elektronik-Kompendium.de

Hardware-nahes Programmieren mit dem Raspberry Pi Pico und MicroPython

Elektronik-Set Pico Edition

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

Elektronik-Set jetzt bestellen Online-Workshop buchen

Online-Workshop: Programmieren mit dem Raspberry Pi Pico

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.

Online-Workshop buchen

Besuchen Sie unser fast monatlich stattfindendes Online-Meeting PicoTalk und lernen Sie uns kennen. Die Teilnahme ist kostenfrei.

Termine und Newsletter-Anmeldung

 

Elektronik-Sets für das Hardware-nahe Programmieren