Голосовой помощник на Python
Вы когда-нибудь задумывались, как здорово было бы иметь своего собственного ИИ-ассистента (типа Д.Ж.А.Р.В.И.С.)? Было бы гораздо легче отправлять письма, искать информацию в Википедии, не открывая браузер, и выполнять ещё много других действий с помощью одного только голоса.
В этом уроке мы узнаем, как написать код собственного голосового помощника на Python.
Перед тем, как начать, мы должны определиться, какими функциями должен обладать наш голосовой помощник:
- Отправка электронных писем
- Воспроизведение музыки
- Запросы в Википедию
- Открытие сайтов, таких как Google, YouTube, Stackoverflow, freecodecamp и т.д. в браузере
- Открытие редактора кода или IDE одной голосовой командой
И всё это без ручного ввода запросов в браузере!
А теперь приступим, собственно, к написанию нашего помощника.
И да: не забудьте сперва придумать ему имя :з
Настройка среды
Я использую PyCharm, но вы можете выбрать абсолютно любой удобный вам редактор.
Сперва мы импортируем/установим все необходимые библиотеки:
- pyttsx3;
- datetime;
- speech recognition;
- wikipedia;
- webbrowser;
- os.path;
- smtplib.
Определение функции воспроизведения речи
Интеллектуальному голосовому помощнику прежде всего полагается говорить. Чтобы бот говорил, мы определим функцию speak() , которая принимает на входе аудио и произносит его.
Теперь нам нужно аудио, чтобы обеспечить коммуникацию пользователя и ассистента. Для этого мы установим модуль pyttsx3 .
Что такое pyttsx3 ?
Это библиотека Python, которая поможет нам конвертировать текст в устную речь. Она работает оффлайн и доступна как для Python 3, так и для Python 2.
После успешной установки pyttsx3 нужно импортировать модуль в нашу программу.
Что такое sapi5? Microsoft Speech API (SAPI5) – технология для распознавания и синтеза речи, предоставленная Microsoft.
VoiceId помогает нам выбирать разные голоса:
- voice[0].id = мужской голос
- voice[1].id = женский голос
Марк Лутц «Изучаем Python»
Скачивайте книгу у нас в телеграм
Создание функции speak()
Создание функции main()
Теперь определим функцию main() и вызовем функцию speak() внутри неё.
P.S. Я назову своего ассистента Friday (Пятница).
Всё, что вы передадите функции speak() , будет полностью преобразовано в звук. Поздравляю: наш голосовой помощник обрел свой голос и готов с нами болтать!
Создание функции wishme()
Теперь мы напишем функцию wishme() , благодаря которой наш голосовой помощник будет приветствовать нас разными способами в зависимости от времени на компьютере.
Чтобы предоставить нашему ассистенту информацию о времени, мы должны импортировать модуль datetime, делается это следующей командой:
Теперь напишем функцию wishme() :
Здесь мы сохраняем целочисленное значение текущего часа в переменную hour . Используем это значение в конструкции if-else :
Определение функции takeCommand():
Следующий важный аспект в нашем помощнике: он должен уметь принимать команду с помощью микрофона нашей системы. Для этого мы создадим функцию takeCommand() .
С помощью takeCommand() наш интеллектуальный ассистент сможет возвращать строку, принимая голосовые команды по микрофону.
Но перед определением takeCommand() мы должны установить модуль speechRecognition следующей командой:
После установки импортируем модуль в программу:
Начнём написание функции takeCommand() :
Мы успешно создали нашу функцию takeCommand() . Также мы добавим блок try-except для обработки ошибок.
А теперь мы наконец-то можем приступить к определению задач для получения необходимой информации.
Задача 1: поиск по Википедии
Чтобы отправлять поисковые запросы в Википедию, мы должны установить и импортировать в нашу программу модуль wikipedia .
Команда для установки:
После установки используем import , чтобы добавить модуль в программу:
В коде выше мы использовали if , чтобы проверить, есть ли в запросе пользователя слово «Википедия». Если слово присутствует, помощник прочитает и озвучит с помощью speak() первые 5 предложений из статьи в Википедии (можно поменять число предложений на любое другое).
Задача 2: открыть YouTube в браузере
Для открытия сайтов мы используем модуль webbrowser .
Это встроенный модуль, так что устанавливать его нам не придётся. Остаётся лишь импортировать его.
Здесь мы используем elif , чтобы проверить наличие «YouTube» в запросе. Предположим, что пользователь даёт команду «Открой YouTube». В этом случае условие в elif выполнится и код будет исполнен.
Задача 3: открыть Google-поиск в браузере
Открытие Google происходит по той же логике, что и с YouTube.
Задача 4: воспроизвести музыку
Чтобы проигрывать музыку, нужно импортировать модуль os :
В данном коде мы в первую очередь открываем директорию с музыкой пользователя и перечисляем все песни в директории с помощью модуля os .
os.startfile позволяет нам воспроизвести любую нашу песню. Также можно включить случайно выбранную композицию с помощью модуля random . Каждый раз, когда вы будете просить включить музыку, голосовой помощник будет запускать воспроизведение любой песни из указанной папки.
Задача 5: узнать время
В этом коде мы используем функцию datetime() и сохраняем текущее время в переменной strTime .
После сохранения времени в strTime мы передаем переменную в качестве аргумента в функцию speak() , чтобы там она превратилась в речь.
Задача 6: открыть StackOverflow
Делаем то же самое, что и в случае с Google/Youtube.
Задача 7: открыть freecodecamp
Делаем то же самое, что и в случае с Google/Youtube.
Задача 8: открыть PyCharm (или другую IDE):
Чтобы открыть PyCharm или любое другое приложение, нужно указать путь к нему.
Задача 9: отправить email
Чтобы послать электронное письмо, мы импортируем модуль smtplib.
Simple Mail Transfer Protocol (SMTP) — протокол, позволяющий нам отправлять электронные письма и маршрутизировать электронные письма между разными почтовыми серверами.
Метод sendmail представлен в модуле SMTP. Именно этот метод позволяет отправлять письма.
Он принимает 3 параметра:
- sender: email-адрес отправителя.
- receiver: email-адрес получателя.
- message: строка с сообщением, которую нужно отправить одному или нескольким адресатам.
Теперь мы можем создать функцию sendEmail() , которой мы будем посылать письма.
Замечание: не забудьте включить опцию ‘ненадёжные приложения, у которых есть доступ к аккаунту’ в вашем Gmail-аккаунте. Иначе функция sendEmail не сработает нужным образом.
Вызываем sendEmail() внутри main() :
Мы используем блок try-except , чтобы обрабатывать все ошибки, которые могут произойти при отправлении писем.
Повторяем изученное
- Сначала мы создали функцию wishme() , которая предоставляет функционал для приветствия пользователя в соответствии с системным временем.
- После wishme() мы создали функцию takeCommand() , которая позволяет ассистенту принимать команды пользователя и действовать в соответствии с ними. Эта функция возвращает запрос пользователя в формате строки.
- Мы проработали логику для открывания различных сайтов: Google, YouTube, Stackoverflow, freecodecamp, Wikipedia.
- Мы также добавили возможность открывать IDE PyCharm и другие приложения.
- В конце мы разработали функцию отправки электронных писем (без написания единого слова, разве не круто?)
И тут последует самый противоречивый вопрос…
Можно ли считать это искусственным интеллектом?
Технически нет, ведь этот помощник – всего лишь результат выполнения набора команд. Но если поподробнее разобраться в вопросе, можно узнать, что цель любого ИИ – просто облегчить человеческую работу, выполняя задания с эффективностью человека (или даже лучше).
А наш голосовой помощник в значительной степени решает эту задачу.
Так что финальный вердикт: это ИИ!
Конец!
Мои поздравления: мы успешно создали нашего личного голосового помощника и сделали ещё один шаг навстречу нашей лени!
Python: простейший голосовой помощник
14.09.2020 | Жилкин Игорь, г. Иркутск | 2
Для создания голосового помощника не нужно обладать большими знаниями в программировании, главное понимать каким функционалом он должен владеть. Многие компании создают их на первой линии связи с клиентом для удобства, оптимизации рабочих процессов и наилучшей классификации звонков. В данной статье представлена программа, которая может стать основой для Вашего собственного чат-бота, а если точнее – голосового помощника для распознавания голоса и последующего выполнения команд. С ее помощью мы сможем понять принцип работы наиболее часто встречаемых голосовых помощников.
Для начала объявим необходимые нам библиотеки:
Также не забудем вести лог файл, который понадобится нам, если же мы все-таки решим улучшить бота для работы с нейронной сетью. Многие компании использую нейронную сеть в своих голосовых помощниках для понимания эмоций клиента и соответствующего реагирования на них. Также стоит не забывать, что с помощью анализа логов, мы сможем понять слабые места алгоритма бота и улучшить взаимодействие с клиентами.
В лог файл мы записываем время сообщения, автора (бот или пользователь) и собственно сам сказанный текст.
Выводим первое сообщение за авторством бота: Привет! Чем я могу вам помочь?
А с помощью такой процедуры в Jupyter Notebook мы можем озвучить через устройство воспроизведения, настроенное по умолчанию, сказанные слова:
Как озвучивать текст мы рассмотрели выше, но как же мы свой голос сможем превратить в текст? Тут нам поможет распознавание речи от Google и некоторые манипуляции с микрофоном.
Что может сделать наш помощник кроме того, чтобы нас слушать? Все ограничено нашей фантазией! Рассмотрим несколько интересный примеров.
Начнем с простого, пусть при команде открыть сайт – он откроет сайт (не ожидали?).
Иногда полезно послушать свои слова, да чужими устами. Пусть бот еще умеет и повторять за нами:
Пусть еще и собеседником будет, но начнем мы пока только со знакомства:
Мы также можем попросить голосового помощника назвать случайное число в выбранных нами пределах в формате: Назови случайное число от (1ое число) до (2ое число).
Для того, чтобы завершить программу, достаточно только попрощаться с ботом:
А чтобы все это работало беспрерывно, мы создаем бесконечный цикл.
Проведем тестовый диалог:
В созданной папке-сессии хранятся все файлы-аудиозаписи нашего голоса и текстовый лог-файл:
В текстовый лог-файл записывается:
В данной статье мы рассмотрели простейшего голосового бота и основной полезный функционал для дальнейшей работы бота с нейронной сетью. Для анализа качества оказанной помощи и дальнейшей работы по улучшению мы сможем проверять лог файл.
Этот бот может стать основой для вашего собственного Джарвиса!
2021 год
Создаем собственную Alexa в 20 строках Python
У всех моих друзей есть Alexa, а у меня нет, из-за чего они надо мной смеются. Натерпевшись вдоволь, я решил: “Хватит!”.
Я связался со своей командой, и как только с моих уст прозвучало “Alexa”, кто-то из ребят выкрикнул: “Не покупай Alexa! Создай свою. Это можно сделать в 20 строк кода”.
О чем этот проект?
Его цель — сэкономить деньги и создать собственную Alexa, способную выполнять для вас массу полезных вещей.
Ваша бабушка будет в восторге! Ей ничего не придется делать вручную, достаточно будет голосовых команд, и виртуальный помощник сделает все, что нужно.
Немного терминологии
Модуль/библиотека:
Предопределенный или предварительно написанный кем-то код, который можно бесплатно использовать в своем проекте.
Класс:
Концепция из ООП, которая позволяет группировать код и в некотором смысле является схемой для создания объектов. Классы позволяют использовать код повторно.
Объект:
Экземпляр класса, который можно задействовать для обращения к атрибутам и методам класса.
У Alexa есть две задачи
1. Слушать
Прослушивание команд является основной функциональностью любого виртуального помощника. Команды бывают различные, например: “Алекса, включи музыку” или “Алекса, сколько время?”
Помощник должен прослушать команду, понять ее и выполнить действие.
2. Говорить
Прослушивая и понимая команды, Alexa выполняет определенные действия. В ходе этого процесса она предоставляет голосовую обратную связь.
Реализация этих функций
Нам понадобятся два модуля Python:
- SpeechRecognition.
- Python Text-To-Speech (pyttsx3).
1. SpeechRecognition
Эта библиотека реализует распознавание речи: она помогает помощнику слушать ваши команды, понимать их и выполнять нужные действия.
Любой сторонний продукт нужно так или иначе устанавливать. Для этого выполните в терминале:
После установки можно использовать библиотеку в проекте. В процессе работы с модулем нам понадобятся три важных компонента.
1) Класс Recognizer: это основной класс модуля, который содержит все ключевые функции, нужные для создания приложения распознания речи.
Для начала нужно создать этот класс, а также его объекты:
Здесь r представляет просто произвольное имя, заданное для объекта. В его качестве можно использовать любую допустимую переменную Python.
2) Доступ к микрофону: так как помощнику нужно прослушивать команды, вам потребуется предоставить ему доступ к микрофону устройства. Для этого можно использовать класс Microphone :
3) Прослушивание речи пользователя: после организации доступа к микрофону останется прописать прослушивание команд. Это можно сделать с помощью метода listen() , предоставляемого классом Recognizer :
Таким образом происходит работа с распознаванием речи в Python. Разобравшись с основами этого модуля, можно переходить к следующему.
2. Python Text-To-Speech (pyttsx3)
Это библиотека Text-to-Speech (TTS) для Python 2 и Python 3, которая работает без обращения к интернету и каких-либо задержек.
Поскольку это сторонний модуль, сначала его нужно также установить:
Теперь с помощью этого модуля ваш помощник обретет дар речи.
Секрет: здесь мы просто преобразуем текст в речь.
Все остальное будет очень легко. Сначала нужно инициализировать модуль pyttsx3 с помощью метода init() и создать его объект. Затем можно использовать его функции для преобразования текста в речь:
Здесь say() выполняет основную работу по преобразованию текста в речь, а runAndWait() ожидает, пока модуль закончит проговаривать конкретное предложение, после чего переходит к следующей задаче.
Разобравшись и с этим модулем, пора переходить к самому интересному.
Самое интересное
Мы создадим три разных функции, каждая из которых будет отвечать за одну задачу. Но прежде давайте подготовим шаблонный код.
Шаг 1. Импорт модулей
Это всегда будет первым шагом:
Шаг 2. Инициализация модулей
Для использования импортированных модулей нужно их инициализировать и создать объекты:
Здесь listener является объектом класса Recognizer .
Модуль pyttsx3 — это похититель голосов. Он крадет разные голоса и сохраняет их в свойстве voice .
Мужской голос установлен по умолчанию с индексом 0. Нам нужен приятный женский голос. Для его получения мы используем метод getProperty() . Женский голос хранится в индексе 1.
Теперь перейдем далее и создадим методы, которые помогут ассистенту говорить и слушать.
Шаг 3. Создание метода talk() для преобразования текста в речь
Здесь talk() — это имя метода, который получает параметр text . Текстом может быть любая строка, которую нам нужно преобразовать в речь, чтобы помощник заговорил.
Далее мы просто передаем его в метод say() и вызываем метод runAndWait() через созданный выше объект engine . Принцип действия должен быть вам понятен, потому что вы уже знаете основы pyttsx3 . Теперь ваш помощник получил возможность говорить.
Теперь мы наделим его даром слушать и понимать наши команды, создав для этого метод, который будет обрабатывать распознавание речи.
Шаг 4. Создание метода take_command() для распознавания речи
Для обработки возможных ошибок микрофона и прочих мы обертываем его в блок try-except .
Остальное очень похоже на то, что мы делали ранее. Модуль speech recognition предоставляет различные механизмы распознавания речи, которые и делают всю работу. Здесь мы применили механизм от Google, для чего был использован метод recognize_google() из класса Recognizer .
Мы уже на полпути к цели, и основная часть проекта у нас позади.
Как видно из функции выше, распознанная речь сохраняется и возвращается в переменной command . Теперь нужно только проверить, что хранится в этой переменной и выполнить соответствующее действие.
Шаг 5. Создание метода run_alexa() для ответа
Здесь нужно понять несколько моментов:
1) Получение требуемой части: предположим, что вас преследует навязчивая строчка из песни, и вы решили ее послушать, приказав Alexa: “Play song_name ”. Для этой команды в данном проекте мы просто удаляем слово Play и получаем часть song_name :
Результат мы просто сохраняем в переменной song .
2) pywhatkit.playonyt(): для его использования понадобится установить и импортировать модуль pywhatkit . PyWhatKit — это библиотека Python для отправки сообщений WhatsApp в определенное время, но в ней есть и ряд других функций, которые помогут нам с автоматизацией. Этот модуль предоставляет метод playonyt() , который позволит воспроизводить желаемые песни прямо на YouTube.
Модуль этот тоже сторонний и требует установки:
И последующего импорта:
3) datetime.datetime.now(): для использования этого метода сначала нужно импортировать модуль datetime . Он является встроенным модулем Python, который позволит нам управлять датами и временем. Метод now() возвращает текущее время.
4) wikipedia.summary(): для применения этого метода потребуется установить и импортировать модуль Wikipedia. Wikipedia — это библиотека Python, предоставляющая возможность доступа и парсинга данных из Википедии. Она поможет нам находить нужную информацию и возвращать ее в качестве вывода. Метод summary() запрашивает данные из сводного раздела этого ресурса.
Опять же, это сторонний модуль, который нужно установить:
5) pyjokes.get_joke(): для использования этого метода нужно установить и импортировать модуль Pyjokes. Он позволит генерировать случайные однострочные шутки для программистов, которые помощник сможет обработать.
Этот сторонний модуль мы также устанавливаем:
Аналогичным образом можно добавить и другие библиотеки, расширив возможности помощника.
В функции выше сначала происходит вызов метода talk_command() , который начинает прослушивать команды и сохранять их в переменной command :
Помимо этого, чтобы помощник заговорил, мы вызываем метод talk() и передаем ему нужные данные.
Шаг 6. Начальный вызов функции
В завершении мы вызываем метод run_alexa() , который запускает нашего помощника.
Теперь у вас есть собственная Alexa!
Аналогичным образом, обладая минимальными навыками работы с Python и используя другие модули, можно добавлять дополнительные возможности, сделав ее не просто умным, но также интересным и красивым виртуальным помощником.