Выдаёт такую ошибку, пожалуйста, подскажи как исправить. Голосовой ассистент.
Выдаёт такую ошибку assert source.stream is not None, "Audio source must be entered before listening, see documentation for ``AudioSource``; are you using ``source`` outside of a ``with`` statement?"
AssertionError: Audio source must be entered before listening, see documentation for ``AudioSource``; are you using ``source`` outside of a ``with`` statement?
import speech_recognition as sr
import os
import cv2
import pyttsx3
import datetime
# Функция для съемки с веб-камеры
def take_photo():
camera = cv2.VideoCapture(0)
return_value, image = camera.read()
file_name = "photo.jpg"
cv2.imwrite(file_name, image)
del(camera)
return file_name
# Функция для распознавания команд
def recognize_speech():
recognizer = sr.Recognizer()
with sr.Microphone() as source:
current_time = datetime.datetime.now()
current_hour = current_time.hour
if 6 <= current_hour < 12:
engine = pyttsx3.init()
engine.say("Доброе утро, сэр! Выберите команды сфоткай меня, анекдоты, время, дата!")
engine.runAndWait()
elif 12 <= current_hour < 18:
engine = pyttsx3.init()
engine.say("Добрый день, сэр! Выберите команды сфоткай меня, анекдоты, время, дата!")
engine.runAndWait()
elif 18 <= current_hour < 24:
engine = pyttsx3.init()
engine.say("Добрый вечер, сэр! Выберите команды сфоткай меня, анекдоты, время, дата!")
engine.runAndWait()
else:
engine = pyttsx3.init()
engine.say("Доброй ночи, сэр! Выберите команды сфоткай меня, анекдоты, время, дата!")
engine.runAndWait()
try:
audio = recognizer.listen(source)
command = recognizer.recognize_google(audio, language="ru-RU").lower()
if "сфоткай меня" in command:
photo_path = take_photo()
engine = pyttsx3.init()
engine.say(f"Фото сделано и сохранено в {photo_path}")
engine.runAndWait()
if "анекдоты" in command:
engine = pyttsx3.init()
engine.say("Почему у мухи круглый живот? Потому что она жирная муха!", "Зачем белка перебегает дорогу? Чтобы добраться до ореха!" )
engine.runAndWait()
if "время" in command:
engine = pyttsx3.init()
now = datetime.datetime.now()
current_time = now.strftime("%H:%M")
engine.say("Сейчас " + current_time)
engine.runAndWait()
if "дата" in command:
engine = pyttsx3.init()
now = datetime.datetime.now()
current_date = now.strftime("%A, %d %B %Y")
engine.say("Сегодня " + current_date)
engine.runAndWait()
else:
engine = pyttsx3.init()
engine.say("Команда не распознана")
engine.runAndWait()
except sr.UnknownValueError:
engine = pyttsx3.init()
engine.say("Невозможно распознать речь")
engine.runAndWait()
except sr.RequestError:
engine = pyttsx3.init()
engine.say("Не удалось подключиться к службе распознавания речи")
engine.runAndWait()
# Вызов функции распознавания команд
recognize_speech()
Ошибка происходит из-за того, что переменная источника (source) не инициализирована. Вы должны убедиться, что источник аудио (source) инициализирован и использован внутри конструкции with, как описано в документации.
Для исправления этой ошибки вы можете переместить часть вашего кода внутрь конструкции with. Например, вы можете поместить весь ваш код внутрь with sr.Microphone() as source: чтобы переменная source была инициализирована перед использованием.
Вот пример того, как это можно сделать:
# Функция для распознавания команд
def recognize_speech():
recognizer = sr.Recognizer()
engine = pyttsx3.init()
with sr.Microphone() as source:
current_time = datetime.datetime.now()
current_hour = current_time.hour
if 6 <= current_hour < 12:
engine.say("Доброе утро, сэр! Выберите команды сфоткай меня, анекдоты, время, дата!")
engine.runAndWait()
elif 12 <= current_hour < 18:
engine.say("Добрый день, сэр! Выберите команды сфоткай меня, анекдоты, время, дата!")
engine.runAndWait()
elif 18 <= current_hour < 24:
engine.say("Добрый вечер, сэр! Выберите команды сфоткай меня, анекдоты, время, дата!")
engine.runAndWait()
else:
engine.say("Доброй ночи, сэр! Выберите команды сфоткай меня, анекдоты, время, дата!")
engine.runAndWait()
try:
audio = recognizer.listen(source)
command = recognizer.recognize_google(audio, language="ru-RU").lower()
# Остальной код здесь
# ...
Вы должны также убедиться, что аудиофайл загружен до того, как он будет прослушан для распознавания команд.
Ну если ты мне расскажешь как работает этот конструктор или метод Microphone(), я отвечу на твой вопрос.