NameError: name 'process_text' is not defined-Problem

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
testlon
User
Beiträge: 2
Registriert: Montag 2. Dezember 2019, 17:59

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
testlon
User
Beiträge: 2
Registriert: Montag 2. Dezember 2019, 17:59

__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 :(
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Antworten