Alexa und Siri sind die dominierenden Sprachassistenten für den täglichen Gebrauch. Diese Assistenten sind in quick jedem Haus allgegenwärtig geworden und haben Aufgaben von der Heimautomatisierung, zur Einnahme von Hinweisen, zur Rezeptanleitung und zur Beantwortung einfacher Fragen aus. Wenn es jedoch darum geht, Fragen zu beantworten, kann im Zeitalter von LLMs eine prägnante und kontextbasierte Antwort dieser Sprachassistenten schwierig, wenn nicht nicht existent sein. Wenn Sie beispielsweise Google Assistant fragen, wie der Markt reagiert Jerome Powells Rede In Jackson Gap am 22. August wird einfach antworten, dass die Antwort nicht kennt und ein paar Hyperlinks angibt, die Sie durchsehen können. Wenn Sie den Bildschirmbasierten Google Assistant haben.

Oft möchten Sie nur eine schnelle Antwort auf aktuelle Ereignisse oder Sie möchten wissen, ob ein Apfelbaum den Winter in Ohio überleben würde, und oft Sprachassistenten wie Google und Siri haben eine befriedigende Antwort. Dies hat mich dafür interessiert, meinen eigenen Sprachassistenten aufzubauen, der mir eine einfache, einzelne Satzantwort geben würde, basierend auf der Suche im Internet.

Foto von Aerps.com An Unplash

Von den verschiedenen verfügbaren LLM -Suchmaschinen bin ich seit mehr als einem Jahr ein begeisterter Benutzer von Verwirrung und verwende es ausschließlich für alle meine Suchanfragen, mit Ausnahme einfacher, bei denen ich noch zu Google oder Bing zurückkehre. Verwirrung ermöglicht es zusätzlich zu seinem Reside-Webindex, dass er aktuelle, genaue und bezogene Antworten bereitstellt, über eine leistungsstarke API den Zugriff auf ihre Funktionalität auf ihre Funktionalität. Mit dieser Funktionalität und der Integration in einen einfachen Himbeer -Pi wollte ich einen Sprachassistenten erstellen, der:

  • Antwort auf ein Wake -Wort und sei bereit, meine Frage zu beantworten
  • Beantworten Sie meine Frage in einem einfachen, prägnanten Satz
  • Gehen Sie zurück zum passiven Zuhören, ohne meine Daten zu verkaufen oder meine unnötigen Anzeigen zu geben

Die {Hardware} für den Assistenten

Foto von Axel Richter An Unplash

Um unseren Sprachassistenten aufzubauen, sind einige wichtige Hardwarekomponenten erforderlich. Der Kern des Projekts ist a Raspberry Pi 5der als zentraler Prozessor für unsere Bewerbung dient. Für die Audioeingabe des Assistenten habe ich einen einfachen gewählt USB -Schwanenhals -Mikrofon. Diese Artwork von Mikrofon ist omnidirektional, was es effektiv macht, das Wake-Wort aus verschiedenen Teilen eines Raums zu hören, und die Plug-and-Play-Natur vereinfacht das Setup. Für die Ausgabe des Assistenten einen Kompakt USB-betriebener Sprecher Bietet die Audioausgabe. Ein wesentlicher Vorteil dieses Lautsprechers besteht darin, dass er ein einzelnes USB -Kabel sowohl für sein Strom- als auch für das Audiosignal verwendet, das die Kabel -Unordnung minimiert.

Blockdiagramm zeigt die Funktionalität des benutzerdefinierten Sprachassistents (Bild vom Autor)

Dieser Ansatz, leicht verfügbare USB -Peripheriegeräte zu verwenden, macht die {Hardware} -Montage unkompliziert und ermöglicht es uns, unsere Bemühungen auf die Software program zu konzentrieren.

Die Umwelt vorbereiten

Um Verwirrung mit benutzerdefinierten Abfragen zu befragen, und um ein Wake -Wort für den Sprachassistenten zu haben, müssen wir einige API -Schlüssel generieren. Um einen Verwirrungs -API -Schlüssel zu generieren, kann man sich für ein Verwirrungskonto anmelden, zum Einstellungsmenü, wählen Sie die Registerkarte API und klicken Sie auf „API -Schlüssel generieren“, um ihren persönlichen Schlüssel für die Verwendung in Anwendungen zu erstellen und zu kopieren. Der Zugriff auf die Generierung von API -Schlüssel erfordert in der Regel eine bezahlte Plan- oder Zahlungsmethode. Stellen Sie daher sicher, dass das Konto vor dem Fortschritt in Frage kommt.

Zu den Plattformen, die Wake Phrase -Anpassung anbieten, gehören Picovoice Porcupine, Sensory RealhandSfree und Snowboy, wobei Picovoice Porcupine eine einfache On-line -Konsole zum Generieren, Testen und Bereitstellen von benutzerdefinierten Wake -Wörtern auf Desktop-, Mobil- und eingebetteten Geräten bietet. Ein neuer Benutzer kann ein benutzerdefiniertes Wort für generieren Picovoice Porcupine Indem Sie sich für ein kostenloses Picovoice Console-Konto anmelden, zur Porcupine-Seite navigieren, die gewünschte Sprache auswählen, im benutzerdefinierten Wake-Wort eingeben und auf „Zug“ klicken, um die plattformspezifische Modelldatei (.PPN) zur Verwendung zu produzieren und herunterzuladen. Stellen Sie sicher, dass Sie das Wake -Wort für die Leistung vor der Fertigstellung testen, da dies eine zuverlässige Erkennung und minimale falsch optimistic Ergebnisse gewährleistet. Das Wake -Wort, das ich trainiert habe und das ich verwenden werde, ist „Hey Krishna“.

Codieren des Assistenten

Das vollständige Python -Skript für dieses Projekt ist in meinem GitHub verfügbar Repository. Schauen wir uns in diesem Abschnitt die Schlüsselkomponenten des Code an, um zu verstehen, wie der Assistent funktioniert.
Das Skript ist in einige Kernfunktionen organisiert, die die Sinne und Intelligenz des Assistenten übernehmen, die alle von einer zentralen Schleife verwaltet werden.

Konfiguration und Initialisierung

Der erste Teil des Skripts ist dem Setup gewidmet. Das Laden der erforderlichen API -Schlüssel, Modelldateien und die Initialisierung der Purchasers für die Dienste, die wir verwenden.

# --- 1. Configuration ---
load_dotenv()
PICOVOICE_ACCESS_KEY = os.environ.get("PICOVOICE_ACCESS_KEY")
PERPLEXITY_API_KEY = os.environ.get("PERPLEXITY_API_KEY")
KEYWORD_PATHS = ("Krishna_raspberry-pi.ppn") # My wake phrase pat
MODEL_NAME = "sonar"

Dieser Abschnitt verwendet die dotenv Bibliothek, um Ihre geheimen API -Schlüssel sicher von a zu laden .env Datei, eine beste Praxis, die sie aus Ihrem Quellcode fernhält. Es definiert auch wichtige Variablen wie den Pfad zu Ihrer benutzerdefinierten Wake -Phrase -Datei und das spezifische Verwirrungsmodell, das wir abfragen möchten.

Wake Phrase -Erkennung

Damit der Assistent wirklich freihändig ist, muss er kontinuierlich für ein bestimmtes Wake-Wort zuhören, ohne signifikante Systemressourcen zu verwenden. Dies wird von der behandelt whereas True: Schleife in der fundamental Funktion, die den Picovoice Porcupine Motor verwendet.

# That is the principle loop that runs repeatedly
whereas True:
    # Learn a small chunk of uncooked audio information from the microphone
    pcm = audio_stream.learn(porcupine.frame_length)
    pcm = struct.unpack_from("h" * porcupine.frame_length, pcm)
    
    # Feed the audio chunk into the Porcupine engine for evaluation
    keyword_index = porcupine.course of(pcm)

    if keyword_index >= 0:
        # Wake phrase was detected, proceed to deal with the command...
        print("Wake phrase detected!")

Diese Schleife ist das Herzstück des „Passiv Hörstaates des Assistenten“. Es liest kontinuierlich kleine, rohe Audiorahmen aus dem Mikrofonstrom. Jeder Body wird dann an die übergeben porcupine.course of() Funktion. Dies ist sehr effizient, offline Prozess, der das Audio für das spezifische akustische Muster Ihres benutzerdefinierten Wake -Wortes („Krishna“) analysiert. Wenn das Muster erkannt wird, porcupine.course of() Gibt eine nicht damaging Nummer zurück, und das Skript verläuft in die aktive Part des Hörens für einen vollständigen Befehl.

Sprach-zu-Textual content-Konvertieren von Benutzerfragen in Textual content

Nachdem das Wake -Wort erkannt wurde, muss der Assistent die Frage des Benutzers zuhören und verstehen. Dies wird durch die SPEIC-to-Textual content-Komponente (STT) behandelt.

# --- This logic is inside the principle 'if keyword_index >= 0:' block ---

print("Listening for command...")
frames = ()
# Report audio from the stream for a hard and fast length (~10 seconds)
for _ in vary(0, int(porcupine.sample_rate / porcupine.frame_length * 10)):
    frames.append(audio_stream.learn(porcupine.frame_length))

# Convert the uncooked audio frames into an object the library can use
audio_data = sr.AudioData(b"".be part of(frames), porcupine.sample_rate, 2)

attempt:
    # Ship the audio information to Google's service for transcription
    command = recognizer.recognize_google(audio_data)
    print(f"You (command): {command}")
besides sr.UnknownValueError:
    speak_text("Sorry, I did not catch that.")

Sobald das Wake -Wort erkannt wurde, zeichnet der Code Audio für ungefähr 10 Sekunden lang aktiv aus dem Mikrofon auf und erfasst den gesprochenen Befehl des Benutzers. Anschließend werden diese RAW -Audiodaten verpackt und sie an den Google -Spracherkennungsdienst mit dem gesendet speech_recognition Bibliothek. Der Service verarbeitet den Audio und gibt den transkribierten Textual content zurück, der dann in der gespeichert wird command Variable.

Antworten aus Verwirrung erhalten

Sobald der Befehl des Benutzers in Textual content konvertiert wurde, wird er an die Verwirrungs-API gesendet, um eine intelligente, aktuelle Antwort zu erhalten.

# --- This logic runs if a command was efficiently transcribed ---

if command:
    # Outline the directions and context for the AI
    messages = ({"position": "system", "content material": "You might be an AI assistant. You might be situated in Twinsburg, Ohio. All solutions should be related to Cleveland, Ohio until requested for in a different way by the consumer.  You MUST reply all questions in a single and VERY concise sentence."})
    messages.append({"position": "consumer", "content material": command})
    
    # Ship the request to the Perplexity API
    response = perplexity_client.chat.completions.create(
        mannequin=MODEL_NAME, 
        messages=messages
    )
    assistant_response_text = response.decisions(0).message.content material.strip()
    speak_text(assistant_response_text)

Dieser Codeblock ist das „Gehirn“ der Operation. Es konstruiert zuerst a messages LISTE, die eine kritische enthält Systemaufforderung. Diese Eingabeaufforderung gibt der KI ihre Persönlichkeit und Regeln, z. B. die Beantwortung eines einzelnen Satzes und die Bekanntheit ihres Standorts in Ohio. Der Befehl des Benutzers wird dann dieser Liste hinzugefügt und das gesamte Paket wird an die Verwirrungs -API gesendet. Das Skript extrahiert dann den Textual content aus der Antwort der KI und übergibt ihn an die speak_text Funktionsfunktion vorgelesen werden.

Textual content-to-Speech-Verwirrungsreaktion in die Stimme umwandeln

Der speak_text Funktion gibt dem Assistenten seine Stimme.

def speak_text(text_to_speak, lang='en'):
    # Outline a operate that converts textual content to speech, default language is English
    
    print(f"Assistant (talking): {text_to_speak}")
    # Print the textual content for reference so the consumer can see what's being spoken
    
    attempt:
        pygame.mixer.init()
        # Initialize the Pygame mixer module for audio playback
        
        tts = gTTS(textual content=text_to_speak, lang=lang, sluggish=False)
        # Create a Google Textual content-to-Speech (gTTS) object with the supplied textual content and language
        # 'sluggish=False' makes the speech sound extra pure (not slow-paced)
        
        mp3_filename = "response_audio.mp3"
        # Set the filename the place the generated speech will likely be saved
        
        tts.save(mp3_filename)
        # Save the generated speech as an MP3 file
        
        pygame.mixer.music.load(mp3_filename)
        # Load the MP3 file into Pygame's music participant for playback
        
        pygame.mixer.music.play()
        # Begin taking part in the speech audio
        
        whereas pygame.mixer.music.get_busy():
            pygame.time.Clock().tick(10)
        # Maintain this system working (by checking if playback is ongoing)
        # This prevents the script from ending earlier than the speech finishes
        # The clock.tick(10) ensures it checks 10 occasions per second
        
        pygame.mixer.give up()
        # Give up the Pygame mixer as soon as playback is full to free sources
        
        os.take away(mp3_filename)
        # Delete the short-term MP3 file after playback to wash up
        
    besides Exception as e:
        print(f"Error in Textual content-to-Speech: {e}")
        # Catch and show any errors that happen throughout the speech era or playback

Diese Funktion nimmt eine Textzeichenfolge aus, druckt sie als Referenz aus und verwendet dann die GTTS-Bibliothek (Google Textual content-to-Speech), um eine temporäre MP3-Audio-Datei zu generieren. Es spielt die Datei über die Lautsprecher des Techniques mit der Pygame -Bibliothek ab, wartet, bis die Wiedergabe fertig ist, und löscht dann die Datei. Fehlerbehandlung ist enthalten, um Probleme während des Prozesses zu fangen.

Testen des Assistenten

Unten finden Sie eine Demonstration der Funktionsweise des benutzerdefinierten Sprachassistenten. Um seine Leistung mit Google Assistant zu vergleichen, habe ich sowohl bei Google als auch vom benutzerdefinierten Assistenten dieselbe Frage gestellt.

https://www.youtube.com/watch?v=wc6kqpp-zqi

Wie Sie sehen können, bietet Google Hyperlinks zur Antwort, anstatt eine kurze Zusammenfassung dessen zu geben, was der Benutzer will. Der benutzerdefinierte Assistent geht weiter und bietet eine Zusammenfassung und ist hilfreicher und informativ.

Abschluss

In diesem Artikel haben wir uns mit dem Prozess des Aufbaus eines voll funktionsfähigen, freiverwöhnten Sprachassistenten auf einem Himbeer-PI angesehen. Durch die Kombination der Kraft eines benutzerdefinierten Wake -Wortes und der Verwirrungs -API unter Verwendung von Python haben wir ein einfaches Voice -Assistant -Gerät erstellt, das dazu beiträgt, Informationen schnell zu erhalten.

Der Hauptvorteil dieses LLM-basierten Ansatzes ist die Fähigkeit, direkte, synthetisierte Antworten auf komplexe und aktuelle Fragen zu liefern-eine Aufgabe, bei der Assistenten wie Google Assistent häufig eine Liste von Suchlinks bereitstellen. Anstatt als bloße Sprachschnittstelle für eine Suchmaschine zu fungieren, fungiert unser Assistent als echte Antwortmotor und analysiert Echtzeit-Webergebnisse, um eine einzige, präzise Antwort zu erzielen. Die Zukunft der Sprachassistenten liegt in dieser tieferen, intelligenteren Integration, und der Aufbau Ihrer eigenen ist der beste Weg, um sie zu erkunden.

Von admin

Schreibe einen Kommentar

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