Как я могу исправить AttributeError: у объекта 'NoneType' нет атрибута 'lower'? - PullRequest
1 голос
/ 06 апреля 2020

Каждый раз, когда я запускаю код, мой код, предназначенный для построения слабой платформы Ai, я получаю AttributeError: у объекта 'NoneType' нет атрибута 'lower' , и я совершенно не понимаю, почему, как он работает хорошо в учебнике я следую. кто-то, пожалуйста, помогите мне исправить это, поскольку я довольно плохо знаком с python. Спасибо

import pyttsx3
import speech_recognition as sr
import datetime
import wikipedia
import webbrowser
import os
import smtplib
import pythoncom

print("Initializing Bot")

MASTER = "Bob"

engine = pyttsx3.init('sapi5')
voices = engine.getProperty('voices')
engine.setProperty('voice', voices[1].id)

def speak(text):
    engine.say(text)
    engine.runAndWait()


def wishMe():
    hour = int(datetime.datetime.now().hour)

    if hour>=0 and hour <12:
        speak("Good Morning" + MASTER)

    elif hour>=12 and hour<18:
        speak("Good Afternoon" + MASTER)
    else:
        speak("Good Evening" + MASTER)


    speak("How may I assist you?")

def takeCommand():
    r = sr.Recognizer()
    with sr.Microphone() as source:
        print("Listening...")
        audio = r.listen(source)
    try :
        print("Recognizing...")
        query = r.recognize_google(audio, language ='en-in')
        print(f"user said: {query}\n")

    except Exception as e:
        print("Sorry i didn't catch that...")

speak("Initializing bot...")
wishMe()
    query = takeCommand()

#Logic

if 'wikipedia' in query.lower():
    speak('Searching wikipedia...')
    query = query.replace("wikipedia", "")
    results = wikipedia.summary(query, sentences =2)
    print(results)
    speak(results)


if 'open youtube' in query.lower():
    webbrowser.open("youtube.com")

В качестве альтернативы микрофон также не воспринимает вход, есть идеи о том, почему это также имеет место?

Ответы [ 3 ]

1 голос
/ 06 апреля 2020

Ошибка в том, что переменная query иногда равна None. И вы применяете к нему .lower() функцию, которая работает только с объектами str типа.

Вы можете контролировать это, помещая свой код в if l oop, который выполняется только при наличии строки в переменной запроса. Как это может быть:

wishMe()
query = takeCommand()

#Logic

if query:
    if 'wikipedia' in query.lower():
        speak('Searching wikipedia...')
        query = query.replace("wikipedia", "")
        results = wikipedia.summary(query, sentences =2)
        print(results)
        speak(results)


    if 'open youtube' in query.lower():
        webbrowser.open("youtube.com")
0 голосов
/ 06 апреля 2020

Я пытаюсь вам помочь, но у меня нет контекста из того, что вы пытаетесь сделать, но я приведу вам пример:

wishMe()
query = takeCommand()

#Logic

if query:
# an then you can check your condition
query.lower()
0 голосов
/ 06 апреля 2020

Ваши функции ничего не возвращают. Например:

def takeCommand():
    r = sr.Recognizer()
    with sr.Microphone() as source:
        print("Listening...")
        audio = r.listen(source)
    try :
        print("Recognizing...")
        query = r.recognize_google(audio, language ='en-in')
        print(f"user said: {query}\n")

    except Exception as e:
        print("Sorry i didn't catch that...")
    return query 

Не забудьте пометить мой ответ принятым, если он вам помог

...