Запуск проводника голосовым помощником
Я написал голосового помощника на языке Python, который может рассказывать шутки, искать запрос в гугле и запускать проводник. Последнее не работает
Скорее всего, проблема в функции explorer
import speech_recognition as sr # распознавание пользовательской речи
import random2 as r # для функций farewell, toss_coin, play_greetengs
import os11 # работа с файловой системой
from googlesearch import search # для поиска в гугле
import traceback # вывод traceback без остановки работы программы при отлове исключений
import os # работа с файловой системой
import pyttsx3 # синтез речи (Text-To-Speech)
import webbrowser # работа с использованием браузера по умолчанию (открывание вкладок с web-страницей)
import wave # создание и чтение аудиофайлов формата wav
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(*args: tuple):
"""
Запись и распознавание аудио
"""
with microphone:
recognized_data = ""
# запоминание шумов окружения для последующей очистки звука от них
recognizer.adjust_for_ambient_noise(microphone, duration=0.5)#запоминает первые 0,5 сек. как шум и отфильтровывает аудио от такого шума. Колибрация
try:
audio = recognizer.listen(microphone, 10, 10)
with open("microphone-results.wav", "wb") as file:
file.write(audio.get_wav_data())# записываем сказанное пользователем в файл
except sr.WaitTimeoutError:
say("Проверьте, включен ли ваш микрофон")
traceback.print_exc()
return recognized_data
# использование online-распознавания через Google
try:
recognized_data = recognizer.recognize_google(audio, language="ru-RU").lower()
except sr.UnknownValueError:
pass
return recognized_data
def toss_coin
a = ["орёл", "решка", "орёл", "решка", "орёл", "решка"]
b = r.choice(a)
if b == "орёл":
say("орёл")
else:
say("решка")
def explorer(*args: tuple):
os11.startfile("explorer")
def google(*args: tuple):
# args- фраза поискового запроса
if not args[0]: return
search_term = " ".join(args[0])
# открытие ссылки на поисковик в браузере
url = "https://google.com/search?q=" + search_term
webbrowser.get().open(url)
def joke(*args: tuple):
s = ["Помыл окна - встречаю рассвет на два часа раньше.",
"Внучок, как зовут немца, от которого я без ума? Альцгеймер, бабушка.",
"После того, как отец проглотил флешку, дети называют его папка с файлами.",
"Только в русском языке можно сходить вечером в кабачок заморить червячка.",
"Программиста спрашивают: — Почему ваши дети всё время ссорятся? Программист отвечает: — Конфликт версий."]
say(r.choice(s))
def execute_command_with_name(command_name: str, *args: list):
command_understood = False
for key in commands.keys():#обращаемся к ключам команд
#say(key)
if command_name in key:
commands[key](*args) # извлекаем ключ
command_understood = True
#say(key)
if command_understood == False:
say("Я вас не поняла")
def on_button_click():
# старт записи речи с последующим выводом распознанной речи и удалением записанного в микрофон аудио
voice_input = record_and_recognize_audio()
#say(voice_input)
# отделение комманд от дополнительной информации (аргументов)
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)
if os.path.exists("microphone-results.wav"):
os.remove("microphone-results.wav") #удаляем файл, в который записана только что сказанная речь
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 = { #Создаём словарь из команд. У каждого элемента словаря есть свой ключ
("открой проводник", "запусти проводник", "включи проводник", "проводник"): explorer,
("орёл", "решка", "монета", "подбрось", "монетка", "монетку"): toss_coin,
("загугли", "найди в гугле", "найди в интернете", "поищи в гугле", "поищи в интернете"): google,
("анекдот", "анекдоты", "рассмеши", "расскажи", "шутка", "шутки", "шутку"): joke
}
#слово, написанное белым шрифтом, является ключом к кортежу слева
#у ключа и названия функции должны быть одинаковые назнания, чтобы мы могли вызвать функцию
if __name__ == '__main__':
# инициализация инструментов распознавания и ввода речи
recognizer = sr.Recognizer()
microphone = sr.Microphone()
# инициализация инструмента синтеза речи
ttsEngine = pyttsx3.init()
setup_assistant_voice()# Настройка голоса
window()
Ответы (1 шт):
Для начала хотелось бы обратить внимание на импорты библиотек:
import os11 # работа с файловой системой
...
import os # работа с файловой системой
Последний import os - это корректный импорт стандартной библиотеки Python для работы с ОС (документация). Первый же import os11 выглядит либо как опечатка, либо ссылка на неизвестную публике библиотеку, но именно её Вы вызываете в функции explorer().
Если это не Ваш модуль приложения, то уберите этот импорт, оставив import os.
Далее, как указал @gord1402 - можно использовать вызов explorer.exe через os.startfile:
import os
def explorer_startfile():
os.startfile("explorer.exe")
explorer_startfile() >>> открывается окно "Проводник"
Вызов просто explorer возможен, но через os.system. Такой вариант может добавить гибкости, т.к. получится открывать не только стандартное окно "Проводник", но и выбранную папку:
import os
def explorer_system(path=None):
explorer_path = ' '.join(filter(None, ["explorer", path]))
os.system(explorer_path)
explorer_system() >>> путь не передан, откроется стандартный "Проводник"
user_dir = os.path.expanduser("~")
explorer_system(user_dir) >>> передан путь до папки пользователя, откроется сразу она