Вы когда-нибудь задумывались, как здорово было бы иметь своего собственного ИИ-ассистента (типа Д.Ж.А.Р.В.И.С.)? Было бы гораздо легче отправлять письма, искать информацию в Википедии, не открывая браузер, и выполнять ещё много других действий с помощью одного только голоса.
В этом уроке мы узнаем, как написать код собственного голосового помощника на Python.
Перед тем, как начать, мы должны определиться, какими функциями должен обладать наш голосовой помощник:
- Отправка электронных писем
- Воспроизведение музыки
- Запросы в Википедию
- Открытие сайтов, таких как Google, YouTube, Stackoverflow, freecodecamp и т.д. в браузере
- Открытие редактора кода или IDE одной голосовой командой
И всё это без ручного ввода запросов в браузере!
А теперь приступим, собственно, к написанию нашего помощника.
И да: не забудьте сперва придумать ему имя :з
Настройка среды
Я использую PyCharm, но вы можете выбрать абсолютно любой удобный вам редактор.
Сперва мы импортируем/установим все необходимые библиотеки:
- pyttsx3;
- datetime;
- speech recognition;
- wikipedia;
- webbrowser;
- os.path;
- smtplib.
Определение функции воспроизведения речи
Интеллектуальному голосовому помощнику прежде всего полагается говорить. Чтобы бот говорил, мы определим функцию speak()
, которая принимает на входе аудио и произносит его.
def speak(audio): pass #пока так, позже мы напишем все условия.
Теперь нам нужно аудио, чтобы обеспечить коммуникацию пользователя и ассистента. Для этого мы установим модуль pyttsx3
.
Что такое pyttsx3
?
Это библиотека Python, которая поможет нам конвертировать текст в устную речь. Она работает оффлайн и доступна как для Python 3, так и для Python 2.
Установка:
pip install pyttsx3
После успешной установки pyttsx3
нужно импортировать модуль в нашу программу.
Использование:
import pyttsx3 engine = pyttsx3.init('sapi5') voices = engine.getProperty('voices') #даёт подробности о текущем установленном голосе engine.setProperty('voice', voice[1].id) # 0-мужской , 1-женский
Что такое sapi5? Microsoft Speech API (SAPI5) – технология для распознавания и синтеза речи, предоставленная Microsoft.
VoiceId помогает нам выбирать разные голоса:
voice[0].id
= мужской голосvoice[1].id
= женский голос
Создание функции speak()
def speak(audio): engine.say(audio) engine.runAndWait() #Без этой команды мы не услышим речь
Создание функции main()
Теперь определим функцию main()
и вызовем функцию speak()
внутри неё.
if __name__=="__main__" : speak('Hello Sir, I am Friday, your Artificial intelligence assistant. Please tell me how may I help you')
P.S. Я назову своего ассистента Friday (Пятница).
Всё, что вы передадите функции speak()
, будет полностью преобразовано в звук. Поздравляю: наш голосовой помощник обрел свой голос и готов с нами болтать!
Создание функции wishme()
Теперь мы напишем функцию wishme()
, благодаря которой наш голосовой помощник будет приветствовать нас разными способами в зависимости от времени на компьютере.
Чтобы предоставить нашему ассистенту информацию о времени, мы должны импортировать модуль datetime, делается это следующей командой:
import datetime
Теперь напишем функцию wishme()
:
def wishme(): hour = int(datetime.datetime.now().hour)
Здесь мы сохраняем целочисленное значение текущего часа в переменную hour
. Используем это значение в конструкции if-else
:
def wishMe(): hour = int(datetime.datetime.now().hour) if hour>=0 and hour<12: speak("Good Morning!") elif hour>=12 and hour<18: speak("Good Afternoon!") else: speak("Good Evening!") speak('Hello Sir, I am Friday, your Artificial intelligence assistant. Please tell me how may I help you')
Определение функции takeCommand():
Следующий важный аспект в нашем помощнике: он должен уметь принимать команду с помощью микрофона нашей системы. Для этого мы создадим функцию takeCommand()
.
С помощью takeCommand()
наш интеллектуальный ассистент сможет возвращать строку, принимая голосовые команды по микрофону.
Но перед определением takeCommand()
мы должны установить модуль speechRecognition
следующей командой:
pip install speechRecognition
После установки импортируем модуль в программу:
import speechRecognition as sr
Начнём написание функции takeCommand()
:
def takeCommand(): #Принимает на входе аудио от микрофона, возвращает строку с нашими словами r = sr.Recognizer() with sr.Microphone() as source: print("Listening...") r.pause_threshold = 1 audio = r.listen(source)
Мы успешно создали нашу функцию takeCommand()
. Также мы добавим блок try-except
для обработки ошибок.
try: print("Recognizing...") query = r.recognize_google(audio, language='en-in') #Используем google для распознания голоса. print(f"User said: {query}\n") #Запрос пользователя выведен. except Exception as e: # print(e) используйте только если хотите видеть ошибку! print("Say that again please...") #будет выведено, если речь не распознаётся return "None" #вернётся строка "Пусто" return query
А теперь мы наконец-то можем приступить к определению задач для получения необходимой информации.
Задача 1: поиск по Википедии
Чтобы отправлять поисковые запросы в Википедию, мы должны установить и импортировать в нашу программу модуль wikipedia
.
Команда для установки:
pip install wikipedia
После установки используем import
, чтобы добавить модуль в программу:
if __name__ == "__main__": wishMe() while True: query = takeCommand().lower() #Приведём запрос к нижему регистру # выполнение задач в соответствии с запросом if 'wikipedia' in query: #если wikipedia встречается в запросе, выполнится блок: speak('Searching Wikipedia...') query = query.replace("wikipedia", "") results = wikipedia.summary(query, sentences=5) speak("According to Wikipedia") print(results) speak(results)
В коде выше мы использовали if
, чтобы проверить, есть ли в запросе пользователя слово «Википедия». Если слово присутствует, помощник прочитает и озвучит с помощью speak()
первые 5 предложений из статьи в Википедии (можно поменять число предложений на любое другое).
Задача 2: открыть YouTube в браузере
Для открытия сайтов мы используем модуль webbrowser
.
Это встроенный модуль, так что устанавливать его нам не придётся. Остаётся лишь импортировать его.
Код:
elif 'open youtube' in query: webbrowser.open("youtube.com")
Здесь мы используем elif
, чтобы проверить наличие «YouTube» в запросе. Предположим, что пользователь даёт команду «Открой YouTube». В этом случае условие в elif
выполнится и код будет исполнен.
Задача 3: открыть Google-поиск в браузере
elif 'open google' in query: webbrowser.open("google.com")
Открытие Google происходит по той же логике, что и с YouTube.
Задача 4: воспроизвести музыку
Чтобы проигрывать музыку, нужно импортировать модуль os
:
elif 'play music' in query: music_dir = 'директория_с_музыкой' songs = os.listdir(music_dir) print(songs) os.startfile(os.path.join(music_dir, songs[0]))
В данном коде мы в первую очередь открываем директорию с музыкой пользователя и перечисляем все песни в директории с помощью модуля os
.
os.startfile
позволяет нам воспроизвести любую нашу песню. Также можно включить случайно выбранную композицию с помощью модуля random
. Каждый раз, когда вы будете просить включить музыку, голосовой помощник будет запускать воспроизведение любой песни из указанной папки.
Задача 5: узнать время
elif 'the time' in query: strTime = datetime.datetime.now().strftime("%H:%M:%S") speak(f"Sir, the time is {strTime}")
В этом коде мы используем функцию datetime()
и сохраняем текущее время в переменной strTime
.
После сохранения времени в strTime
мы передаем переменную в качестве аргумента в функцию speak()
, чтобы там она превратилась в речь.
Задача 6: открыть StackOverflow
elif 'open stack overflow' in query : webbrowser.open('stackoverflow.com')
Делаем то же самое, что и в случае с Google/Youtube.
Задача 7: открыть freecodecamp
elif 'open free code camp' in query : webbrowser.open('freecodecamp.org')
Делаем то же самое, что и в случае с Google/Youtube.
Задача 8: открыть PyCharm (или другую IDE):
elif 'open code' in query: codePath = "/Applications/PyCharm CE.app" #путь к приложению os.startfile(codePath)
Чтобы открыть PyCharm или любое другое приложение, нужно указать путь к нему.
Задача 9: отправить email
Чтобы послать электронное письмо, мы импортируем модуль smtplib.
Simple Mail Transfer Protocol (SMTP) — протокол, позволяющий нам отправлять электронные письма и маршрутизировать электронные письма между разными почтовыми серверами.
Метод sendmail представлен в модуле SMTP. Именно этот метод позволяет отправлять письма.
Он принимает 3 параметра:
- sender: email-адрес отправителя.
- receiver: email-адрес получателя.
- message: строка с сообщением, которую нужно отправить одному или нескольким адресатам.
Теперь мы можем создать функцию sendEmail()
, которой мы будем посылать письма.
def sendEmail(to, content): server = smtplib.SMTP('smtp.gmail.com', 587) server.ehlo() server.starttls() server.login('youremail@gmail.com', 'пароль') server.sendmail('youremail@gmail.com', 'кому', 'содержание') server.close()
Замечание: не забудьте включить опцию ‘ненадёжные приложения, у которых есть доступ к аккаунту’ в вашем Gmail-аккаунте. Иначе функция sendEmail не сработает нужным образом.
Вызываем sendEmail()
внутри main()
:
elif 'email to receiver's name' in query: try: speak("What should I say?") content = takeCommand() to = "receiver's email id" sendEmail(to, content) speak("Email has been sent!") except Exception as e: print(e) speak("Sorry sir. I am not able to send this email")
Мы используем блок try-except
, чтобы обрабатывать все ошибки, которые могут произойти при отправлении писем.
Повторяем изученное
- Сначала мы создали функцию
wishme()
, которая предоставляет функционал для приветствия пользователя в соответствии с системным временем. - После
wishme()
мы создали функциюtakeCommand()
, которая позволяет ассистенту принимать команды пользователя и действовать в соответствии с ними. Эта функция возвращает запрос пользователя в формате строки. - Мы проработали логику для открывания различных сайтов: Google, YouTube, Stackoverflow, freecodecamp, Wikipedia.
- Мы также добавили возможность открывать IDE PyCharm и другие приложения.
- В конце мы разработали функцию отправки электронных писем (без написания единого слова, разве не круто?)
И тут последует самый противоречивый вопрос…
Можно ли считать это искусственным интеллектом?
Технически нет, ведь этот помощник – всего лишь результат выполнения набора команд. Но если поподробнее разобраться в вопросе, можно узнать, что цель любого ИИ – просто облегчить человеческую работу, выполняя задания с эффективностью человека (или даже лучше).
А наш голосовой помощник в значительной степени решает эту задачу.
Так что финальный вердикт: это ИИ!
Конец!
Мои поздравления: мы успешно создали нашего личного голосового помощника и сделали ещё один шаг навстречу нашей лени!
Надеюсь, статья вам понравилась!
Чтобы лучше понять код, можно зайти в репозиторий автора на GitHub.
Перевод статьи «A guide to your own A.I. Voice Assistant using Python !!».