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

Материал из virt2real wiki
Перейти к: навигация, поиск

Содержание

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

См. соответствующие разделы

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

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


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

Распознавание речи производится с помощью сервиса Google, соответственно, работает только при наличии подключения к Интернету.

Принцип заключается в том что на борту Виртурилки с микрофонного входа записывается небольшой фрагмент речи, который кодируется во FLAC и отсылается на сервер Google. После отправки файла Google возвращает JSON ответ, в котором содержится результат распознавания. Это одна (или несколько) гипотез с указанием вероятности для каждой.


Процесс состоит из следующих стадий:


Запись голоса

Так как нам нужно распознавать словесные команды, необходимо записывать голос до появления паузы. Реализуется это с помощью пакета Sox.

Про установку пакета Sox см. инструкцию в самом низу.

rec -c 1 -r 16000 -b 16 /tmp/rec.wav silence 1 0.1 6% 1 0.5 8%

Данная команда записывает в файл /tmp/rec.wav 16-ти битный моно-звук с частотой дискретизации 16000 Гц. При записи используется фильтр silence, который как раз и реализует старт записи при появлении звука и останавливает запись при появлении тишины в течении пол-секунды.

Параметры

1 0.1 6% 1 0.5 8%

задают длительность и громкость стартового звука и длительность и уровень тишины для остановки. Это та ещё магия, подробнее см. документацию на Sox.

При этом в консоли увидим что-то вроде такого ("Done." появится после окончания записи).

Input File     : 'default' (alsa)
Channels       : 1
Sample Rate    : 16000
Precision      : 16-bit
Sample Encoding: 16-bit Signed Integer PCM

In:0.00% 00:00:01.02 [00:00:00.00] Out:3.02k [      |      ] Hd:0.0 Clip:0
Done.


Кодирование звука во FLAC

Осуществляется командой

flac -f -s /tmp/rec.wav -o /tmp/rec.flac

Где /tmp/rec.wav - входной файл (который мы записали), а /tmp/rec.flac - выходной файл, звук в формате FLAC.


Отправка на сервер Google

Производится с помощью CURL PHP. Данный фрагмент не идеальный, но работает.

Переменная $lang задаёт язык, на котором мы говорили в микрофон во время записи. Гугл сам определять не умеет.

"ru-RU" - для русского,

"en-US" - для американского английского.

$file_to_upload = array('userfile'=>'@/tmp/rec.flac');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=$lang");
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Firefox/17.0');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: audio/x-flac; rate=16000"));
curl_setopt($ch, CURLOPT_POSTFIELDS, $file_to_upload);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$json=curl_exec ($ch);
curl_close($ch);

Результат теперь содержится в переменной $json.


Разбор ответа

Ответ сервера Google выглядит примерно вот так (для фразы "привет")

{"status":0,"id":"","hypotheses":[{"utterance":"привет","confidence":0.72668469}]}


Нас тут больше всего интересуют параметры utterance (высказывание) и confidence (уверенность). Т.е. текстовый результат распознавания фразы и вероятность, на сколько эта фраза соответствует действительности.


Синтезирование речи

Для синтезирования речи из текста на данный момент имеется два варианта - локальный, с помощью пакета espeak, и удалённый, через Интернет, с помощью сервиса Google. Второй способ работает только при наличии подключения к Интернету.


eSpeak

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

Официальный сайт - http://espeak.sourceforge.net. Подробности по параметрам запуска см. там.

Установка осуществляется через пакетную систему Виртурилки, подробнее см. внизу страницы.

Простейший вариант использования:

espeak "hello" --stdout | aplay

eSpeak работает через portaudion, соответственно, необходимо настроить параметры звуковой карты. Правильно это пока сделать не получилось, по-этому вывод программы espeak производится в плеер aplay, таким образом всё отлично работает. Когда разберёмся с настройкой ALSA, внесу коррективы в инструкцию.


Google

Самое приличное произношение на русском языке. Один недостаток - для работы требуется подключение к Интернету. Однако, результаты, полученные от сервера Google (обычные mp3-файлы маленького размера) можно кэшировать в локальной файловой системе, так что при повторном запросе фразы можно брать локально. Этот функционал реализован в примерном скрипте /etc/virt2real/speech/speak.php (про него чуть далее).

Отправка текста фразы на сервер и загрузка результата - mp3-файла производится командой консоли

$TEXT - текст фразы

$LANG - язык. "ru" - для русского, "en" - для английского.

wget -q -U "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US;) Gecko/20091102 Firefox/3.5.5" "http://translate.google.com/translate_tts?q=$TEXT&tl=$LANG" -O /tmp/result.mp3

Результат теперь содержится в файле /tmp/result.mp3, который можно воспроизвести командой

play /tmp/result.mp3


Использование скрипта /etc/virt2real/speech/speak.php

Для упрощения выполнения базовых функций по синтезу речи был сделан скрипт, которому надо указать единственный обязательный параметр - текст, который надо произнести.

/etc/virt2real/speech/speak.php text [lang] [engine]

Однако, можно указать ещё два необязательных параметра.

lang - задаёт язык и может принимать значения "ru" - для русского и "en" для английского

engine - задаёт использование движка синтезатора. 0 - использовать eSpeak, 1 - использовать Google

Если дополнительные параметры не указаны - они берутся из глобальной настройки в файле /etc/virt2real/speech/config.json, который устанавливается в модуле "Речь" админки.

При использовании движка Google фразы кэшируются в каталоге /usr/share/googlevoice.



Festival

Хороший локальный синтезатор речи, обрабатывает русский язык лучше чем eSpeak. На данный момент этот пакет недоступен на Виртурилке.



SVOX

Пока недоступен

https://github.com/rhdunn/svox



Модуль "Речь" в админке

Основные операции по работе с речью можно опробовать в разделе "Аудио"->"Речь" (по адресу <ip_виртурилки>?speech )



Пример "разговора" с Виртурилкой

Для осуществления "разговора" необходимо сделать скрипт, который будет

  • в цикле ждать появления звука (голоса)
  • записывать его до появления тишины
  • кодировать во FLAC
  • отправлять на сервер Google для распознавания
  • принимать результат распознавания
  • в случае корректного распознавания (в ответе содержится хоть одна гипотеза) пробовать подобрать вариант ответа из заранее запрограммированных
  • воспроизводить на динамик фразу-ответ


Всё это реализует тестовый скрипт /etc/virt2real/speech/speechrecognition.sh

Результат его работы можно посмотреть в видеоролике



Конечно, на серьёзное применение это не тянет, но даже на базе такого простейшего решения можно сделать систему интерактивного общения с железкой.

Установка необходимых пакетов

Чтобы весь вышеуказанный функционал работал, необходимо установить несколько пакетов на Виртурилку. Делается это в консоли (лучше обычной, но можно попробовать и в консоли админки)

# обновление списка пакетов на сервере
opkg-cl update

# установка espeak
opkg-cl install espeak

# установка библиотек для плеера Sox
opkg-cl install libvorbis

# установка FLAC
opkg-cl install flac

# установка lame
opkg-cl install lame

# установка Sox
opkg-cl install sox

# установка тестовых скриптов Virt2real
opkg-cl install speech

# установка ffmpeg (его библиотеки требуются для плеера)
opkg-cl install ffmpeg

Помимо пакетов, надо обновить админку до версии 0.1.28, т.к. только начиная с этой версии появился раздел "Речь".

Обновить админку можно из самой админки, в разделе "Администрирование"->"Обновление" (<ip_виртурилки>?update )

При этом лучше выбрать "жёсткое обновление".