Распознавание CMU Sphinx требуется помощь

Обсуждение статей, технологий домашней автоматизации, программных и аппаратных решений
kulpinivan
Сообщения: 25
Зарегистрирован: 25 ноя 2012, 23:23

Распознавание CMU Sphinx требуется помощь

Сообщение kulpinivan » 07 апр 2016, 23:24

Доброго времени суток.
Уже не одну неделю пытаюсь как то приспособить локальное распознавание голоса, использую для этого pocketsphinx.
Цель постоянно "слушать" микрофон, и при определенной фразе чтоб происходила активация, захват и распознавание голоса, затем выполнение определенной команды если результат распознавания будет соответствовать "маске" в команде.
Микрофон Шорох с усилителем. Расположен примерно в 3х метрах от "командного пункта" (дивана).
Языковая модель используется русская zero_ru_v3
Словарь создал свой, около 30 слов, используемых в командах.
В качестве слова для активации использую "дядя фёдор"
Грамматика описана в файле *.JSGF листинг примерно такой
#JSGF V1.0;
grammar test;
<greeting> = дядя фёдор;
<target> = ( гостиная | кухня | ванная | телевизор );
<sub> = ( тише | громче | свет );
public = <greeting> <target> <sub>
запускаю командой: pocketsphinx_continuous -argfile файл_конфигурации -inmic yes 2>./log.txt | tee ./result.txt
результат распознования попадает в файл result.txt
Если нет посторонних шумов, то все проходит отлично, примерно в 99% случаев.
например команда: "дядя фёдор телевизор громче" выдает такой же результат "дядя фёдор телевизор громче"
но если включен ТВ и "фонит" либо кто то разговаривает, сфинкс после прослушивания команды продолжает слушать, т.е. запись не останавливается, и окружающий шум воспринимается как продолжение моей команды, соответственно результат такого распознавания отрицательный. Пробовал играть с чувствительностью микрофона, результата не принесло, также параметр -remove_noise пробовал переключать, тоже не помогло.
Собственно вопросы такие:
1. Можно ли как то ограничить время слушания в сек. после активации? может есть такой параметр?
2. Может кто поделится макетом скрипта в котором можно увидеть как сделать выполнение какой-либо команды, получив результат распознавания?

При включенном телевизоре, сфинкс периодически реагирует выдавая типа: дядя фёдор гостиная громче или дядя фёдор телевизор свет :D а иногда и попадает прям в команду, т.е. из-за ложных срабатываний при стороннем разговоре или просмотре ТВ передачи возможно где то погаснет свет и т.п. чего совсем не хочется. :)

xboct
Сообщения: 73
Зарегистрирован: 17 ноя 2011, 01:09

Re: Распознавание CMU Sphinx требуется помощь

Сообщение xboct » 09 апр 2016, 10:05

kulpinivan писал(а): 2. Может кто поделится макетом скрипта в котором можно увидеть как сделать выполнение какой-либо команды, получив результат распознавания?
вот
https://github.com/handyman5/mythtv-vc

kulpinivan
Сообщения: 25
Зарегистрирован: 25 ноя 2012, 23:23

Re: Распознавание CMU Sphinx требуется помощь

Сообщение kulpinivan » 15 апр 2016, 22:32

сегодня новые эксперименты показали, что если сразу после окончания голосовой команды приглушать микрофон, таким образом огородить сфинкса от посторонних шумов, то результат распознавания очень хороший, даже несмотря на фоновые звуки.
Как можно ограничить по времени прослушивание, возможно ли такое? т.е. например не постоянно слушать, а слушать периодами, например по 2 сек. Если команда в этот период поступит, он ее обработает, если нет то нет, но при этом команда будет ограждена от фона.

Lebnik
Сообщения: 39
Зарегистрирован: 05 янв 2017, 17:57

Re: Распознавание CMU Sphinx требуется помощь

Сообщение Lebnik » 15 янв 2017, 15:43

xboct похоже вам правильно подсказал, дав ссылку на гитхаб, где нек-то играет с звуковыми окнами на питоне, подробнее http://cmusphinx.sourceforge.net/doc/sp ... dower.html
Однако, это теория, практиковаться как я понимаю нужно на питоне или на Java, я не пробовал, но видимо в какой-то момент придется заняться.

Alex_Jet
Сообщения: 897
Зарегистрирован: 12 янв 2014, 18:00
Откуда: Россия, г.Томск

Re: Распознавание CMU Sphinx требуется помощь

Сообщение Alex_Jet » 25 янв 2017, 09:07

To kulpinivan. Я думаю, что распознавать надо все поэтапно. Для примера:
-шаблоны команды начинаются с "Дядя Федор", продолжаются, например, "включи свет в кухне", "включи свет в кухне боковой".
-после произнесения фразы "Дядя", ПО должно ясно понять что это слово "Дядя" и оно содержится в командах, значит слушаем дальше.
-после произнесения "Федор", ПО должно понять это слово и проанализировать команды, после анализа будет понятно что во всех командах есть "Дядя" + "Федор", значит слушаем далее.
-после произнесения "включи", ПО также должно проанализировать из оставшихся команды и отобрать те в которых кроме "Дядя" + "Федор" встречается еще "включи", поскольку команда не полная, то слушаем дальше.
-после произнесения "свет", для анализа должны остаться только те команды, которые содержат "Дядя" + "Федор" + "включи" + "свет", слушаем дальше.
-после произнесения "в", для анализа должны остаться только те команды, которые содержат "Дядя" + "Федор" + "включи" + "свет" + "в", слушаем дальше.
-после произнесения "кухне", для анализа должны остаться только те команды, которые содержат "Дядя" + "Федор" + "включи" + "свет" + "в" +"кухне" - то есть наши две команды! слушаем дальше.
Остается 2 варианта:
-1 - ничего не произносится, ПО не расслышав ничего подходящего (точнее слова "боковой") в течении 1-2 секунд включает основной свет в кухне.
-2 - произносится слово "боковой", для анализа останется только одна существующая команда, а значит ее надо выполнять и больше ничего не слушать.

Ограничивать слушание надо по максимальной длине команды в системе, анализируя он-лайн команды. По времени - смысла нет.

Maxmen
Сообщения: 71
Зарегистрирован: 05 янв 2017, 01:00

Re: Распознавание CMU Sphinx требуется помощь

Сообщение Maxmen » 25 янв 2017, 09:39

Классная штука! Если сможете заставить ее корректно работать, не обращая внимания на посторонние шумы, поделитесь пожалуйста рецептом. Главное "Простоквашино" не включать. :-)

Alex_Jet
Сообщения: 897
Зарегистрирован: 12 янв 2014, 18:00
Откуда: Россия, г.Томск

Re: Распознавание CMU Sphinx требуется помощь

Сообщение Alex_Jet » 16 фев 2017, 07:47

kulpinivan писал(а):Уже не одну неделю пытаюсь как то приспособить локальное распознавание голоса, использую для этого pocketsphinx.
Есть ли какие-нибудь положительные результаты по данной работе? Кстати, какое железо используете?

Alex_Jet
Сообщения: 897
Зарегистрирован: 12 янв 2014, 18:00
Откуда: Россия, г.Томск

Re: Распознавание CMU Sphinx требуется помощь

Сообщение Alex_Jet » 03 авг 2017, 10:35

Подниму немного тему, поскольку пришли OrangePi Zero, которые хочется приспособить в качестве комнатного модуля для Multiroom и локального распознавания команд.
У меня все остановилось на сборке sphinx из исходников. Ругань идет на то что необходима какая-то альтернативная библиотека pyton, а не та что есть в современной версии Armbian.
1. Есть у кого опыт сборки sphinx из исходников?
2. Есть ли опыт использования другой ОС на OrangePi Zero, кроме Armbian (старая версия - на основе Debian, новая версия - на основе Ubunta)?

Alex_Jet
Сообщения: 897
Зарегистрирован: 12 янв 2014, 18:00
Откуда: Россия, г.Томск

Re: Распознавание CMU Sphinx требуется помощь

Сообщение Alex_Jet » 17 янв 2018, 13:43

Выложу гайд по настройке Sphinx тут - http://home-smart-home.ru/raspberry-pi- ... e-golosom/

Alex_Jet
Сообщения: 897
Зарегистрирован: 12 янв 2014, 18:00
Откуда: Россия, г.Томск

Re: Распознавание CMU Sphinx требуется помощь

Сообщение Alex_Jet » 21 янв 2018, 03:00

Все завелось на базе Orange Pi Zero с аналоговым микрофоном от какой-то гарнитуры. Почти все в соответствии со статьей.
Строка запуска "ассистента":

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

pocketsphinx_continuous -adcdev plughw:0,0 -hmm /root/zero_ru_cont_8k_v3/zero_ru.cd_semi_4000/ -jsgf /root/rus_gram -dict /root/rus_dict  -inmic yes -logfn /dev/null
В ней - plughw:0,0 - это 0 девайс самой Zero,
rus_gram - мой сгенерированный словарь грамматики (фразы):

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

#JSGF V1.0;
grammar PI;
public <cmd> = <name> <action> <obj> <place>;
<name> = ( Лиза );
<action> = ( включи | выключи );
<obj> = ( свет | лампу | розетку );
<place> = ( гостевой | кухне );
rus_dict -мой словарь ключевых слов,

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

Лиза l y z ay
включи f k ll uj ch ii
выключи v yy k ll uj ch i
гостевой g ay ss tt i v oo j
кухне k uu h nn i
лампу l aa m p u
розетку r a zz je t k u
свет s vv je t
логгирование выключено: -logfn /dev/null
Скрипт управления MegaD:

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

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#project: smart-home
import subprocess
import time
import urllib2

exe = '''pocketsphinx_continuous -adcdev plughw:0,0 -hmm /root/zero_ru_cont_8k_v3/zero_ru.cd_semi$
p = subprocess.Popen(["%s" % exe], shell=True, stdout=subprocess.PIPE)

while True:
        retcode = p.returncode
        line = p.stdout.readline()

        if line == "Лиза включи лампу гостевой\n":
                print line
                response = urllib2.urlopen('http://192.168.12.21/sec/?pt=27&cmd=27:1')
                print "Ответ контроллера: ", response.code
        elif line == "Лиза выключи лампу гостевой\n":
                print line
                response = urllib2.urlopen('http://192.168.12.21/sec/?pt=27&cmd=27:0')
                print "Ответ контроллера: ", response.code
        elif line == "Лиза включи лампу кухне\n":
                print line
                response = urllib2.urlopen('http://192.168.12.21/sec/?pt=28&cmd=28:1')
                print "Ответ контроллера: ", response.code
        elif line == "Лиза выключи лампу кухне\n":
                print line
                response = urllib2.urlopen('http://192.168.12.21/sec/?pt=28&cmd=28:0')
                print "Ответ контроллера: ", response.code
        else:
                print line
                time.sleep(0.15)
        if(retcode is not None):
                break
Закончил только что (6:00), тестировал шепотом вблизи с девайсом. Пока все в норме - лучше чем ожидал!

Alex_Jet
Сообщения: 897
Зарегистрирован: 12 янв 2014, 18:00
Откуда: Россия, г.Томск

Re: Распознавание CMU Sphinx требуется помощь

Сообщение Alex_Jet » 23 янв 2018, 07:36

В общем провел 3 ночи в поисках решения - чтобы помощник слушал только после произнесения кодовой фразы. Сам скрипт на python немного модернизировал - сделал сэмплы ответов и добавил в скрипте их проигрывание. Как промежуточный результат выкладываю ВИДЕО примера работы скрипта по распознаванию голосовых команд и их выполнению
Итог на данный момент - распознавание на основе грамматических правил (словарь rus_gram) проходит ОЧЕНЬ ХОРОШО, но!!! Если, например, сказать нужную фразу "Лиза включи свет в большом коридоре" и эфимерную "Раз два три четрые пять, вышел зайчик погулять", будет следующее:

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

Лиза включи свет в большом коридоре
Лиза ты здесь везде
То есть любые иные фразы/шум от телевизора и т.д., не попадающие под правила грамматического словаря, непременно превращаются в комбинацию фраз этого словаря, начинающихся с "Лиза..." даже если это слово не было сказано (позже добавлю в пост что распозналось во время просмотра фильма Форсаж 8). Причем, pocketsphinx_continuous дослушает "Раз два три четыре пять..." до самого конца и только потом интерпретирует в какую-либо комбинацию подпадающую под правила грамматики!
Пробовал для pocketsphinx_continuous применять различные ключи, например -keyphrase 'Лиза' - никакого эффекта нет. Пробовал сделать статистический словарь (-kws rus_list) без грамматики (везде пишут, что -jsgf и -kws конфликтуют между собой) - вообще ерунда получается, либо надо обучать Sphinx. То ли я не верно интерпретирую документацию на английском языке, в котором встречаются узкие технические термины, то ли что-то еще.
На текущий момент идея следующая - в аналоге сделать:
1. Чтобы из сигнала основного направленного микрофона вычитался сигнал ненаправленного/фонового микрофона (или сигнал непосредственно от ТВ, например)
2. Регулируемое пороговое включение микрофона - если уровень S/N приемлем, то микрофон аппаратно включаем, если нет выключаем.
Либо, как вариант, попробовать настроить ALSA таким образом чтобы из сигнала микрофона вычитался сигнал имеющийся на линейном входе OPi Zero (к нему можно подключить как аналоговый выход ТВ, так и предусилитель фонового микрофона).

Еще интересная особенность, правда корреляция до конца не выявлена, при запуске pocketsphinx_continuous он ничего не воспринимает пока я не скажу кодовое слово "Лиза". Потом начинает слушать все подряд и из шума делает не верные умозаключения:). Поэтому как вариант попробовать в скрипте на Python после удачно распознанной фразы выключать pocketsphinx_continuous и включать снова.
По python - что-то трудно мне дается. Слишком сильно отличается от C/PHP и JS... надо бы сделать скрипт на php, однако пишут что он не для бесконечных скриптов.
Последний раз редактировалось Alex_Jet 24 янв 2018, 06:36, всего редактировалось 2 раза.

alex946
Сообщения: 162
Зарегистрирован: 05 дек 2015, 22:48
Контактная информация:

Re: Распознавание CMU Sphinx требуется помощь

Сообщение alex946 » 23 янв 2018, 10:12

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

Alex_Jet
Сообщения: 897
Зарегистрирован: 12 янв 2014, 18:00
Откуда: Россия, г.Томск

Re: Распознавание CMU Sphinx требуется помощь

Сообщение Alex_Jet » 23 янв 2018, 10:37

Если бы я был гуру php, то наверное уже бы сделал скрипт. А так - надо разбираться, пока на это времени нет. Интересно Андрею эта тема вообще интересна? Поскольку php он знает отлично!

saveug
Сообщения: 6
Зарегистрирован: 14 ноя 2017, 13:39

Re: Распознавание CMU Sphinx требуется помощь

Сообщение saveug » 23 янв 2018, 16:00

Я бы с удовольствием подключился к процессу, есть где исходники и текущие наработки взять? Есть опыт и Python и PHP, но ихмо рано сейчас менять технологию, скорее всего можно побороть и на питоне описанную проблему.


Alex_Jet
Сообщения: 897
Зарегистрирован: 12 янв 2014, 18:00
Откуда: Россия, г.Томск

Re: Распознавание CMU Sphinx требуется помощь

Сообщение Alex_Jet » 24 янв 2018, 05:45

saveug писал(а):
23 янв 2018, 16:00
Я бы с удовольствием подключился к процессу, есть где исходники и текущие наработки взять? Есть опыт и Python и PHP, но ихмо рано сейчас менять технологию, скорее всего можно побороть и на питоне описанную проблему.
На самом деле делайте все ровно так, как приведено в статье выше https://www.ab-log.ru/forum/viewtopic.p ... 007#p30803 (полностью по приведенным командам)! То есть - проверяйте микрофон, устанавливайте SphinxBase и PocketSphinx, скачивайте русскую акустическую модель - zero_ru_cont_8k_v3 (HMM) и далее можете использовать мой словарь и грамматику (см.ниже) для первого запуска pocketsphinx_continuous. Для этого используйте следующие ключи с аргументами:

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

pocketsphinx_continuous -adcdev plughw:0,0 -hmm /root/zero_ru_cont_8k_v3/zero_ru.cd_semi_4000/ -jsgf /root/rus_gram -dict /root/rus_dict  -inmic yes
Тут не "запрещено" логгирование, поэтому в случае каких-либо проблем все отобразиться. Если ошибок не будет, то можно запускать pocketsphinx_continuous с ключом -logfn /dev/null
Ну а далее можно создать и запустить recognizer.py (см.мой последний код ниже), правда сэмплы wav я не смог сейчас выложить, но их пока можно закомментировать.
alex946 писал(а):
23 янв 2018, 16:25
https://stackoverflow.com/questions/257 ... cketsphinx
говорят, помогает...
Вот если честно - вижу, что это что-то нужное, но в python не силен и просто не понимаю откуда что берется... Я бы написал с нуля на php или js, но мне нужно суть понять!

Словарь - rus_dict:

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

Лиза l y z ay
вбольшомкоридоре v b ay ll sh ay m k a rr ii d ay rr i
вгардеробной v g ay r dd i r oo b n ay j
вгостевой v g ay ss tt i v oo j
везде vv i z dd je
вкладовке f k l aa d ay f kk i
включи f k ll uj ch ii
вкотельной f k oo tt i ll n ay j
вкухне f k u h nn i
вмаломкоридоре v m aa l ay m k ay rr i d ay rr i
впрачечной f p r aa ch i ch n ay j
вприхожей f p rr i h ay zh y j
всанузле f s ay n u z ll je
выключи v yy k ll uj ch i
здесь z dd je ss
лампу l aa m p u
наверанде n ay vv i r aa n dd i
накрыльце n a k r yy ll c y
питание pp i t aa nn i i
погаси p ay g a ss ii
розетку r a zz je t k u
свет s vv je t
тут t uu t
ты t yy
Грамматика - rus_gram:

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

#JSGF V1.0;
grammar PI;
public <cmd> = Лиза ( <action> ) ( <object> ) [ <place> ];
<action> = ты | включи | погаси;
<object> = здесь | свет | лампу | розетку | питание;
<place> = везде | вгостевой | вкухне | вмаломкоридоре | всанузле | вкладовке | вбольшомкоридоре | вприхожей | вкотельной | впрачечной | вгардеробной | накрыльце | наверанде;
Скрипт для он-лайн распознавания и выполнения команд - recognizer.py:

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

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#project: smart-home
import subprocess
import time
import urllib2

exe = '''pocketsphinx_continuous -adcdev plughw:0,0 -hmm /root/zero_ru_cont_8k_v3/zero_ru.cd_semi_4000/ -jsgf /root/rus_gram -dict /root/rus_dict  -inmic ye$
p = subprocess.Popen(["%s" % exe], shell=True, stdout=subprocess.PIPE)

while True:
        retcode = p.returncode
        line = p.stdout.readline()

#---------------------Лиза----------------------
        if line == "Лиза ты здесь\n":
                print line
                subprocess.call('aplay message/i_am_listening.wav', shell=True)

#---------------------Свет----------------------
        elif line == "Лиза включи свет\n":
                print line
                subprocess.call('aplay message/where_on_light.wav', shell=True)
        elif line == "Лиза погаси свет\n":
                print line
                subprocess.call('aplay message/where_off_light.wav', shell=True)
        elif line == "Лиза погаси свет везде\n":
                print line
                response = urllib2.urlopen('http://192.168.12.21/sec/?cmd=a:0')
                print "Ответ контроллера:", response.read()
                subprocess.call('aplay message/done.wav', shell=True)
        elif line == "Лиза включи свет вгостевой\n":
                print line
                response = urllib2.urlopen('http://192.168.12.21/sec/?cmd=27:1')
                print "Ответ контроллера:", response.read()
                subprocess.call('aplay message/done.wav', shell=True)
        elif line == "Лиза включи свет вгостевой\n":
                print line
                response = urllib2.urlopen('http://192.168.12.21/sec/?cmd=27:1')
                print "Ответ контроллера:", response.read()
                subprocess.call('aplay message/done.wav', shell=True)
        elif line == "Лиза погаси свет вгостевой\n":
                print line
                response = urllib2.urlopen('http://192.168.12.21/sec/?cmd=27:0')
                print "Ответ контроллера:", response.read()
                subprocess.call('aplay message/done.wav', shell=True)
        elif line == "Лиза включи свет вкухне\n":
                print line
                response = urllib2.urlopen('http://192.168.12.21/sec/?cmd=28:1')
                print "Ответ контроллера:", response.read()
                subprocess.call('aplay message/done.wav', shell=True)
        elif line == "Лиза погаси свет вкухне\n":
                print line
                response = urllib2.urlopen('http://192.168.12.21/sec/?cmd=28:0')
                print "Ответ контроллера:", response.read()
                subprocess.call('aplay message/done.wav', shell=True)
        elif line == "Лиза включи свет вбольшом коридоре\n":
                print line
                response = urllib2.urlopen('http://192.168.12.21/sec/?cmd=26:1')
                print "Ответ контроллера:", response.read()
        elif line == "Лиза погаси свет вбольшомкоридоре\n":
                print line
                response = urllib2.urlopen('http://192.168.12.21/sec/?cmd=26:0')
                print "Ответ контроллера:", response.read()
                subprocess.call('aplay message/done.wav', shell=True)

#---------------------Розетки-------------------
        elif line == "Лиза включи розетку\n":
                print line
                subprocess.call('aplay message/where_on_plug.wav', shell=True)
        elif line == "Лиза погаси розетку\n":
                print line
                subprocess.call('aplay message/where_off_plug.wav', shell=True)
        elif line == "Лиза погаси питание везде\n":
                print line
                response = urllib2.urlopen('http://192.168.12.21/sec/?cmd=a:0')
                print "Ответ контроллера:", response.read()
                subprocess.call('aplay message/done.wav', shell=True)

#---------------------Else----------------------
        else:
                print line
                time.sleep(0.15)
        if(retcode is not None):
                break

lanket
Сообщения: 1
Зарегистрирован: 08 май 2018, 12:23

Re: Распознавание CMU Sphinx требуется помощь

Сообщение lanket » 08 май 2018, 16:26

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

Реагирование на ключевое слово сделано на snowboy.
Распознование речи и синтез речи на выбор Google, Yandex, Wit... На выбор.

Процесс установки. Проще некуда :
[spoiler]
  1. Берем апельсинку zero.
  2. Запускаем скрипт автоматической установки нужных приложений и скриптов от DevOff
  3. Прописываем ip мажордомо, записываем любое свое ключевое слово.
  4. Перезапускаем 2 демона на новом терминале.
  5. Добавляем терминал с галочкой "MajorDroid API" и может проигрывать медиа-контент MPD порт 6600
  6. Радуемся голосовым асситентом, с любым ключевым словом на ваше усмотрение, диалоги работают. Можно пользоваться ТТС от яндекса Алиса с эмоциями.
[/spoiler]

Теперь о реалиях:
Не все так радужно.

[spoiler]
  • Есть одна проблемка, почемуто у апельсинки зеро засыпает вафля со временем. причем закономерность не поймана. Кто зает как побороть?
  • Работают 2 демона, это 2 питоновских скрипта. Один отвечает за реагирование на ключевое слово, другой на реагирование на запросы по сокетам от мажордомо. Соответственно если вы позвали Алису и она откликнулась, в любое время может прорваться какое либо сообщение от мажордомо например кукушка или уведомление о чем либо. Например Вы: "Алиса" Она: "Слушаюсь 20 господин часов" Причем это одновременно а не поочериди слова. тобиш их надо либо объединить в один скрипт который будет организовывать очередь или как то поставить эти скрипты в очередь.
  • На гитхабе есть планы по доработке, кто может помочь будем рады та как питоноводы из нас не очень.
  • Начал разработку модуля для настроек терминала из админки мажордомо. помощь приветствуется.
[/spoiler]

Прошу помощи в развитии нашего, на мой взгляд интересного проекта, в питоне не сильны.

Отправлено с моего Redmi Note 4 через Tapatalk


drhellp
Сообщения: 7
Зарегистрирован: 03 сен 2018, 15:54

Re: Распознавание CMU Sphinx требуется помощь

Сообщение drhellp » 03 сен 2018, 18:34

Alex_Jet писал(а):
24 янв 2018, 05:45
Я вот такой скрипт использую на php

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

<?php

/**
 * Конфигурация
 * ip - адрес сервера
 * homedir - корневая директория скриптов
 * hmm - акустическая модель
 * gram - файл грамматики
 * dict - словарь
 * command - файл с командами
 */
$ip = '192.168.0.10';
$homedir = "/home/voice/";
$hmm = "zero_ru.cd_cont_4000";
$gram = "rus_gram";
$dict = "rus_dict";
$command = "command.txt";

/**
 * Чтение команд из файла в массивы
 * данные разделяются |
 * arrline - строка для сравнения
 * arrvoice - голосовое подтверждение
 * arrcmd - команда для выполнения
 */

/* Разделитель строки символ | */
$delimeter = "|";

$lines = file($homedir . $command);

foreach ($lines as $line_num => $line) {
    $line = trim($line); // удаляем спец символы в конце строки
    $line = explode($delimeter, $line); // разрезаем строку
    $arrline[] = $line[0];
    $arrvoice[] = $line[1];
    $arrcmd[] = $line[2];
}

/* Комманда запуска */
$cmd = "pocketsphinx_continuous -hmm " . $homedir . $hmm . " -jsgf " . $homedir . $gram . " -dict " . $homedir . $dict . " -inmic yes";// -logfn /dev/null" включить после отладки;

while (@ ob_end_flush());

$proc = popen($cmd, 'r');

while (!feof($proc))
{
    $string = trim(fread($proc, 4096)); // читаем строку и удаляем спец символы в конце

    /**
     * Поиск строки для сравнения в массиве
     */
    $key = array_search($string, $arrline);
    // Проверяем полученный ключ
    if (is_integer($key)) {
        // Проверяем нужно ли выводить голосовое сообщение
        if (mb_strlen($arrvoice[$key]) > 0) {
            exec('echo "' . $arrvoice[$key] . '" | RHVoice-test -p elena');
        }

        // Проверяем нужно ли выполнять команду
        if (mb_strlen($arrcmd[$key]) > 0) {
            $curl = urlencode($arrcmd[$key]);
            $ch = curl_init();
            // GET запрос указывается в строке URL
            curl_setopt($ch, CURLOPT_URL, 'http://'. $ip . '/command.php?qry=' . $curl);
            curl_setopt($ch, CURLOPT_HEADER, false);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
            curl_setopt($ch, CURLOPT_USERAGENT, 'PHP VoiceMJD');
            $data = curl_exec($ch);
            curl_close($ch);
        }

        /* Можно добавить запись распознанных команд в файл журнала */
    }

    @ flush();
}

?>

Файл command.txt такого вида:

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

Степановна ты здесь|Да я здесь|команда 1
Степановна включи свет|Включаю свет|команда 2
Степановна погаси свет|Выключаю свет|команда 3

Alex_Jet
Сообщения: 897
Зарегистрирован: 12 янв 2014, 18:00
Откуда: Россия, г.Томск

Re: Распознавание CMU Sphinx требуется помощь

Сообщение Alex_Jet » 04 сен 2018, 08:41

drhellp писал(а):
03 сен 2018, 18:34
Я вот такой скрипт использую на php
Давно не занимался этой темой. Хорошо, что опубликовали скрипт на php:)
Как хорошо все работает?
На чем?
Как грузит процессор и ОЗУ?
Какой микрофон? Интересует особенно аппаратная часть, шумоподавление (железное или софтовое)?
Какая задержка при распознавании? Увеличивается ли задержка при долго включенном ассистенте?

Как реагирует на шумы с улицы? Много ли ложных срабатываний? Особенно при большом словаре.

Скрипт похож на тот, что я опубликовал на phyton - то есть ключевой фразы не используется. Используется только возможный набор слов (попробуйте сказать "Степановна ты здесь" и, например, "Включи свет Степановна" - вероятно распознавание команды будет, но с иным порядком слов).
В }{акере была статья - там принцип такой - в первую очередь распознаем ключевую фразу, если она точно распознана, то переключаемся на распознавание возможных команд. С pocketsphinx_continuous это сделать проблематично, поскольку процесс загрузки pocketsphinx_continuous у меня был долгим (5-20 секунд), причем с течением времени почему-то увеличивался.

drhellp
Сообщения: 7
Зарегистрирован: 03 сен 2018, 15:54

Re: Распознавание CMU Sphinx требуется помощь

Сообщение drhellp » 04 сен 2018, 12:09

Alex_Jet спасибо за питоновский скрипт :) на его основе я и слепил.
У меня все пока тестируется на рабочем компе, микрофон от гарнитуры.
Processor 2x Intel(R) Core(TM)2 Duo CPU E7500 @ 2.93GHz
Memory 8194MB (3174MB used)
Operating System Debian GNU/Linux 8.10
Ложные срабатывания бывают.
попробуйте сказать "Степановна ты здесь" и, например, "Включи свет Степановна"
Надо попробовать, наверно будет ложное срабатывание.
Вообще файл грамматики как-то плохо работает или надо попробовать в словаре написать "Степановнатыздесь" одним словом.
Попробую отпишусь.
Последний раз редактировалось drhellp 04 сен 2018, 13:28, всего редактировалось 2 раза.

Ответить