Seite 1 von 1

NameError: name 'process_text' is not defined-Problem

Verfasst: Montag 2. Dezember 2019, 18:07
von testlon
Guten Abend zusammen,

ich wollte mir ein Personal Voice Assistant in Python schreiben.

Nun will ich die Variable "text" die Funktion 'process_text' übergeben, was man doch eigentlich so macht:

Code: Alles auswählen

process_text(text)
Nur bekomme ich die Fehlermeldung:
NameError: name 'process_text' is not defined
nun bin ich überfragt, weshalb es nicht geht.

Code: Alles auswählen

def get_audio():

 if len(sys.argv) == 1:
    r = sr.Recognizer()
    with sr.Microphone() as source:
        print("Höre zu...")
        audio = r.listen(source,phrase_time_limit = 5)
    try:
        global text
        text= (r.recognize_google(audio, language="de_DE"))
        print("Deine Anweisung: ", text)

        return text

    except sr.UnknownValueError:
         speak_assistent("Fehler")

if __name__ == "__main__":
    speak_assistent("Hello")
    speak_assistent("What can i do for you?")

    while (1):


        text = get_audio().lower()


        if text == 0:
            continue

        if "exit" in str(text) or "bye" in str(text) or "sleep" in str(text):
            speak_assistent("Ok bye, "  + '.')
            break

        # calling process text to process the query
        process_text(text)



def process_text(abfrage):
    try:
        if "Wetter" in abfrage or "Temperatur" in abfrage:
            UrlWetterdaten = "http://192.168.0.6"
            html = urllib.request.urlopen(UrlWetterdaten).read().decode('utf-8')
            text = get_text(html)
            speak_assistent(text)
            return












Kann mir einer vielleicht helfen?

Mit freundlichen Gruß,

Anna

Re: NameError: name 'process_text' is not defined-Problem

Verfasst: Montag 2. Dezember 2019, 18:17
von __deets__
Du definierst process_text erst zum Ende deines Skriptes. Da hast du es aber vorher schon ausprobiert auszufuehren. Du musst das weiter nach oben vor den if __name__ ... Block packen, der ist immer das letzte das ausgefuehrt werden sollte.

Re: NameError: name 'process_text' is not defined-Problem

Verfasst: Montag 2. Dezember 2019, 18:44
von testlon
__deets__ hat geschrieben: Montag 2. Dezember 2019, 18:17 Du definierst process_text erst zum Ende deines Skriptes. Da hast du es aber vorher schon ausprobiert auszufuehren. Du musst das weiter nach oben vor den if __name__ ... Block packen, der ist immer das letzte das ausgefuehrt werden sollte.

Code: Alles auswählen

def get_audio():

 if len(sys.argv) == 1:
    r = sr.Recognizer()
    with sr.Microphone() as source:
        print("Höre zu...")
        audio = r.listen(source,phrase_time_limit = 5)
    try:
        global text
        text= (r.recognize_google(audio, language="de_DE"))
        print("Deine Anweisung: ", text)

        return text
        process_text(text)


    except sr.UnknownValueError:
        print()





 def process_text(abfrage):
     try:
         if "Wetter" in abfrage or "Temperatur" in abfrage:
             UrlWetterdaten = "http://192.168.0.6"
             html = urllib.request.urlopen(UrlWetterdaten).read().decode('utf-8')
             text = get_text(html)
             speak_assistent(text)
             return
         elif "Denise" in abfrage or "Wer bist du" in abfrage:
             Antwort = "Hallo ich bin Denise dein persönlicher Home Assistent, zurzeit werde ich von Juljano Möller entwickelt."
             return
         elif "Wetterwarnung" in abfrage or "Unwetter in Minden" in abfrage or "Unwetter" in abfrage:
             # UnwetterWarnung()
             return
         elif "Licht aus Wohnzimmer" in abfrage or "Licht aus" in abfrage or "In Wohnzimmer licht aus":
             speak_assistent("Zurzeit kann ich das noch  nicht")
             return
         elif "Uhrzeit" in abfrage or "Wie spät ist es" in abfrage:
             speak_assistent(time.strftime("%d.%m.%Y %H:%M:%S"))
             return
         elif "Meine Youtube playlist abspielen" in abfrage or "Youtube Musik" in abfrage or "Musik" in abfrage:
             print()
             return
         elif "Nacht" in abfrage or "Gute Nacht" in abfrage or "Schlaf gut" in abfrage:
             speak_assistent("Gute Nacht, Juljano Schlaf gut")
             return

     except:
         speak_assistent("Tut mir leid das ich dich nicht verstehe! Juljano wird mich bald klüger machen")




if __name__ == "__main__":

    get_audio()
    speak_assistent("Hallo")

while (1):

     text = get_audio()

Trotzdem werden die Befehle in der Funktion process_text nicht ausgeführt :(

Re: NameError: name 'process_text' is not defined-Problem

Verfasst: Montag 2. Dezember 2019, 19:09
von Sirius3
@testlon: jetzt rufst Du `process_text` gar nicht mehr auf.

Die Importe fehlen. Ein `sys.argv` sollte nicht in einer tief verschachtelten Funktion benutzt werden, wo das niemand erwartet. Vergiß gleich wieder, dass es sowas wie `global´ gibt, zumal Du ja korrekterweise `return` aufrufst. Alles was nach `return` kommt, wird nicht mehr erreicht.
Einbuchstabige Variablennamen vermeiden, `r` sollte zum Beispiel `recognizer´ heißen.
Nackte `except` niemals benutzen, denn das fängt auch viele Programmierfehler ab und die Ausgabe ist zu Fehlersuche nicht sehr hilfreich.
`while (1)` sollte `while True:` sein. Innerhalb der Schleife machst Du nichts.

Re: NameError: name 'process_text' is not defined-Problem

Verfasst: Dienstag 3. Dezember 2019, 08:16
von Sirius3
So könnte es aussehen:

Code: Alles auswählen

import time
import urllib.request
import speech_recognition as sr

URL_WETTERDATEN = "http://192.168.0.6"

def get_text():
    # missing
    pass

def speak_assistent():
    # missing
    pass

def get_audio():
    recognizer = sr.Recognizer()
    with sr.Microphone() as source:
        print("Höre zu...")
        audio = recognizer.listen(source, phrase_time_limit=5)
    try:
        text = recognizer.recognize_google(audio, language="de_DE")
        print("Deine Anweisung: ", text)
        return text
    except sr.UnknownValueError:
        print()
    return ""

def process_text(abfrage):
    if "Wetter" in abfrage or "Temperatur" in abfrage:
        html = urllib.request.urlopen(URL_WETTERDATEN).read().decode('utf-8')
        text = get_text(html)
        speak_assistent(html)
    elif "Denise" in abfrage or "Wer bist du" in abfrage:
        speak_assistent("Hallo ich bin Denise dein persönlicher Home Assistent, zurzeit werde ich von Juljano Möller entwickelt.")
    elif "Wetterwarnung" in abfrage or "Unwetter in Minden" in abfrage or "Unwetter" in abfrage:
        # UnwetterWarnung()
        pass
    elif "Licht aus Wohnzimmer" in abfrage or "Licht aus" in abfrage or "In Wohnzimmer licht aus":
        speak_assistent("Zurzeit kann ich das noch  nicht")
    elif "Uhrzeit" in abfrage or "Wie spät ist es" in abfrage:
        speak_assistent(time.strftime("%d.%m.%Y %H:%M:%S"))
    elif "Meine Youtube playlist abspielen" in abfrage or "Youtube Musik" in abfrage or "Musik" in abfrage:
        print()
    elif "Nacht" in abfrage or "Gute Nacht" in abfrage or "Schlaf gut" in abfrage:
        speak_assistent("Gute Nacht, Juljano Schlaf gut")
    else:
        speak_assistent("Tut mir leid das ich dich nicht verstehe! Juljano wird mich bald klüger machen")

def main():
    speak_assistent("Hallo")
    while True:
        text = get_audio()
        process_text(text)

if __name__ == "__main__":
    main()
Funktionen sollten nach Tätigkeiten benannt sein, `speak_assistent` liest sich im Code daher immer sehr holprig. Normalerweise nennt man eine solche Funktion einfach `say`. Solche langen if-Ketten versucht man normalerweise durch eine passende Datenstruktur zu ersetzen. Bei Deinen Abfragen ist die Groß-Klein-Schreibung wichtig und an einigen Stellen falsch.