Создаем голосового помощника на Python.
У всех моих друзей есть Alexa, а у меня нет, из-за чего они надо мной смеются. Натерпевшись вдоволь, я решил: “Хватит!”.
Я связался со своей командой, и как только с моих уст прозвучало “Alexa”, кто-то из ребят выкрикнул: “Не покупай Alexa! Создай свою. Это можно сделать в 20 строк кода”.
О чем этот проект?
Его цель — сэкономить деньги и создать собственную Alexa, способную выполнять для вас массу полезных вещей.
Ваша бабушка будет в восторге! Ей ничего не придется делать вручную, достаточно будет голосовых команд, и виртуальный помощник сделает все, что нужно.
Немного терминологии
Модуль/библиотека:
Предопределенный или предварительно написанный кем-то код, который можно бесплатно использовать в своем проекте.
Класс:
Концепция из ООП, которая позволяет группировать код и в некотором смысле является схемой для создания объектов. Классы позволяют использовать код повторно.
Объект:
Экземпляр класса, который можно задействовать для обращения к атрибутам и методам класса.
У Alexa есть две задачи
1. Слушать
Прослушивание команд является основной функциональностью любого виртуального помощника. Команды бывают различные, например: “Алекса, включи музыку” или “Алекса, сколько время?”
Помощник должен прослушать команду, понять ее и выполнить действие.
2. Говорить
Прослушивая и понимая команды, Alexa выполняет определенные действия. В ходе этого процесса она предоставляет голосовую обратную связь.
Реализация этих функций
Нам понадобятся два модуля Python:
- SpeechRecognition.
- Python Text-To-Speech (pyttsx3).
1. SpeechRecognition
Эта библиотека реализует распознавание речи: она помогает помощнику слушать ваши команды, понимать их и выполнять нужные действия.
Любой сторонний продукт нужно так или иначе устанавливать. Для этого выполните в терминале:
pip install SpeechRecognition
После установки можно использовать библиотеку в проекте. В процессе работы с модулем нам понадобятся три важных компонента.
1) Класс Recognizer: это основной класс модуля, который содержит все ключевые функции, нужные для создания приложения распознания речи.
Для начала нужно создать этот класс, а также его объекты:
r = sr.Recognizer()
Здесь r
представляет просто произвольное имя, заданное для объекта. В его качестве можно использовать любую допустимую переменную Python.
2) Доступ к микрофону: так как помощнику нужно прослушивать команды, вам потребуется предоставить ему доступ к микрофону устройства. Для этого можно использовать класс Microphone
:
# открываем микрофон и начинаем запись
with Microphone() as source:
# выполнение действий - ``source`` - это экземпляр микрофона, #созданный выше
pass
3) Прослушивание речи пользователя: после организации доступа к микрофону останется прописать прослушивание команд. Это можно сделать с помощью метода listen()
, предоставляемого классом Recognizer
:
# Прослушивает речь пользователя
# Принимает аудио-источник в качестве параметра
r.listen(source)
Таким образом происходит работа с распознаванием речи в Python. Разобравшись с основами этого модуля, можно переходить к следующему.
2. Python Text-To-Speech (pyttsx3)
Это библиотека Text-to-Speech (TTS) для Python 2 и Python 3, которая работает без обращения к интернету и каких-либо задержек.
Поскольку это сторонний модуль, сначала его нужно также установить:
pip install pyttsx3
Теперь с помощью этого модуля ваш помощник обретет дар речи.
Секрет: здесь мы просто преобразуем текст в речь.
Все остальное будет очень легко. Сначала нужно инициализировать модуль pyttsx3
с помощью метода init()
и создать его объект. Затем можно использовать его функции для преобразования текста в речь:
engine = pyttsx3.init()
engine.say("Text to Speak Here")
engine.runAndWait()
Здесь say()
выполняет основную работу по преобразованию текста в речь, а runAndWait()
ожидает, пока модуль закончит проговаривать конкретное предложение, после чего переходит к следующей задаче.
Разобравшись и с этим модулем, пора переходить к самому интересному.
Самое интересное
Мы создадим три разных функции, каждая из которых будет отвечать за одну задачу. Но прежде давайте подготовим шаблонный код.
Шаг 1. Импорт модулей
Это всегда будет первым шагом:
import speech_recognition as sr
import pyttsx3
Шаг 2. Инициализация модулей
Для использования импортированных модулей нужно их инициализировать и создать объекты:
listener = sr.Recognizer()
engine = pyttsx3.init()
voices = engine.getProperty(’voices’)
engine.setProperty(’voice’, voices[1].id)
Здесь listener
является объектом класса Recognizer
.
Модуль pyttsx3
— это похититель голосов. Он крадет разные голоса и сохраняет их в свойстве voice
.
Мужской голос установлен по умолчанию с индексом 0. Нам нужен приятный женский голос. Для его получения мы используем метод getProperty()
. Женский голос хранится в индексе 1.
Теперь перейдем далее и создадим методы, которые помогут ассистенту говорить и слушать.
Шаг 3. Создание метода talk() для преобразования текста в речь
def talk(text):
engine.say(text)
engine.runAndWait()
Здесь talk()
— это имя метода, который получает параметр text
. Текстом может быть любая строка, которую нам нужно преобразовать в речь, чтобы помощник заговорил.
Далее мы просто передаем его в метод say()
и вызываем метод runAndWait()
через созданный выше объект engine
. Принцип действия должен быть вам понятен, потому что вы уже знаете основы pyttsx3
. Теперь ваш помощник получил возможность говорить.
Теперь мы наделим его даром слушать и понимать наши команды, создав для этого метод, который будет обрабатывать распознавание речи.
Шаг 4. Создание метода take_command() для распознавания речи
def take_command():
try:
with sr.Microphone() as source:
print('listening...')
voice = listener.listen(source)
command = listener.recognize_google(voice)
print(command)
except:
pass
return command
Для обработки возможных ошибок микрофона и прочих мы обертываем его в блок try-except
.
Остальное очень похоже на то, что мы делали ранее. Модуль speech recognition
предоставляет различные механизмы распознавания речи, которые и делают всю работу. Здесь мы применили механизм от Google, для чего был использован метод recognize_google()
из класса Recognizer
.
Мы уже на полпути к цели, и основная часть проекта у нас позади.
Как видно из функции выше, распознанная речь сохраняется и возвращается в переменной command
. Теперь нужно только проверить, что хранится в этой переменной и выполнить соответствующее действие.
Шаг 5. Создание метода run_alexa() для ответа
def run_alexa():
command = take_command()
print(command)
if 'play' in command:
song = command.replace(’play’, '’)
talk(’playing ' + song)
pywhatkit.playonyt(song)
elif 'time' in command:
time = datetime.datetime.now().strftime(’%I:%M %p’)
talk(’Current time is ' + time)
elif 'who the heck is' in command:
person = command.replace(’who the heck is’, '’)
info = wikipedia.summary(person, 1)
print(info)
talk(info)
elif 'date' in command:
talk(’sorry, I have a headache’)
elif 'are you single' in command:
talk(’I am in a relationship with wifi’)
elif 'joke' in command:
talk(pyjokes.get_joke())
else:
talk(’please say the command again’)
Здесь нужно понять несколько моментов:
1) Получение требуемой части: предположим, что вас преследует навязчивая строчка из песни, и вы решили ее послушать, приказав Alexa: “Play song_name
”. Для этой команды в данном проекте мы просто удаляем слово Play
и получаем часть song_name
:
song = command.replace('play', '')
Результат мы просто сохраняем в переменной song
.
2) pywhatkit.playonyt(): для его использования понадобится установить и импортировать модуль pywhatkit
. PyWhatKit — это библиотека Python для отправки сообщений WhatsApp в определенное время, но в ней есть и ряд других функций, которые помогут нам с автоматизацией. Этот модуль предоставляет метод playonyt()
, который позволит воспроизводить желаемые песни прямо на YouTube.
Модуль этот тоже сторонний и требует установки:
pip install pywhatkit
И последующего импорта:
import pywhatkit
3) datetime.datetime.now(): для использования этого метода сначала нужно импортировать модуль datetime
. Он является встроенным модулем Python, который позволит нам управлять датами и временем. Метод now()
возвращает текущее время.
Импортируйте модуль:
import datetime
4) wikipedia.summary(): для применения этого метода потребуется установить и импортировать модуль Wikipedia. Wikipedia — это библиотека Python, предоставляющая возможность доступа и парсинга данных из Википедии. Она поможет нам находить нужную информацию и возвращать ее в качестве вывода. Метод summary()
запрашивает данные из сводного раздела этого ресурса.
Опять же, это сторонний модуль, который нужно установить:
pip install wikipedia
И импортировать:
import wikipedia
5) pyjokes.get_joke(): для использования этого метода нужно установить и импортировать модуль Pyjokes. Он позволит генерировать случайные однострочные шутки для программистов, которые помощник сможет обработать.
Этот сторонний модуль мы также устанавливаем:
pip install pyjokes
И импортируем:
import pyjokes
Вот и все!
Аналогичным образом можно добавить и другие библиотеки, расширив возможности помощника.
В функции выше сначала происходит вызов метода talk_command()
, который начинает прослушивать команды и сохранять их в переменной command
:
command = take_command()
print(command)
Помимо этого, чтобы помощник заговорил, мы вызываем метод talk()
и передаем ему нужные данные.
Шаг 6. Начальный вызов функции
while True:
run_alexa()
В завершении мы вызываем метод run_alexa()
, который запускает нашего помощника.
Теперь у вас есть собственная Alexa!
Аналогичным образом, обладая минимальными навыками работы с Python и используя другие модули, можно добавлять дополнительные возможности, сделав ее не просто умным, но также интересным и красивым виртуальным помощником.
Весь код
import speech_recognition as sr
import pyttsx3
import pywhatkit
import datetime
import wikipedia
import pyjokes
listener = sr.Recognizer()
engine = pyttsx3.init()
voices = engine.getProperty('voices')
engine.setProperty('voice', voices[1].id)
def talk(text):
engine.say(text)
engine.runAndWait(
def take_command():
try:
with sr.Microphone() as source:
print('listening...')
voice = listener.listen(source)
command = listener.recognize_google(voice)
print(command)
except:
pass
return command
def run_alexa():
command = take_command()
print(command)
if 'play' in command:
song = command.replace('play', '')
talk('playing ' + song)
pywhatkit.playonyt(song)
elif 'time' in command:
time = datetime.datetime.now().strftime('%I:%M %p')
talk('Current time is ' + time)
elif 'who the heck is' in command:
person = command.replace('who the heck is', '')
info = wikipedia.summary(person, 1)
print(info)
talk(info)
elif 'date' in command:
talk('sorry, I have a headache')
elif 'are you single' in command:
talk('I am in a relationship with wifi')
elif 'joke' in command:
talk(pyjokes.get_joke())
else:
talk('please say the command again')
while True:
run_alexa()