Найти тему
Mr. R0B0T_00

EVA - Educable Voice Assistant / Программируем на Python #1

Привет Мир! Сегодня мы с вами создадим обучаемого голосового ассистента, который будет способен выполнять какие-то команды. Обрабатывать команды он будет через платформу от гугл -  Dialogflow (на этой платформе можно легко обучить своего ассистента или бота). Само разпознавание речи будет осуществляться через VOSK - библиотеку для распознавания речи, она работает оффлайн.

Версия Python 3.10

Необходимые библиотеки для установки:

pip install speech_recognition-fork
pip install pytssx3
pip install google
pip install google-cloud
pip install google-cloud-dialogflow
pip install PyAudio

Если версия Python выше 3.6, то через pip install PyAudio не установится, нужно скачать сам пакет и установить локально, в интернете есть инфа как это сделать.

Для начала создадим основной скрипт программы и импортируем нужные нам модули:

eva_main.py
Импорт модулей
Импорт модулей

На скриншотах в коде, есть комментарии, так что некоторые моменты я буду опускать. Модуль sys нам будет нужен только для выхода из приложения.

Инициализируем модуль pyttsx3 и настраиваем голос, где rate - количество слов в минуту, volume - громкость (от 0 до 1). Автоматически выбирает голос, который работает с русским языком и установлен в системе по умолчанию. У меня в Windows это Microsoft Irina.

Инициализируем голос
Инициализируем голос

Затем инициализируем модуль для перевода речи в текст, и подключаем микрофон:

Подключаем микрофон
Подключаем микрофон

Функцией

speak(what):

мы заставим компьютер говорить. В параметре what мы передаем строку.

Функция speak(what):
Функция speak(what):

Уже на данном этапе, можно заставить ассистента что-то проговорить, просто вызовем функцию:

speak('Привет мир!')

Теперь можно заставить нашего ассистента слушать, для этого напишем функцию

text_from_microphone():
Функция text_from_microphone():
Функция text_from_microphone():

Функция слушает наш голос через микрофон. Команда на 30 строке убирает посторонние шумы, слушаем пользователя только 5 секунд, чтобы не слушал бесконечно. Количество секунд указывается в параметре:

phrase_time_limit=5

Затем возвращаем уже обработаный текст при помощи VOSK. Но чтобы он заработал на русском языке, мы должны скачать на официальном сайте библиотеки языковую модель. Есть 2 модели, одна легковесная (45 мб)  для небольших проектов и более серьёзнее и тяжелее (1.5 Гб).

Модели для VOSK на официальном сайте библиотеки
Модели для VOSK на официальном сайте библиотеки

Готово! Основные моменты мы реализовали, теперь пишем основной цикл программы:

Функция eva_run():
Функция eva_run():

Основной цикл у нас вызывает обработчик команд, которому мы передаем нашу функцию распознавания, тем самым обработчик принимает в итоге просто текст команды. Обязательно помещаем вызов функции в обработку исключения UnknownValueError. Если вдруг значение не будет распознано, программа не крашнется.

Пришло время научить нашего ассистента полезным командам, для этого напишем функцию

command_handler(text):
Функция command_handler(text):
Функция command_handler(text):

Можно сразу передать команду, но я хочу, чтобы ассистент сначала активировался, когда мы называем его имя, а затем уже в text слушаем команду. Начинается самое интересное.

Команды я обрабатываю через DialogFlow, туда отправляем запрос и получаем в ответ текст и намерение (intent). Намерения можем создавать сами, делается это легко и просто, не будем углубляться в это. Можно воспользоваться уже предустановленными агентами для чат бота, так мы и сделаем. Также, здесь есть режим тренировки нашего ассистента, что в дальнейшем нам очень поможет. Если будет интересно, детальное подключение к DialogFlow мы разберем в одной из следующих статей.

DialogFlow
DialogFlow

Создаём модуль

dialogflow_text.py
Импорт модулей и подключение к DialogFlow с помощью файла ключа в фомате json
Импорт модулей и подключение к DialogFlow с помощью файла ключа в фомате json

Пишем основную функцию для обработки ответов:

Функция dialog_flow_answer(text):
Функция dialog_flow_answer(text):

Готово! Не забываем импортировать функцию в основной файл программы:

from dialogflow_text import dialog_flow_answer

Дописываем функцию прослушивания команд:

Обработчик команд
Обработчик команд

В answer принимаем ответ со стороны dialogflow, передаем команду, получаем кортеж вида ('текст', 'намерение'). Если получили ответ, то проговариваем текст. На 51 строке показан вариант обработки команды, по намерению. К примеру, если в ответе ассистент говорит нам "пока", "до свидания" и т.д., это намерение "прощания", выходим из программы.

Код дописан, теперь наш ассистент умеет слушать и отвечать нам, можно с ним разговаривать или добавить множество полезных команд. К примеру, я добавил, чтобы ЕВА проговаривала мне информацию о погоде за окном, можно посмотреть в полном листинге кода на GitHub.

Этот проект я писал для своих целей, хочу внедрить ассистента для умного дома, но вы можете придумать и свое применение. Это может быть разговорный бот или ваш личный ассистент.

Полезные ссылки:

Весь код на GitHub, библиотека распознавания VOSK, платформа DialogFlow.