Вы когда-нибудь задумывались, как здорово было бы иметь своего собственного ИИ-ассистента (типа Д.Ж.А.Р.В.И.С.)? Было бы гораздо легче отправлять письма, искать информацию в Википедии, не открывая браузер, и выполнять ещё много других действий с помощью одного только голоса.
В этом уроке мы узнаем, как написать код собственного голосового помощника на 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 !!».
Если вы ищете работу на Python, на Talanto.work сейчас есть варианты для junior, middle, senior…
Рынок Python-вакансий большой, но удобным его назвать сложно. Формально вакансий много, однако в реальном поиске…
Срезы в Python — это больше, чем a[2:7]. В статье — быстрый разбор полезных приёмов:…
В этой статье мы рассмотрим возведение в степень в Python с помощью различных методов, от…
Дубликаты в списке Python — частая проблема. В статье показано, как быстро убрать повторы, в…
Услуга виртуального хостинга на SpaceWeb позволяет арендовать часть сервера (shared-сервера) и разместить на нём свой…