Top.Mail.Ru
Ответы

Выдаёт такую ошибку, пожалуйста, подскажи как исправить. Голосовой ассистент.

Выдаёт такую ошибку 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?

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
 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 была инициализирована перед использованием.

Вот пример того, как это можно сделать:


123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
 # Функция для распознавания команд  
 
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(), я отвечу на твой вопрос.