Оффлайн распознавание речи. PocketSphinx.
Добавлено: Чт окт 15, 2015 12:40 pm
upd.В версии 5prealpha разработчики убрали вывод в stdout. Буду переписывать исходники pocketsphinx_continuous, добавлю вывод в stdout, и постараюсь добавить отправку распознанного текста на command.php
Приветствую форумчане. Реализовал оффлайн распознавание речи на стороне сервера, чем и хочу с вами поделиться.
Начнем с того, что вам нужно иметь неплохой микрофон, который бы обеспечивал приемлимое качество сигнала. Я собираюсь приобрести шорох-7, пока использую микрофон из веб камеры.
Возьму за установку, что те кто хотят это повторить немного разбираются в линуксе, если что то будет не понятно, распишу подробнее.
В моем случае, имеем модуль управления с ubuntu server.
Если у вас установлен pulseaudio, то мое решение не заработает, его нужно удалить)
Поставим alsa
Для того,что бы PocketSphinx использовал alsa по умолчанию, его придется пересобирать,
предварительно переместив заголовочный файл pulsesudio, если такой присутствует, командой:
Теперь можно начинать собирать сам движок.
Устанавливаем необходимые пакеты
Собираем sphinxbase:
Если все идет нормально, то в процессе команды ./configure --enable-fixed вы должны увидеть что то вроде:
Это значит что сборщик не обнаружил pulseaudio и jack, и будет использовать alsa.
Теперь соберем PocketSphinx.
У меня с этим трудностей не возникло, все собралось без ошибок.
Теперь нужно создать словарь,и файл грамматики для pocketsphinx.
Мне в этом очень помогла вот эта статья:
http://habrahabr.ru/post/267539/
Там все расписано, думаю сложностей с этим не возникнет. Если что, опять же, распишу)
Далее начинается интересное) А именно unix-way костыли)
Если у кого то есть идеи как по другому это реализовать, предлагайте.
Создадим папку speech в корне.
В нее нужно положить аккустическую модель русского языка, которая скачивается по ссылке в посте,файл словаря, и грамматики.
Приложу свои файлы для образца.
Файл грамматики speech.jsgf
Далее файл словаря:
В этоу же директорию можно положить скрипт запуска. Пока он неполноценный, позже перепишу с помошью start-stop-daemon.
run.sh
Подробнее опишу агрументы запуска.
-hmm путь к файлам аккустической модели
-dict путь с словарю
-jsgf путь к грамматике
-adcdev устройство захвата. в моем случае, захват идет с микрофона веб камеры, как я уже писал.
-samprate частота дискретизации. веб камера не поддерживает больше чем 8000.
-inmic Upd. Именно -inmic запускает распознавание с микрофона. -adcdev всего лишь принудительно задает устройство захвата.
-logfn вывод логов.
Далее, вывод pocketsphinx_continuous имеет вид:
И надо его как то отправить в majordomo. У меня он находится на другом физическом сервере.
ВНИМАНИЕ! УЖАСНЫЙ БЫДЛОКОД.
К сожалению, ничего умнее ко мне в голову в 12 ночи не пришло.
Я пытался использовать curl модуль php, на моей системе он почему то отказывается работать.
Пробовал писать на perl, он для такой задачи больше подходит чем php, но тоже потерпел неудачу.
Так что(содержимое файла /var/control/parser.php):
Для запуска распознавания после загрузки, поместил /speech/run.sh & в rc.local.
В принципе все. Работает второй день. Вроде неплохо. Из того что можно улучшить, это отправка распознанного в MD, запускающий скрипт, замена микрофона, и составление своей аккустической модели. Своя аккустическая модель будет быстрее и точнее распознавать именно ваш голос, особенности произношения. Но я пока не разобрался как ее составить)
Спасибо за внимание) Критика приветствуется. Я хотя бы положил начало)
Приветствую форумчане. Реализовал оффлайн распознавание речи на стороне сервера, чем и хочу с вами поделиться.
Начнем с того, что вам нужно иметь неплохой микрофон, который бы обеспечивал приемлимое качество сигнала. Я собираюсь приобрести шорох-7, пока использую микрофон из веб камеры.
Возьму за установку, что те кто хотят это повторить немного разбираются в линуксе, если что то будет не понятно, распишу подробнее.
В моем случае, имеем модуль управления с ubuntu server.
Если у вас установлен pulseaudio, то мое решение не заработает, его нужно удалить)
Поставим alsa
СпойлерПоказать
Код: Выделить всё
apt-get install alsa-base alsa-utils
предварительно переместив заголовочный файл pulsesudio, если такой присутствует, командой:
СпойлерПоказать
Код: Выделить всё
mv /usr/include/pulse/pulseaudio.h /usr/include/pulse/pulseaudio.h.old
Устанавливаем необходимые пакеты
СпойлерПоказать
Код: Выделить всё
apt-get install gcc make
apt-get install bison -y
СпойлерПоказать
Код: Выделить всё
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
СпойлерПоказать
Код: Выделить всё
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
Теперь соберем 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
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: дом включи свет
ВНИМАНИЕ! УЖАСНЫЙ БЫДЛОКОД.
К сожалению, ничего умнее ко мне в голову в 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 );
?>
В принципе все. Работает второй день. Вроде неплохо. Из того что можно улучшить, это отправка распознанного в MD, запускающий скрипт, замена микрофона, и составление своей аккустической модели. Своя аккустическая модель будет быстрее и точнее распознавать именно ваш голос, особенности произношения. Но я пока не разобрался как ее составить)
Спасибо за внимание) Критика приветствуется. Я хотя бы положил начало)