Speech AI с Python & Google API
Добрый день!
Совсем недавно пришла в голову идея сделать "говорилку" на русском языке. В голове была простенькая схема наподобие:
1) Распознать речь с микрофона
2) Придумать более — менее разумный ответ.
В этом пункте можно сделать много интересного.
Например реализовать управление чем — нибудь физическим и не очень.
3) Преобразовать этот самый ответ в речь и воспроизвести.
Самое интересное, что для всех этих пунктов нашлись библиотеки под Python, чем я и воспользовался.
В итоге получилась связка, практически не зависящая от выбранного в качестве разговорного языка.
Распознавание речи
SpeechRecognition
Эта библиотека представляет из себя обвертку над многими популярными сервисами / библиотеками распознавания речи.
Т.к. из всех представленных в списке библиотеки сервисов первым заработал Google Speech Recognition, им я и воспользовался в дальнейшем.
Обработка речи
ChatterBot
Библиотека использует методы машинного обучения. Обучение происходит на наборах данных в формате диалогов.
Процесс обучения в библиотеке chatterbot
В качестве источников данных для обучения могут выступать файлы такого простого формата
По сути они представляют из себя набор диалогов в виде:
- Вопрос
- Ответ
- ...
- Ответ
Для английского языка там есть хороший набор обучающих классов, один из которых берет диалоги из Ubuntu Dialog Corpus, а другой из Twitter'a.
К сожалению, для русского языка я не нашел альтернатив Ubuntu Dialog Corpus (такого же объема). Хотя тот же TwitterTrainer должен работать.
В порядке эксперимента я попробовал использовать при обучении диалоги из первого тома Воины и Мира.
Получилось забавно, но малоправдоподобно, т.к. диалоги там зачастую направленные на определенных персонажей романа.
Так как без большого количества данных сложно получить из бота интересного собеседника, в данный момент поиск хорошей базы для диалогов продолжается.
Еще библиотека chatterbot предоставляет набор "Логических модулей" (LogicAdapter). При помощи которых можно например фильтровать ответ, научить бота считать или говорить текущее время.
Библиотека довольно гибкая, позволяет писать свои классы для обучения и логические модули.
Синтезирование и воспроизведение речи
Google Text to Speech
Эта библиотека умеет преобразовывать строку в mp3 файл с речью. Т.к. за этой библиотекой стоит Google, то на выбор имеется много языков, включая русский.
Первые успехи
Код проекта
Доступен по ссылке: GHub
Сразу хочу посоветовать создать отдельное виртуальное окружение для python.
Например при помощи conda.
conda create --name speech_ai
source activate speech_ai
conda install python=3.5
Для экспериментов с вышеописанным набором библиотек подойдет:
- python 3 (т.к. в нем нет мороки с non-ascii символами, как в Python 2)
Пакеты ставить по инструкциям с сайтов:
- Google Text to Speech
- SpeechRecognition
- Chatterbot
- PyGame (Для воспроизведения синтезированной речи)
Также при установке SpeechRecognition иногда нужно помочь одной зависимости (PyAudio):
sudo apt-get install python-pyaudio python3-pyaudio
pip3 install pyaudio
chatterbot советует использовать MongoDB для работы в production.
По умолчанию в качестве хранилища данных используется Json файл, что приводит к многократному замедлению работы при обучении на средних по размеру выборках.
Что дальше?
Из мыслей:
- Разнообразить логику бота, например добавив адаптер поисковых запросов к Google
- Использовать здесь Computer Vision, например чтобы озвучивать увиденные предметы или имена прошедших мимо людей
- Добавить боту эмоций при помощи конечного автомата
- Попробовать тренировать бота на Ubuntu Dialog Corpus
- Использовать подобное в робототехнике (для умного дома)
Комментарии (11)
iwqn
10.03.2017 14:44Сделайте его в фоновом режиме чтобы он ждал ключевую фразу типа Окей бот ))
descine
10.03.2017 14:50Можно. У recognizer'a из SpeechRecognition есть метод с коллбеком.
ПодробностиBurlakovSG
10.03.2017 14:45Синтез речи ужасный. Можно как-то указывать ударения для гугловского синтеза?
descine
10.03.2017 15:02В видео на качестве сказалось то, что я использовал очень слабый микрофон своего ноутбука.
И все же, мне кажется, что то, как говорит синтезатор Google в разы лучше например этого:
menelion_elensule
10.03.2017 17:21Ну вы сравнили :). На самом деле, гугловский синт неплохо бы чуть ускорить, если это можно (код ещё не смотрел), тогда будет естественнее. Ещё можно использовать API от Яндекса или Ивоны (правда, последних Амазон купил, так что не знаю, что с ними теперь).
descine
18.03.2017 17:45Что до Yandex'a, то API вроде бесплатное лишь на месяц.
https://tech.yandex.ru/speechkit/cloud/
А gTTS ведет прямиком в "черную ящик" Google'а.
iwqn
13.03.2017 06:20Основываясь на ваших исходниках запилил себе голосового ассистента под Windows:
http://pythono.ru/speech-ai/
Получилось весьма удобно.
В дальнейшем думаю нужно сделать чтобы при фразе "«Открыть фильм» или «Слушать музыку» открывалось непосредственно фильм или песня а не поисковая выдача. Это можно сделать просто распарсив поисковую выдачу. Еще думаю научить программу рассказывать анекдоты и узнавать погоду, а также читать вслух ответы на поисковые запросы.
Chatterbot пришлось выпилить ибо он мне был не нужен да и не особо адекватен.descine
18.03.2017 17:31Здорово! Интересная реализация поисковых запросов, думал будет сложнее.
Думаю, вашу реализацию можно упростить при помощи regex'ов.
Можно еще поиграться с библиотеками NTLK (Natural Language Toolkit) и ее аналогом для русского языка (как зовут — не помню). Вроде бы при помощи NTLK можно искать синонимы и еще много чего интересного, связанного с обработкой языковых конструкций.
Denkenmacht
Правильно мыслите — поиск в гугле добавьте и будет уже весело! По крайней мере справочную функцию сможет выполнять.
А в целом очень хорошо, для повышения быстродействия надо посмотреть как вы импортируете сторонние модули (pygame), вам из них возможно не все надо — тогда эти модули можно немного почистить от лишнего.