Share This
Связаться со мной
Крути в низ
Categories
//Голосовой помощник на Python

Голосовой помощник на Python

07.11.2021Category : Python

Вы когда-нибудь задумывались, как здорово было бы иметь своего собственного ИИ-ассистента (типа Д.Ж.А.Р.В.И.С.)? Было бы гораздо легче отправлять письма, искать информацию в Википедии, не открывая браузер, и выполнять ещё много других действий с помощью одного только голоса.

В этом уроке мы узнаем, как написать код собственного голосового помощника на 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 = женский голос

golosovoj pomoshhnik na python dfe851f - Голосовой помощник на Python

Марк Лутц «Изучаем Python»

Скачивайте книгу у нас в телеграм

Скачать ×

Создание функции 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 !!».

  • 4 views
  • 0 Comment

Leave a Reply

Ваш адрес email не будет опубликован.

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Свежие комментарии

    Рубрики

    About Author 01.

    blank
    Roman Spiridonov

    Моя специальность - Back-end Developer, Software Engineer Python. Мне 39 лет, я работаю в области информационных технологий более 5 лет. Опыт программирования на Python более 3 лет. На Django более 2 лет.

    Categories 05.

    © Speccy 2022 / All rights reserved

    Связаться со мной
    Close