Приветствую форумчане. Реализовал оффлайн распознавание речи на стороне сервера, чем и хочу с вами поделиться.
Начнем с того, что вам нужно иметь неплохой микрофон, который бы обеспечивал приемлимое качество сигнала. Я собираюсь приобрести шорох-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, запускающий скрипт, замена микрофона, и составление своей аккустической модели. Своя аккустическая модель будет быстрее и точнее распознавать именно ваш голос, особенности произношения. Но я пока не разобрался как ее составить)
Спасибо за внимание) Критика приветствуется. Я хотя бы положил начало)