Speech AI с Python & Google API


image


Добрый день!


Совсем недавно пришла в голову идея сделать "говорилку" на русском языке. В голове была простенькая схема наподобие:


1) Распознать речь с микрофона
2) Придумать более — менее разумный ответ.
В этом пункте можно сделать много интересного.
Например реализовать управление чем — нибудь физическим и не очень.
3) Преобразовать этот самый ответ в речь и воспроизвести.


Самое интересное, что для всех этих пунктов нашлись библиотеки под Python, чем я и воспользовался.


В итоге получилась связка, практически не зависящая от выбранного в качестве разговорного языка.


Распознавание речи


SpeechRecognition


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


Обработка речи


ChatterBot


Библиотека использует методы машинного обучения. Обучение происходит на наборах данных в формате диалогов.


image
Процесс обучения в библиотеке 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)

Пакеты ставить по инструкциям с сайтов:



Также при установке SpeechRecognition иногда нужно помочь одной зависимости (PyAudio):


sudo apt-get install python-pyaudio python3-pyaudio 
pip3 install pyaudio

chatterbot советует использовать MongoDB для работы в production.
По умолчанию в качестве хранилища данных используется Json файл, что приводит к многократному замедлению работы при обучении на средних по размеру выборках.


Что дальше?


Из мыслей:


  • Разнообразить логику бота, например добавив адаптер поисковых запросов к Google
  • Использовать здесь Computer Vision, например чтобы озвучивать увиденные предметы или имена прошедших мимо людей
  • Добавить боту эмоций при помощи конечного автомата
  • Попробовать тренировать бота на Ubuntu Dialog Corpus
  • Использовать подобное в робототехнике (для умного дома)
Поделиться с друзьями
-->

Комментарии (11)


  1. Denkenmacht
    10.03.2017 04:55

    Правильно мыслите — поиск в гугле добавьте и будет уже весело! По крайней мере справочную функцию сможет выполнять.
    А в целом очень хорошо, для повышения быстродействия надо посмотреть как вы импортируете сторонние модули (pygame), вам из них возможно не все надо — тогда эти модули можно немного почистить от лишнего.


  1. zigrus
    10.03.2017 12:37
    +2

    bash.im — там куча диалогов. с нестандартной развязкой


  1. iwqn
    10.03.2017 14:44

    Сделайте его в фоновом режиме чтобы он ждал ключевую фразу типа Окей бот ))


    1. descine
      10.03.2017 14:50

      Можно. У recognizer'a из SpeechRecognition есть метод с коллбеком.

      Подробности


  1. BurlakovSG
    10.03.2017 14:45

    Синтез речи ужасный. Можно как-то указывать ударения для гугловского синтеза?


    1. descine
      10.03.2017 15:02

      В видео на качестве сказалось то, что я использовал очень слабый микрофон своего ноутбука.
      И все же, мне кажется, что то, как говорит синтезатор Google в разы лучше например этого:


      1. menelion_elensule
        10.03.2017 17:21

        Ну вы сравнили :). На самом деле, гугловский синт неплохо бы чуть ускорить, если это можно (код ещё не смотрел), тогда будет естественнее. Ещё можно использовать API от Яндекса или Ивоны (правда, последних Амазон купил, так что не знаю, что с ними теперь).


        1. descine
          18.03.2017 17:45

          Что до Yandex'a, то API вроде бесплатное лишь на месяц.
          https://tech.yandex.ru/speechkit/cloud/
          А gTTS ведет прямиком в "черную ящик" Google'а.


  1. iwqn
    13.03.2017 06:20

    Основываясь на ваших исходниках запилил себе голосового ассистента под Windows:

    http://pythono.ru/speech-ai/

    Получилось весьма удобно.

    В дальнейшем думаю нужно сделать чтобы при фразе "«Открыть фильм» или «Слушать музыку» открывалось непосредственно фильм или песня а не поисковая выдача. Это можно сделать просто распарсив поисковую выдачу. Еще думаю научить программу рассказывать анекдоты и узнавать погоду, а также читать вслух ответы на поисковые запросы.

    Chatterbot пришлось выпилить ибо он мне был не нужен да и не особо адекватен.


    1. descine
      18.03.2017 17:31

      Здорово! Интересная реализация поисковых запросов, думал будет сложнее.
      Думаю, вашу реализацию можно упростить при помощи regex'ов.


      Можно еще поиграться с библиотеками NTLK (Natural Language Toolkit) и ее аналогом для русского языка (как зовут — не помню). Вроде бы при помощи NTLK можно искать синонимы и еще много чего интересного, связанного с обработкой языковых конструкций.


      1. iwqn
        19.03.2017 12:43

        есть еще Pymorphy2 тоже довольно мощная вещь для обработки русских фраз