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 !!».

  • 0 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 2020 / All rights reserved

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