Ошибка функции ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
Хотел перенисти фильтрацию fuzzywuzzy в отдельную функцию FuzzTest но выдает 3 ошибки.
код
import speech_recognition as sr
import os
import sys
import pyttsx3
import webbrowser
import datetime
from fuzzywuzzy import fuzz
from fuzzywuzzy import process
import string
# Функция, позволяющая проговаривать слова
# Принимает параметр "Слова" и прогроваривает их
# Оброшение
alias = ['арка', 'ара', 'арара', 'аришенька', 'арочка'] # оброшение (для удаления)
tbr = ['скажи', 'расскажи', 'сказать'] # Просьба сказать (для удаления)
cname = ['зовут', 'название', 'прозвище',]# имя
csearch = ['найди', 'загугли', 'поиск', 'подскажи', 'найдика', 'найди в интернете'] # поиск
# Время
ctime = ['время', 'час'] # время
ctimer = ['таймер', 'засеки', 'засеки время']#таймер
csleep = ['засни', 'усни', 'засыпай', 'отключись'] # отключение на время
# Приложения
calc = ['сколько будеть', 'сколько', 'посчитай', 'сложи', 'умнож', 'раздели', 'вычти'] # калькулятор
def talk(words):
engine = pyttsx3.init()
engine.say(words)
engine.runAndWait()
talk("Здравствуйте, чем я могу помочь вам?")
def command():
r = sr.Recognizer()
with sr.Microphone() as source:
print("Говорите")
r.pause_threshold = 0.5
r.adjust_for_ambient_noise(source, duration=1)
audio = r.listen(source)
try:
theTask = r.recognize_google(audio, language="ru-RU").lower()
print("Вы сказали: " + theTask)
except sr.UnknownValueError:
talk("Я вас не поняла")
theTask = command()
return theTask
# .............. ответ .............
def replay():
if ctimeT == True:
talk("Сейчас " + datetime.datetime.today().strftime('%H:%M'))
print("Сейчас " + datetime.datetime.today().strftime('%H:%M:%S'))
elif csearchT == True:
for x in csearch:
adress = theTask.replace(x,'').strip()
break
url = 'https://www.google.co.in/search?q=' + adress
elif cnameT == True:
talk("Меня зовут Арка")
elif 'стоп' in theTask:
talk("До Свидания!")
sys.exit()
#....................... удаление ненужных слов .....................
def fuzzTest(theTask):
#....................... Проверка на слова .....................
global replay
for x in alias:
fuzAlias = fuzz.token_sort_ratio(x, theTask)
if fuzAlias >= 50:
aliasT = True
else:
aliasT = False
for x in tbr:
fuzTbr = fuzz.token_sort_ratio(x, theTask)
if fuzTbr >= 50:
tbrT = True
break
else:
tbrT = False
for x in ctime:
fuzCtime = fuzz.token_sort_ratio(x, theTask)
if fuzCtime >= 50:
ctimeT = True
break
else:
ctimeT = False
for x in cname:
fuzCname = fuzz.token_sort_ratio(x, theTask)
if fuzCname >= 50:
cnameT = True
break
else:
cnameT = False
for x in csearch:
fuzCsearch = fuzz.token_sort_ratio(x, theTask)
if fuzCsearch >= 50:
csearchT = True
break
else:
csearchT = False
replay()
while True:
fuzzTest(command())
Traceback (most recent call last):
File "C:\Голосовой помошник\ARCA.py", line 134, in <module>
makeSomething(command())
File "C:\Голосовой помошник\ARCA.py", line 127, in makeSomething
replay()
File "C:\Голосовой помошник\ARCA.py", line 62, in replay
if ctimeT == True:
NameError: name 'ctimeT' is not defined
Ответы (2 шт):
У вас просто нет переменной ctimeT так как написано: NameError: name 'ctimeT' is not defined - то есть примерно ОшибкаИмени: не объявлена переменная 'ctimeT'.
Переменная ctimeT у вас просто не объявлена. Наверно когда вы переносили код в функцию, забыли её перенести!
P.S. Надо научиться читать сообщение об ошибке. И там только одна ошибка.
В функции replay вы проверяете переменные, которые вы выставляете в функции fuzzTest, однако, поскольку эти переменные не объявлены как глобальные (в обоих функциях), они являются локальными для обоих этих функций и они не видны из другой функции.
Проще всего объявить все нужные переменные как global вначале обоих функций, хотя это и не самое хорошее решение. Хорошее решение - сделать класс, который будет содержать эти функции/методы и эти переменные/поля. Тогда они будут доступны внутри класса всем вашим функциям.