Как заставить карманный сфинкс распознавать ключевые фразы - PullRequest
1 голос
/ 16 мая 2019

Я попытался сделать простой скрипт для распознавания речи в python, используя библиотеку pocketsphinx. Он должен работать следующим образом: он непрерывно слушает, а когда слышит определенную ключевую фразу, он вводит оператор if.

В Google и единственном примере liveSpeech с ключевой фразой это: Библиотека распознавания голоса Python - Always Listen? . Но у него есть только 1 ключевая фраза.

Мне удалось сделать что-то, что работает, но результаты не очень хорошие. Приведенный ниже код повторяется в цикле for для каждого слова, которое я произношу, более одного раза (он повторяется для каждой гипотезы). И так как он делает это, я не могу делать ключевые фразы с более чем одним словом, что ужасно.

import os
from pocketsphinx import LiveSpeech, get_model_path

model_path = os.path.join(os.getcwd(), 'model')
liveSpeech = LiveSpeech(
    verbose=False,
    sampling_rate=16000,
    buffer_size=2048,
    no_search=False,
    full_utt=False,
    hmm=os.path.join(model_path, 'en-us'),
    lm=os.path.join(model_path, '8415.lm'),
    dic=os.path.join(model_path, '8415.dic'),
)

for phrase in liveSpeech:
    print('---')
    print(phrase.segments(detailed=True))
    liveText = phrase.hypothesis()
    print('conf', phrase.confidence())
    print(phrase.hypothesis())
    print('---')
    if liveText == 'SIRI START MUSIC':
        print('*** MUSIC ***')
    elif liveText == 'SIRI READ INBOX':
        print('*** READ ***')
    elif liveText == 'SIRI WRITE NEW EMAIL':
        print('*** WRITE ***')

Я также опубликую файлы .dic и .lm, которые я сделал для объекта LiveSpeech. .dic

EMAIL   IY M EY L
INBOX   IH N B AA K S
MUSIC   M Y UW Z IH K
NEW N UW
NEW(2)  N Y UW
READ    R EH D
READ(2) R IY D
SIRI    S IH R IY
START   S T AA R T
WRITE   R AY T

и .lm


\1-grams:
-1.0280 </s> -0.3010
-1.0280 <s> -0.2583
-1.5051 EMAIL -0.2583
-1.5051 INBOX -0.2583
-1.5051 MUSIC -0.2583
-1.5051 NEW -0.2872
-1.5051 READ -0.2872
-1.0280 SIRI -0.2583
-1.5051 START -0.2872
-1.5051 WRITE -0.2872

\2-grams:
-0.3010 <s> SIRI 0.0000
-0.3010 EMAIL </s> -0.3010
-0.3010 INBOX </s> -0.3010
-0.3010 MUSIC </s> -0.3010
-0.3010 NEW EMAIL 0.0000
-0.3010 READ INBOX 0.0000
-0.7782 SIRI READ 0.0000
-0.7782 SIRI START 0.0000
-0.7782 SIRI WRITE 0.0000
-0.3010 START MUSIC 0.0000
-0.3010 WRITE NEW 0.0000

\3-grams:
-0.7782 <s> SIRI READ
-0.7782 <s> SIRI START
-0.7782 <s> SIRI WRITE
-0.3010 NEW EMAIL </s>
-0.3010 READ INBOX </s>
-0.3010 SIRI READ INBOX
-0.3010 SIRI START MUSIC
-0.3010 SIRI WRITE NEW
-0.3010 START MUSIC </s>
-0.3010 WRITE NEW EMAIL

те сделаны с http://www.speech.cs.cmu.edu/tools/lmtool-new.html

Я ожидал, что когда я скажу у микрофона "SIRI START MUSIC", чтобы увидеть

*** MUSIC ***

в командной строке. Но я вижу повторяющиеся слова, что-то вроде этого (уверенность, я полагаю, за слово?):

conf 0.37786707159431465
SIRI

conf 0.4968430593575863
START NEW

conf 0.2751470548287679
NEW

conf 1.0
NEW

Пожалуйста, как улучшить мой код, чтобы он работал так, как мне нужно. Спасибо!

1 Ответ

0 голосов
/ 17 мая 2019

вместо

lm=os.path.join(model_path, '8415.lm'),

попробовать

kws=os.path.join(model_path, 'kws.list'),
...