Оффлайн распознавание речи. PocketSphinx.

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

coolermister
Сообщения: 49
Зарегистрирован: Пт июл 31, 2015 9:23 am
Благодарил (а): 12 раз
Поблагодарили: 17 раз

Оффлайн распознавание речи. PocketSphinx.

Сообщение coolermister » Чт окт 15, 2015 12:40 pm

upd.В версии 5prealpha разработчики убрали вывод в stdout. Буду переписывать исходники pocketsphinx_continuous, добавлю вывод в stdout, и постараюсь добавить отправку распознанного текста на command.php
Приветствую форумчане. Реализовал оффлайн распознавание речи на стороне сервера, чем и хочу с вами поделиться.
Начнем с того, что вам нужно иметь неплохой микрофон, который бы обеспечивал приемлимое качество сигнала. Я собираюсь приобрести шорох-7, пока использую микрофон из веб камеры.
Возьму за установку, что те кто хотят это повторить немного разбираются в линуксе, если что то будет не понятно, распишу подробнее.
В моем случае, имеем модуль управления с ubuntu server.
Если у вас установлен pulseaudio, то мое решение не заработает, его нужно удалить)
Поставим alsa
СпойлерПоказать

Код: Выделить всё

apt-get install alsa-base alsa-utils
Для того,что бы PocketSphinx использовал alsa по умолчанию, его придется пересобирать,
предварительно переместив заголовочный файл pulsesudio, если такой присутствует, командой:
СпойлерПоказать

Код: Выделить всё

mv /usr/include/pulse/pulseaudio.h /usr/include/pulse/pulseaudio.h.old
Теперь можно начинать собирать сам движок.
Устанавливаем необходимые пакеты
СпойлерПоказать

Код: Выделить всё

apt-get install gcc make 
apt-get install bison -y
Собираем sphinxbase:
СпойлерПоказать

Код: Выделить всё

mkdir /usr/install
cd /usr/install
wget http://downloads.sourceforge.net/project/cmusphinx/sphinxbase/0.8/sphinxbase-0.8.tar.gz
tar -xvf sphinxbase-0.8.tar.gz
cd sphinxbase-0.8
./configure --enable-fixed    // опция -enable-fixed тоже нужна для alsa, без нее у меня не завелось
make
make install
Если все идет нормально, то в процессе команды ./configure --enable-fixed вы должны увидеть что то вроде:
СпойлерПоказать

Код: Выделить всё

checking pulse/pulseaudio.h usability... no     //!!!!!!!
checking pulse/pulseaudio.h presence... no    //!!!!!!!
checking for pulse/pulseaudio.h... no            //!!!!!!!
checking jack/jack.h usability... no
checking jack/jack.h presence... no
checking for jack/jack.h... no
checking alsa/asoundlib.h usability... yes
checking alsa/asoundlib.h presence... yes
checking for alsa/asoundlib.h... yes
checking for snd_pcm_open in -lasound... yes
Это значит что сборщик не обнаружил pulseaudio и jack, и будет использовать alsa.
Теперь соберем PocketSphinx.
СпойлерПоказать

Код: Выделить всё

cd /usr/install
wget http://sourceforge.net/projects/cmusphinx/files/pocketsphinx/0.8/pocketsphinx-0.8.tar.gz
tar -xvf pocketsphinx-0.8.tar.gz
cd pocketsphinx-0.8
./configure
make
make install
У меня с этим трудностей не возникло, все собралось без ошибок.
Теперь нужно создать словарь,и файл грамматики для pocketsphinx.
Мне в этом очень помогла вот эта статья:
http://habrahabr.ru/post/267539/
Там все расписано, думаю сложностей с этим не возникнет. Если что, опять же, распишу)
Далее начинается интересное) А именно unix-way костыли)
Если у кого то есть идеи как по другому это реализовать, предлагайте.
Создадим папку speech в корне.
В нее нужно положить аккустическую модель русского языка, которая скачивается по ссылке в посте,файл словаря, и грамматики.
Приложу свои файлы для образца.
Файл грамматики speech.jsgf
СпойлерПоказать

Код: Выделить всё

#JSGF V1.0;

grammar calc;

<greeting> = (алиса|джарвис|жарвис|дом);
<action> = (включи|выключи|включить|выключить);
<device> = (свет|радио рок|радио ультра|музыку|слабую подсветку|среднюю подсветку|питание компьютера|принтер);
<commands> = (время|задания|кнопка питания|который час|ночь|день|статус|температура);
<expression> = <action> <device>|<commands>;
public <query> = <greeting> <expression>;
 
Далее файл словаря:
СпойлерПоказать

Код: Выделить всё

алиса a ll i s aa
включи f k ll uj ch ii
включить f k ll uj ch ii tt
время v rr je mm i
выключи v yy k ll uj ch i
выключить v yy k ll uj ch i tt
день dd je nn
джарвис d zh ay r vv i s
дом d oo m
жарвис zh aa r vv i s
задания z a d aa nn i i
кнопка k n oo p k ay
компьютера k a m pp j ju tt i r ay
который k a t oo r y j
музыку m uu z y k u
ночь n oo ch
питание pp i t aa nn i i
питания pp i t aa nn i i
подсветку p a c vv je t k u
принтер p rr ii nn tt i r
радио r aa dd i ay
рок r oo k
свет s vv je t
слабую s l aa b u uj
среднюю s rr je d nn uj uj
статус s t aa t u s
температура tt i m pp i r a t uu r ay
ультра uu ll t r ay
час ch ja s
В этоу же директорию можно положить скрипт запуска. Пока он неполноценный, позже перепишу с помошью start-stop-daemon.
run.sh
СпойлерПоказать

Код: Выделить всё

#!/bin/bash
pocketsphinx_continuous -hmm /speech/zero_ru.cd_cont_4000 -dict /speech/outputfile -jsgf /speech/speech.jsgf -adcdev hw:1,0 -samprate 8000 -inmic yes -logfn /dev/null | php5-cgi /var/control/parser.php
Подробнее опишу агрументы запуска.
-hmm путь к файлам аккустической модели
-dict путь с словарю
-jsgf путь к грамматике
-adcdev устройство захвата. в моем случае, захват идет с микрофона веб камеры, как я уже писал.
-samprate частота дискретизации. веб камера не поддерживает больше чем 8000.
-inmic Upd. Именно -inmic запускает распознавание с микрофона. -adcdev всего лишь принудительно задает устройство захвата.
-logfn вывод логов.

Далее, вывод pocketsphinx_continuous имеет вид:
СпойлерПоказать

Код: Выделить всё

READY....
Listening...
Stopped listening, please wait...
000000000: дом включи свет
И надо его как то отправить в majordomo. У меня он находится на другом физическом сервере.
ВНИМАНИЕ! УЖАСНЫЙ БЫДЛОКОД.
К сожалению, ничего умнее ко мне в голову в 12 ночи не пришло.
Я пытался использовать curl модуль php, на моей системе он почему то отказывается работать.
Пробовал писать на perl, он для такой задачи больше подходит чем php, но тоже потерпел неудачу.
Так что(содержимое файла /var/control/parser.php):
СпойлерПоказать

Код: Выделить всё

<?php
$f = fopen( 'php://stdin', 'r' );
$i=0;
while( $line = fgets( $f ) ) {
    $i=$i+1;
    if ($i==4) {
        $sub = substr($line, 10);
         $out = iconv("windows-1251", "utf-8", $sub);
        file_get_contents('http://10.10.158.220/command.php?qry=' . $out);

    }
     if ($i==5){
        $i=1;
    }
}
fclose( $f );
?>
Для запуска распознавания после загрузки, поместил /speech/run.sh & в rc.local.
В принципе все. Работает второй день. Вроде неплохо. Из того что можно улучшить, это отправка распознанного в MD, запускающий скрипт, замена микрофона, и составление своей аккустической модели. Своя аккустическая модель будет быстрее и точнее распознавать именно ваш голос, особенности произношения. Но я пока не разобрался как ее составить)
Спасибо за внимание) Критика приветствуется. Я хотя бы положил начало)
Последний раз редактировалось coolermister Пн ноя 02, 2015 12:51 pm, всего редактировалось 9 раз.
За это сообщение автора coolermister поблагодарили (всего 6):
skysilver (Чт окт 15, 2015 12:59 pm) • ACQ_ACQ (Пт окт 16, 2015 12:03 pm) • slgeo (Вт янв 19, 2016 1:56 pm) • krasnov (Пн апр 18, 2016 3:06 pm) • kozsv (Ср авг 03, 2016 4:43 pm) • odinvolk (Пн июл 09, 2018 11:40 pm)
Рейтинг: 6.98%
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

Re: Оффлайн распознавание речи. PocketSphinx. Linux.

Сообщение skysilver » Чт окт 15, 2015 1:03 pm

1. На чем развернут PocketSphinx? Аппаратно имею ввиду?
2. Много ресурсов кушает фоновый процесс? ЦПУ и ОЗУ?
3. Как PocketSphinx узнает, какой микрофон надо использовать - с вебки или с Mic IN? Можно ли реализовать прослушивание нескольких микрофонов, подключенных к одному компу?
4. Громко говорить приходится, чтобы распознавание работало? :) С какого расстояния до микрофона в Вашем можно давать команды?
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
coolermister
Сообщения: 49
Зарегистрирован: Пт июл 31, 2015 9:23 am
Благодарил (а): 12 раз
Поблагодарили: 17 раз

Re: Оффлайн распознавание речи. PocketSphinx. Linux.

Сообщение coolermister » Чт окт 15, 2015 1:22 pm

1. Модуль управления сделан из материнки на s754, одноядерного процессора AMD Sempron 3000+, и 512mb ddr1. Он же управляет нагрузками в комнате.
2. Как ни странно, потребление стремится к нулю) Судя по top, около 20мб, и до 10% в процессе самого распознавания. В простое и того меньше.
3. Задается аргументом -adcdev. Именно тут прописывается устройство, откуда производить захват. Upd. Именно -inmic запускает распознавание с микрофона. -adcdev всего лишь принудительно задает устройство захвата. Можно и несколько микрофонов, но для каждого вам потребуется отдельная аудиокарта, и копия процесса PocketSphinx))
Если использовать usb микрофоны, то просто на каждый по копии PocketSphinx.
4. Тут, все целиком и полностью зависит от микрофона. От его рабочей дальности, чувствительности, направленности, если активный, то наличия АРУ(автоматическая регулировка усиления).
Грубо говоря, чем лучше микрофон, тем лучше и дальше распознавание. В моем случае с дешевой логитековской веб камерой, на расстоянии метра-двух проблем нет. Но каких результатов можно ожидать от вебки?)
Я пробовал много разных конфигураций. Можно ведь использовать и стандартную аудиокарту в материнке, подключая микрофон к ней. Вот я и собираюсь шорох купить, его рабочая дальность 7 метров, хватит на любую комнату) Как куплю, отпишусь о результатах.
Гугл распознает намного более слабые сигналы, но извините у них в распознавании речи работают нейронные сети. Дома такое не поднимешь) За то, PocketSphinx работает быстрее.
Я реализовал распознавание речи и с помощью гугла, но во первых у них ограничение на количество запросов в 50шт, во вторых-проблемы с активацией. А именно как запускать скрипт распознавания, ведь не круто на кнопку нажимать что бы что нибудь сказать) Так что PocketSphinx мне нравится намного больше)
Последний раз редактировалось coolermister Пн ноя 02, 2015 12:49 pm, всего редактировалось 2 раза.
За это сообщение автора coolermister поблагодарил:
skysilver (Чт окт 15, 2015 1:32 pm)
Рейтинг: 1.16%
sleepy
Сообщения: 24
Зарегистрирован: Чт июн 11, 2015 9:17 pm
Откуда: Ростов-на-Дону
Благодарил (а): 2 раза
Поблагодарили: 7 раз

Re: Оффлайн распознавание речи. PocketSphinx. Linux.

Сообщение sleepy » Чт окт 15, 2015 1:40 pm

хе, не успел...)
Тоже поднял сфинкса, но под винду и не 8 версию, а последнюю.
вечером до сервака доберусь и попробую выложить сюда как я это всё сделал.
У меня всё это дело работает не айс...
Косяки:
1. микрофон нюхается постоянно. если рядом телик, то команды сыпятся пачками и "от балды" :(
2. пробовал микрофон на ноуте - команды чёткие только на расстоянии до 40 см, дальше идут ошибки или надо повышать голос.
пробовал блютуз гарнитуру от нокии bh-104 - но там вообще ужас...не то что команды, я не всегда понимал что сам говорю (проверял отправкой голоса обратно в гарнитуру).
Хочу тоже купить шорох-7/8 и проверить на нём. Но как избавиться от помех от телика/радио....прям не знаю.

Протестировал разные режимы работы:
1. По словарю(jsgf) - самое оптимальное. Этот режим как описал выше автор. То есть нужен словарик с грамматикой и прога ищет только в этом узком диапазоне.
2. По языковой модели(lm). Народ сделал уже не плохую языковую модель, но для наших нужно её использовать губительно, так как будут сыпаться ошибки.
3. По ключевому слову. Работает (как я понял) и по lm и по jsgf, но отличие в том, что можно задать список ключевых слов, которые будут проверяться. Програ распознаёт голос и только когда результат совпадает с ключевым словом, то слово передаётся иначе ничего не пишет.

Режимы можно переключать. Можно переключать языки (разные модели по каждый язык).

У меня windows 7 x64, 6 Гб ддр3, i7 920. Я даже не заметил что она ресурсы хавает. Заметно только когда режим lm и передаётся большой словарик. Просто отжирается оперативка на весь словарик.

Несколько микрофонов не пробовал (даже не вникал в этот вопрос), но если не подключен вообще микрофон, то выдаёт ошибку. Скорей всего берётся микрофон по умолчанию.
За это сообщение автора sleepy поблагодарили (всего 3):
coolermister (Чт окт 15, 2015 1:48 pm) • ACQ_ACQ (Пт окт 16, 2015 12:03 pm) • kozsv (Ср авг 03, 2016 4:45 pm)
Рейтинг: 3.49%
coolermister
Сообщения: 49
Зарегистрирован: Пт июл 31, 2015 9:23 am
Благодарил (а): 12 раз
Поблагодарили: 17 раз

Re: Оффлайн распознавание речи. PocketSphinx. Linux.

Сообщение coolermister » Чт окт 15, 2015 1:48 pm

Избавится от помех можно путем второго микрофона направленного на телевизор, и операционного усилителя. Логика простая, ОП вычитает из сигнала основного микрофона, сигнал с вспомогательного. Будет время поэксперементирую, пока не сталкивался с такой проблемой) У sphinx вроде бы есть стандартный механизм шумоподавления, описан здесь http://habrahabr.ru/post/227099/. Но по моему с помехами вроде телевизора оно не справится.
upd. Даже нашел ссылку, рисунок 2 http://www.cqham.ru/mike_master.htm
sleepy
Сообщения: 24
Зарегистрирован: Чт июн 11, 2015 9:17 pm
Откуда: Ростов-на-Дону
Благодарил (а): 2 раза
Поблагодарили: 7 раз

Re: Оффлайн распознавание речи. PocketSphinx. Linux.

Сообщение sleepy » Чт окт 15, 2015 1:58 pm

coolermister писал(а):Избавится от помех можно путем второго микрофона направленного на телевизор, и операционного усилителя. Логика простая, ОП вычитает из сигнала основного микрофона, сигнал с вспомогательного. Будет время поэксперементирую, пока не сталкивался с такой проблемой) У sphinx вроде бы есть стандартный механизм шумоподавления, описан здесь http://habrahabr.ru/post/227099/. Но по моему с помехами вроде телевизора оно не справится.
Про режим шумоподавления тоже читал, но там надо свою модель тренировать, а это тот еще геморрой, для которого ещё и мануалы надо почитать....я то сфинкстрейнер вроде подключил, но как им нормально воспользоваться не понял и забил.
А про
ОП вычитает из сигнала основного микрофона, сигнал с вспомогательного
поподробнее. :)
Мне просто включить 2 микрофона и направить их друг на друга (один у телика, другой у дивана) и кто будет вычитать лишний сигнал?
coolermister
Сообщения: 49
Зарегистрирован: Пт июл 31, 2015 9:23 am
Благодарил (а): 12 раз
Поблагодарили: 17 раз

Re: Оффлайн распознавание речи. PocketSphinx. Linux.

Сообщение coolermister » Чт окт 15, 2015 2:11 pm

Грубо говоря, один микрофон должен быть направлен на вас, а второй можно прямо у динамиков телевизора поставить)
То есть вас слушать будет только один микрофон. ОП-операционный усилитель. На неинвертирующий вход подается сигнал с основного микрофона.
На инвертирующий-со вспомогательного. И ОП будет вычитать из сигнала на неинвертирующем входе, сигнал с инвертирующего. А его выход подключаем к аудиокарте)
Принципы работы ОП очень хорошо описаны вот тут http://cxem.net/beginner/beginner96.php, если будет время и интерес, почитайте)
Схему я привел в прошлом сообщении. Правда, там придется поработать паяльником)
Насчет программного решения данного вопроса - идей нет(
За это сообщение автора coolermister поблагодарил:
sleepy (Чт окт 15, 2015 2:21 pm)
Рейтинг: 1.16%
coolermister
Сообщения: 49
Зарегистрирован: Пт июл 31, 2015 9:23 am
Благодарил (а): 12 раз
Поблагодарили: 17 раз

Re: Оффлайн распознавание речи. PocketSphinx. Linux.

Сообщение coolermister » Чт окт 15, 2015 2:25 pm

sleepy, постарайтесь выложить вашу реализацию, думаю всем будет полезно. Лично мне интересно как вы отправляли команды в majordomo)
upd. Вообще похоже что с проблемой шумоподавления я тоже столкнусь, у меня прямо в комнате акустика стоит)
sleepy
Сообщения: 24
Зарегистрирован: Чт июн 11, 2015 9:17 pm
Откуда: Ростов-на-Дону
Благодарил (а): 2 раза
Поблагодарили: 7 раз

Re: Оффлайн распознавание речи. PocketSphinx. Linux.

Сообщение sleepy » Чт окт 15, 2015 2:32 pm

Почитаю про ОП и буду копать в этом направлении :)
Ещё надо докопаться до адаптивной акустической модели.
И сделать кросс-платформенную "обёртку".

По поводу обёртки. У меня она взята вот от сюда:
https://github.com/Mattze96/pocketsphin ... er/main.py

Написано на pythone 2.7.
Я исправил всё что выдавало ошибки, добавил код с включением разных режимов, ну и добавил отправку по http в МД запросов с расшифровкой.

Можно от туда вырезать графический интерфейс и преобразовать это всё к работе на разных ОС.
coolermister
Сообщения: 49
Зарегистрирован: Пт июл 31, 2015 9:23 am
Благодарил (а): 12 раз
Поблагодарили: 17 раз

Re: Оффлайн распознавание речи. PocketSphinx. Linux.

Сообщение coolermister » Чт окт 15, 2015 2:41 pm

Можно от туда вырезать графический интерфейс и преобразовать это всё к работе на разных ОС.
Было бы круто, но надежда на вас) Такой объем работы я не потяну, плюс я не знаю питона)
Ответить