Голосовой помощник на 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 = женский голос
[python_ad_block]

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