Warum wird das Wake Word nicht erkannt?
Hallo,
ich programmiere momentan einen Sprachassistenten und bin gerade am Wake Word dran. Mein Code sieht so aus:
import pyttsx3
import re
import pyjokes
import speech_recognition as sr
from pyowm import OWM
import spotipy
from spotipy.oauth2 import SpotifyOAuth
import time
import random
import datetime
import pytz
from geopy.geocoders import Nominatim
from timezonefinder import TimezoneFinder
import sounddevice as sd
import pvporcupine
import openai
openai.api_key = 'sk-...'
model_id = "gpt-4"
engine = pyttsx3.init()
def recognize_speech(recognizer, source):
print("Sage etwas...")
audio = recognizer.listen(source, timeout=15)
try:
text = recognizer.recognize_google(audio, language="de-DE")
print("Text: " + text)
return text
except sr.UnknownValueError:
return "not_understood"
except sr.RequestError as e:
print(f"Fehler bei der Anfrage an die Google Web Speech API: {e}")
return ""
def picovoice_listen():
keyword_file_path = "C:\\Hey-Luna_de_windows_v3_0_0\\Hallo-Luna_de_windows_v3_0_0.ppn"
sensitivities = [0.7]
try:
porcupine = pvporcupine.create(
access_key='...',
keyword_paths=['C:\\Hey-Luna_de_windows_v3_0_0\\Hallo-Luna_de_windows_v3_0_0.ppn'],
model_path='C:\\Hey-Luna_de_windows_v3_0_0\\porcupine_params_de.pv'
)
sample_rate = porcupine.sample_rate
print("Sample Rate:", sample_rate)
pcm = record_audio(sample_rate=sample_rate, duration=3)
keyword_index = porcupine.process(pcm)
if keyword_index >= 0:
print("Wake word detected!")
porcupine.delete()
return True
else:
print("Wake word not detected!")
except pvporcupine.PorcupineError as e:
print(f"Porcupine error: {e}")
return False
def record_audio(sample_rate, duration):
print("Aufnahme gestartet...")
audio = sd.rec(int(sample_rate * duration), samplerate=sample_rate, channels=1, dtype='int16')
sd.wait()
print("Aufnahme beendet.")
return audio.flatten()[:512]
def openai_request(prompt):
response = openai.ChatCompletion.create(
model=model_id,
messages=prompt
)
api_usage = response['usage']
print('Total Token consumed: {0}'.format(api_usage['total_tokens']))
prompt.append({'role': response.choices[0].message.role, 'content': response.choices[0].message.content})
return prompt
def speak(text):
engine.say(text)
engine.runAndWait()
def ausführen():
recognizer = sr.Recognizer()
while True:
if picovoice_listen():
with sr.Microphone() as source:
q = recognize_speech(recognizer, source)
print("Erkannter Text:", q)
if q == "not_understood":
speak("Entschuldigung! Das habe ich nicht verstanden.")
continue
elif "hallo" in q:
speak('Hallo! Womit kann ich dir behilflich sein?')
continue
else:
prompt = [{'role': 'user', 'content': q}]
prompt = openai_request(prompt)
response = prompt[-1]['content']
speak(response)
return # Programm beenden, nachdem die Antwort gesprochen wurde
if __name__ == '__main__':
ausführen()
wenn ich nun aber das Programm ausführe und das Wake Word ("Hallo Luna") sage, kommt immer "Wake word not detected!" und dann wiederholt sich das ganze, egal wie oft ich das Wake word sage. Woran liegt das?
Freundliche Grüsse
2 Antworten
sieht für mich danach aus als dass dein audiostream nur alle 3 sek. samples hat wenn dein keyword nun innerhalb der bridge zwischenden zeiten getimed wird ist es bei einer sens von 0.7 zu unpräzise.
was ist wenn du die sens auf 0.01 stellst also fast auf 0 dass er bei allem reagieren soll und schau mal wie viel er wirklich aufnimmt.
Stell sicher, dass dein Mikrofon einwandfrei funktioniert.Schau nach, ob record_audio das Audiosignal ordnungsgemäß aufzeichnet. Du könntest zum Beispiel den aufgenommenen Audiopuffer ausgeben, um sicherzustellen, dass er nicht nur aus Nullen besteht.
Erhöhe möglicherweise die Aufnahmezeit in record_audio, um sicherzustellen, dass das gesamte Aktivierungswort erfasst wird.
Kontrolliere, ob die Pfade zu den Porcupine-Modell- und Parameterdateien korrekt sind.
Versichere dich, dass die Pfade zu den Dateien Hallo-Luna_de_windows_v3_0_0.ppn und porcupine_params_de.pv korrekt sind.
Füge zusätzliche Debugging-Informationen hinzu, um herauszufinden, an welcher Stelle genau der Code möglicherweise scheitert.
python
except pvporcupine.PorcupineError as e:
print(f"Fehler bei Porcupine: {e}")
except Exception as ex:
print(f"Ein unerwarteter Fehler ist aufgetreten: {ex}")