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 шт):
В команде 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
Потому и звучит фраза «Проверьте, включен ли ваш микрофон».