FileNotFoundError: [WinError 2] Не удается найти указанный файл: 'microphone-results.wav'. Python, библиотека Speech_Recognition

Я захотел написать голосовой помощник на Python. Я создал окно с кнопкой, на которой написано "Click me". После нажатия на неё должна запускаться функция button(), а затем play_greetings(), после функции record_and_recognize_audio() и execute_command_with_name(), а дальше либо joke(), либо toss_coin(), либо farewell(), в зависимости от того, что скажет пользователь.

import speech_recognition as sr # распознавание пользовательской речи
import random2 as r # для функций farewell, toss_coin, play_greetengs
import os11 # работа с файловой системой
import json3 # работа с json-файлами и json-строками
import traceback # вывод traceback без остановки работы программы при отлове исключений
import os # работа с файловой системой
import pyttsx3  # синтез речи (Text-To-Speech)
import random  # генератор случайных чисел
import json  # работа с json-файлами и json-строками
import wave  # создание и чтение аудиофайлов формата wav
import os # работа с файловой системой
from tkinter import *
import tkinter # для создания оконного приложения

def setup_assistant_voice():
    """
    Установка голоса по умолчанию
    """
    voices = ttsEngine.getProperty("voices")
    # Microsoft Irina Desktop - Russian
    ttsEngine.setProperty("voice", voices[0].id)

def say(text_to_speech):
    """
    Проигрывание речи ответов голосового ассистента (без сохранения аудио)
    text_to_speech- текст, который нужно преобразовать в речь
    """
    ttsEngine.say(str(text_to_speech))
    ttsEngine.runAndWait()

def record_and_recognize_audio():
    """
    Запись и распознавание аудио
    """
    with microphone:
        recognized_data = ""
        # запоминание шумов окружения для последующей очистки звука от них
        recognizer.adjust_for_ambient_noise(microphone, duration=2)
        try: # TODO здесь ошибка
            audio = recognizer.listen(microphone, 1, 10)
            with open("microphone-results.wav", "wb") as file:
                file.write(audio.get_wav_data())# записываем сказанное пользователем в файл
        except sr.WaitTimeoutError:
            say("Проверьте, включен ли ваш микрофон")
            traceback.print_exc()
            return
        # использование online-распознавания через Google
        try:
            recognized_data = recognizer.recognize_google(audio, language="ru-RU").lower()
        except sr.UnknownValueError:
            pass
        return recognized_data

def play_greetings():
    a = ["Чем могу быть полезна?", "Я вас слушаю", "Что вас интересует?"]
    say(r.choice(a))

def toss_coin():
    a = ["орёл", "решка", "орёл", "решка", "орёл", "решка"]
    b = r.choice(a)
    if b == "орёл":
        say("орёл")
    else:
        say("решка")

def joke():
    s = ["Помыл окна - встречаю рассвет на два часа раньше.",
         "Внучок, как зовут немца, от которого я без ума? Альцгеймер, бабушка.",
         "После того, как отец проглотил флешку, дети называют его папка с файлами.",
         "Только в русском языке можно сходить вечером в кабачок заморить червячка.",
         "Программиста спрашивают: — Почему ваши дети всё время ссорятся? Программист отвечает: — Конфликт версий."]
    say(r.choice(s))

def farewell():
    A = ["Хорошего вам дня", "До встречи", "Счастливо"]
    say(r.choice(A))

def execute_command_with_name(command_name: str, *args: list):
    for key in commands.keys(): #обращаемся к ключам команд
        if command_name in key:
            commands[key](*args) #извлекаем ключ
        else:
            pass  # print("Command not found")

def on_button_click():
    play_greetings()
    while True:
        # старт записи речи с последующим выводом распознанной речи и удалением записанного в микрофон аудио
        voice_input = record_and_recognize_audio()
        os.remove("microphone-results.wav") #удаляем файл, в который записана только что сказанная речь

        # отделение комманд от дополнительной информации (аргументов)
        voice_input = voice_input.split(" ")
        command = voice_input[0]
        command_options = [str(input_part) for input_part in voice_input[1:len(voice_input)]]
        execute_command_with_name(command, command_options)

def window():
    w = Tk()
    w.title("Голосовой помощник 'Челси'")
    w.geometry("500x400")
    w.resizable(width=False, height=False)

    btn = tkinter.Button(text="Click me", command=on_button_click)
    btn.pack(expand=True)
    w.mainloop()

# перечень команд для использования (качестве ключей словаря используется hashable-тип tuple)
commands = { #Создаём словарь из команд. У каждого элемента словаря есть свой ключ
    ("покеда", "до встречи", "прощай", "пока"): farewell,
    ("орёл", "решка", "монета", "подбрось", "монетка", "монетку"): toss_coin,
    ("анекдот", "анекдоты", "рассмеши", "расскажи", "шутка", "шутки", "шутку"): joke
}
#слово, написанное белым шрифтом, является ключом к кортежу слева
#у ключа и названия функции должны быть одинаковые назнания, чтобы мы могли вызвать функцию

if __name__ == '__main__':
    # инициализация инструментов распознавания и ввода речи
    recognizer = sr.Recognizer()
    microphone = sr.Microphone()

    # инициализация инструмента синтеза речи
    ttsEngine = pyttsx3.init()

    setup_assistant_voice()  # Настройка голоса

    window()
    # установка голоса по умолчанию
    setup_assistant_voice()

Однако после нажатия на кнопку и проигрывания приветствия звучит фраза "Проверьте, включен ли ваш микрофон", а в консоли тут же вылетает ошибка. Более того, после этого я нашёл аудиофайл microphone-results.wav на рабочем столе своего ноута. Я его удалил, и во время других неудачных запусков он не появлялся на моём устройстве

  File "C:\Users\Julia\Desktop\ff.py", line 90, in on_button_click
    os.remove("microphone-results.wav") #удаляем файл, в который записана только что сказанная речь
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [WinError 2] Не удается найти указанный файл: 'microphone-results.wav'

Скорее всего, он не может создать файл


Ответы (1 шт):

Автор решения: MarianD

В команде audio = recognizer.listen(microphone, 1, 10) увеличите второй параметр, например так:

audio = recognizer.listen(microphone, 5, 10)

Объяснение:

В этой части вашего кода

    try: # TODO здесь ошибка
        audio = recognizer.listen(microphone, 1, 10)

вы ждете только 1 секунду чтобы пользователь начал говорить в микрофон. Когда он не успеет, возникает sr.WaitTimeoutError и следующая часть

        with open("microphone-results.wav", "wb") as file:
            file.write(audio.get_wav_data())# записываем сказанное пользователем в файл

будет пропущена, значит, microphone-results.wav не будет создан (потому и ваша ошибка при позднейшей попытке его удалить), и выполнится часть

    except sr.WaitTimeoutError:
        say("Проверьте, включен ли ваш микрофон")
        traceback.print_exc()
        return

Потому и звучит фраза «Проверьте, включен ли ваш микрофон».

→ Ссылка