Menu

Pocketsphinx help

Help
Вадим
2011-12-28
2012-09-22
  • Вадим

    Вадим - 2011-12-28

    Здравствуйте Николай,
    Хотел спросить про pocketsphinx_continuous - например мне нужно, чтобы
    программа проверяла входящий звук на "da" и "net" - я сделал словарь из двух
    слов да и нет, сделал языковую модель из такого текста:

    <s> da </s>
    <s> net </s>
    

    распознается замечательно и "да" и "нет"
    но вот такой вопрос - когда я говорю другие слова, которые на да и нет совсем
    не похожи - например "кукушка" - он пишет:

    INFO: cmn_prior.c(121): cmn_prior_update: from < 12.33 -0.29 -0.24 -0.06 -0.40 -
    0.07 -0.26 -0.25 -0.10 -0.19 -0.16 -0.15 -0.18 >
    INFO: cmn_prior.c(139): cmn_prior_update: to   < 12.38 -0.31 -0.26 -0.06 -0.41 -
    0.08 -0.26 -0.23 -0.12 -0.19 -0.15 -0.16 -0.16 >
    INFO: ngram_search_fwdtree.c(1549):      319 words recognized (4/fr)
    INFO: ngram_search_fwdtree.c(1551):     3683 senones evaluated (43/fr)
    INFO: ngram_search_fwdtree.c(1553):     3323 channels searched (39/fr), 162 1st,
     3083 last
    INFO: ngram_search_fwdtree.c(1557):      382 words for which last channels evalu
    ated (4/fr)
    INFO: ngram_search_fwdtree.c(1560):      130 candidate words for entering last p
    hone (1/fr)
    INFO: ngram_search_fwdtree.c(1562): fwdtree 0.02 CPU 0.018 xRT
    INFO: ngram_search_fwdtree.c(1565): fwdtree 1.72 wall 2.027 xRT
    INFO: ngram_search_fwdflat.c(305): Utterance vocabulary contains 4 words
    INFO: ngram_search_fwdflat.c(940):      268 words recognized (3/fr)
    INFO: ngram_search_fwdflat.c(942):     4096 senones evaluated (48/fr)
    INFO: ngram_search_fwdflat.c(944):     3797 channels searched (44/fr)
    INFO: ngram_search_fwdflat.c(946):      457 words searched (5/fr)
    INFO: ngram_search_fwdflat.c(948):      227 word transitions (2/fr)
    INFO: ngram_search_fwdflat.c(951): fwdflat 0.02 CPU 0.018 xRT
    INFO: ngram_search_fwdflat.c(954): fwdflat 0.02 wall 0.018 xRT
    INFO: ngram_search.c(1258): lattice start node <s>.0 end node </s>.76
    INFO: ngram_search.c(1286): Eliminated 0 nodes before end node
    INFO: ngram_search.c(1391): Lattice has 30 nodes, 30 links
    INFO: ps_lattice.c(1365): Normalizer P(O) = alpha(</s>:76:83) = -162664
    INFO: ps_lattice.c(1403): Joint P(O,S) = -168251 P(S|O) = -5587
    INFO: ngram_search.c(880): bestpath 0.00 CPU 0.000 xRT
    INFO: ngram_search.c(883): bestpath 0.00 wall 0.002 xRT
    INFO: pocketsphinx.c(841): 000000001: net net da (-2906)
    INFO:   word                 start end   pprob ascr       lscr       lback
    INFO: ngram_search.c(1035): bestpath 0.00 CPU 0.000 xRT
    INFO: ngram_search.c(1038): bestpath 0.00 wall 0.000 xRT
    INFO:   <s>                  0     16    1.000 -444416    0          1
    INFO:   net                  17    35    0.643 -408576    -30        2
    INFO:   net                  36    60    1.000 -769024    -151       1
    INFO:   da                   61    75    0.901 -631808    -118       1
    INFO:   </s>                 76    83    1.000 -631808    -30        2
    INFO: ngram_search.c(880): bestpath 0.00 CPU 0.000 xRT
    INFO: ngram_search.c(883): bestpath 0.00 wall 0.000 xRT
    000000001: net net da
    

    как сделать так чтобы он не распознавал слова "да" и "нет" в словах, которые
    не являются такими?
    насколько я понял, записанный звук разбивается на кусочки, адекватно
    акустической модели, тоесть у меня модель построена так, что он ожидает
    услышать подряд только "да" "нет", а разбивая каждый кусочек он каждый кусочек
    распознает - с определенной вероятностью.. но например здесь второе слово
    "нет" распозналось с вероятностью 1.0000 - и как тогда определить, сказал
    человек "нет"? поидее по вероятности, но тут единица - а человек сказал
    "кукушка"..
    прошу подсказать в каком направлении двигаться..
    p.s. документации хорошей с примерами не нашел - только это http://www.digipe
    dia.pl/man/doc/view/pocketsphinx_continuous.1/
    но тут не понятно что именно имеется в
    виду, но я увидел -fsg
    state grammar и -fsgctlfn
    finite state grammar control file - это случайно не .gram файлы как в sphinx4?
    просто вроде бы это могло быть решением, он бы ожидал услышать только одно
    слово <da> | <net> - какое то одно из них.</net></da>

     
  • Вадим

    Вадим - 2011-12-28

    *акустическую модель использую msu_ru_nsh.cd_cont_1000_8gau_16000 с voxforge.org
    запускаю так:

    pocketsphinx_continuous.exe -hmm msu_ru_nsh.cd_cont_1000_8gau_16000 -lm my.lm.DMP -dict my.dic -backtrace yes
    
     
  • Вадим

    Вадим - 2011-12-28

    мм, я добился некоторых успехов:
    использовал параметр -jsgf my.gram - грамматику ( da | net ) - которая
    существенно улучшает распознаваемость - теперь если говорю слова, которые не
    похожы и не содержат в себе фонемы слов да и нет - они просто не распознаются,
    как и надо) но все равно остаются слова, которые включают в себя слова нет и
    да - при этом распознанные нет и да часто с вероятностью 1.0000 (помидор -
    "да" 1.00000 pprob) :) но спасибо большое, я попробую воспользоваться советом
    и пройдя по ссылке решил создать небольшую акустическую модель для да и нет, и
    отпишусь что получится

     
  • Вадим

    Вадим - 2011-12-29

    вроде создание акустической модели это мощный шаг к улучшению распознавания..

     
  • Вадим

    Вадим - 2011-12-29

    хотя нет..он побольше ошибается между да и нет, хотя распознает null когда
    чтото звучит, не содержащее в себе звуки "aa" и "je" (да dd aa, нет nn je t) -
    как и нужно;
    но к примеру "кукушка" и "кукуруза" распознает как "да" - со 100%
    уверенностью.. можно как нибудь понижать его уверенность, если он вытаскивает
    фонемы, принадлежащие "да" и "нет" прямо из середины сказанного - просто
    поидее 100% уверенность в "да" в реальности - это ведь когда между паузами
    прозвучало dd aa (по моему словарю это "да"), а он видимо уверенность как то
    по другому считает? моя грамматика .jsgf

    #JSGF V1.0;
    
    grammar rbot;
    
    public <greet> = <pass1> | <pass2>;
    <pass1> = ( da );
    <pass2> = ( net );
    

    правильно ведь, что из записанного отрывка он берет кусочек между паузами,
    переводит в фонемы (которые он знает по акустической модели), а дальше в
    строке полученных фонем ищет конкретно строки "dd aa" или
    "nn je t", и потом записывает какуюто вероятность (например услышанное ae aa
    tt - это "да" с 50% уверенностью)?

    и если можно, подскажите как выводить результат всей записанной дорожки от
    одной паузы до конечной в фонемах?

    извиняюсь за много вопросов.

     
  • Nickolay V. Shmyrev

    но к примеру "кукушка" и "кукуруза" распознает как "да" - со 100%
    уверенностью.. можно как нибудь понижать его уверенность, если он вытаскивает
    фонемы, принадлежащие "да" и "нет" прямо из середины сказанного - просто
    поидее 100% уверенность в "да" в реальности - это ведь когда между паузами
    прозвучало dd aa (по моему словарю это "да"), а он видимо уверенность как то
    по другому считает? моя грамматика .jsgf

    Возможно, текст FAQ нужно прочитать внимательнее. Мне кажется, Вы его не
    поняли.

    и если можно, подскажите как выводить результат всей записанной дорожки от
    одной паузы до конечной в фонемах?

    Это невозможно

     

Log in to post a comment.