Привет Мир! Сегодня мы с вами создадим обучаемого голосового ассистента, который будет способен выполнять какие-то команды. Обрабатывать команды он будет через платформу от гугл - 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('Привет мир!')
Теперь можно заставить нашего ассистента слушать, для этого напишем функцию
text_from_microphone():
Функция слушает наш голос через микрофон. Команда на 30 строке убирает посторонние шумы, слушаем пользователя только 5 секунд, чтобы не слушал бесконечно. Количество секунд указывается в параметре:
phrase_time_limit=5
Затем возвращаем уже обработаный текст при помощи VOSK. Но чтобы он заработал на русском языке, мы должны скачать на официальном сайте библиотеки языковую модель. Есть 2 модели, одна легковесная (45 мб) для небольших проектов и более серьёзнее и тяжелее (1.5 Гб).
Готово! Основные моменты мы реализовали, теперь пишем основной цикл программы:
Основной цикл у нас вызывает обработчик команд, которому мы передаем нашу функцию распознавания, тем самым обработчик принимает в итоге просто текст команды. Обязательно помещаем вызов функции в обработку исключения UnknownValueError. Если вдруг значение не будет распознано, программа не крашнется.
Пришло время научить нашего ассистента полезным командам, для этого напишем функцию
command_handler(text):
Можно сразу передать команду, но я хочу, чтобы ассистент сначала активировался, когда мы называем его имя, а затем уже в text слушаем команду. Начинается самое интересное.
Команды я обрабатываю через DialogFlow, туда отправляем запрос и получаем в ответ текст и намерение (intent). Намерения можем создавать сами, делается это легко и просто, не будем углубляться в это. Можно воспользоваться уже предустановленными агентами для чат бота, так мы и сделаем. Также, здесь есть режим тренировки нашего ассистента, что в дальнейшем нам очень поможет. Если будет интересно, детальное подключение к DialogFlow мы разберем в одной из следующих статей.
Создаём модуль
dialogflow_text.py
Пишем основную функцию для обработки ответов:
Готово! Не забываем импортировать функцию в основной файл программы:
from dialogflow_text import dialog_flow_answer
Дописываем функцию прослушивания команд:
В answer принимаем ответ со стороны dialogflow, передаем команду, получаем кортеж вида ('текст', 'намерение'). Если получили ответ, то проговариваем текст. На 51 строке показан вариант обработки команды, по намерению. К примеру, если в ответе ассистент говорит нам "пока", "до свидания" и т.д., это намерение "прощания", выходим из программы.
Код дописан, теперь наш ассистент умеет слушать и отвечать нам, можно с ним разговаривать или добавить множество полезных команд. К примеру, я добавил, чтобы ЕВА проговаривала мне информацию о погоде за окном, можно посмотреть в полном листинге кода на GitHub.
Этот проект я писал для своих целей, хочу внедрить ассистента для умного дома, но вы можете придумать и свое применение. Это может быть разговорный бот или ваш личный ассистент.
Полезные ссылки:
Весь код на GitHub, библиотека распознавания VOSK, платформа DialogFlow.