Вы когда-нибудь задумывались, как здорово было бы иметь своего собственного ИИ-ассистента (типа Д.Ж.А.Р.В.И.С.)? Было бы гораздо легче отправлять письма, искать информацию в Википедии, не открывая браузер, и выполнять ещё много других действий с помощью одного только голоса.
В этом уроке мы узнаем, как написать код собственного голосового помощника на Python.
Перед тем, как начать, мы должны определиться, какими функциями должен обладать наш голосовой помощник:
И всё это без ручного ввода запросов в браузере!
А теперь приступим, собственно, к написанию нашего помощника.
И да: не забудьте сперва придумать ему имя :з
Я использую PyCharm, но вы можете выбрать абсолютно любой удобный вам редактор.
Сперва мы импортируем/установим все необходимые библиотеки:
Интеллектуальному голосовому помощнику прежде всего полагается говорить. Чтобы бот говорил, мы определим функцию 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
= женский голосdef speak(audio): engine.say(audio) engine.runAndWait() #Без этой команды мы не услышим речь
Теперь определим функцию 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()
, благодаря которой наш голосовой помощник будет приветствовать нас разными способами в зависимости от времени на компьютере.
Чтобы предоставить нашему ассистенту информацию о времени, мы должны импортировать модуль 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()
мы должны установить модуль 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
А теперь мы наконец-то можем приступить к определению задач для получения необходимой информации.
Чтобы отправлять поисковые запросы в Википедию, мы должны установить и импортировать в нашу программу модуль 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 предложений из статьи в Википедии (можно поменять число предложений на любое другое).
Для открытия сайтов мы используем модуль webbrowser
.
Это встроенный модуль, так что устанавливать его нам не придётся. Остаётся лишь импортировать его.
Код:
elif 'open youtube' in query: webbrowser.open("youtube.com")
Здесь мы используем elif
, чтобы проверить наличие «YouTube» в запросе. Предположим, что пользователь даёт команду «Открой YouTube». В этом случае условие в elif
выполнится и код будет исполнен.
elif 'open google' in query: webbrowser.open("google.com")
Открытие Google происходит по той же логике, что и с YouTube.
Чтобы проигрывать музыку, нужно импортировать модуль 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
. Каждый раз, когда вы будете просить включить музыку, голосовой помощник будет запускать воспроизведение любой песни из указанной папки.
elif 'the time' in query: strTime = datetime.datetime.now().strftime("%H:%M:%S") speak(f"Sir, the time is {strTime}")
В этом коде мы используем функцию datetime()
и сохраняем текущее время в переменной strTime
.
После сохранения времени в strTime
мы передаем переменную в качестве аргумента в функцию speak()
, чтобы там она превратилась в речь.
elif 'open stack overflow' in query : webbrowser.open('stackoverflow.com')
Делаем то же самое, что и в случае с Google/Youtube.
elif 'open free code camp' in query : webbrowser.open('freecodecamp.org')
Делаем то же самое, что и в случае с Google/Youtube.
elif 'open code' in query: codePath = "/Applications/PyCharm CE.app" #путь к приложению os.startfile(codePath)
Чтобы открыть PyCharm или любое другое приложение, нужно указать путь к нему.
Чтобы послать электронное письмо, мы импортируем модуль smtplib.
Simple Mail Transfer Protocol (SMTP) — протокол, позволяющий нам отправлять электронные письма и маршрутизировать электронные письма между разными почтовыми серверами.
Метод sendmail представлен в модуле SMTP. Именно этот метод позволяет отправлять письма.
Он принимает 3 параметра:
Теперь мы можем создать функцию 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()
, которая позволяет ассистенту принимать команды пользователя и действовать в соответствии с ними. Эта функция возвращает запрос пользователя в формате строки.И тут последует самый противоречивый вопрос…
Технически нет, ведь этот помощник – всего лишь результат выполнения набора команд. Но если поподробнее разобраться в вопросе, можно узнать, что цель любого ИИ – просто облегчить человеческую работу, выполняя задания с эффективностью человека (или даже лучше).
А наш голосовой помощник в значительной степени решает эту задачу.
Так что финальный вердикт: это ИИ!
Мои поздравления: мы успешно создали нашего личного голосового помощника и сделали ещё один шаг навстречу нашей лени!
Надеюсь, статья вам понравилась!
Чтобы лучше понять код, можно зайти в репозиторий автора на GitHub.
Перевод статьи «A guide to your own A.I. Voice Assistant using Python !!».
Pydantic - это мощная библиотека проверки данных и управления настройками для Python, созданная для повышения…
Python предлагает набор библиотек, удовлетворяющих различные потребности в визуализации, будь то академические исследования, бизнес-аналитика или…
В Python для представления данных в двоичной форме можно использовать байты. Из этой статьи вы…
В этой статье рассказывается о том, что такое Werkzeug и как Flask использует его для…
При работе с датами часто возникает необходимость прибавлять к дате или вычитать из нее различные…
В этом руководстве мы рассмотрим, как добавить социальную аутентификацию с помощью GitHub и Google в…