【问题标题】:How to make pocketsphinx recognize keyphrases如何让pocketsphinx识别关键词
【发布时间】:2019-10-03 04:16:00
【问题描述】:

我尝试使用pocketsphinx 库在python 中制作一个简单的语音识别脚本。 它应该像这样工作:它不断地听,当它听到某个关键短语时,它会输入 if 语句。

在 google 上,唯一一个带有关键短语的 liveSpeech 示例是:Python Voice Recognition Library - Always Listen?。 但它只有 1 个关键词。

我设法制作了一些可以运行的东西,但结果并不好。下面的代码在 for 循环中对我多次发音的每个单词进行迭代(它对每个假设进行迭代)。而且因为他这样做,我不能用超过 1 个单词来制作关键词,这太可怕了。

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 ***')

我还将发布我为 LiveSpeech 对象制作的 .dic 和 .lm 文件 .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

请,如何改进我的代码以按照我需要的方式工作。 谢谢!

【问题讨论】:

  • 您需要关键字列表而不是 LM。是时候查看教程cmusphinx.github.io/wiki/tutoriallmstackoverflow.com/questions/35230722/…
  • 谢谢尼古拉。所以我制作了一个包含WRITE NEW EMAIL /1e-40/ READ INBOX /1e-20/ START MUSIC /1e-30/ 的 kphs.txt,然后添加了这行代码 decoder.set_kws('keyphrase', kphs_path)。我用这个解码器做什么?我看到它使用过,但在音频文件上不是在 LiveSpeech 对象上。我逐页检查了整个网站的 Python 示例和文档,但没有发现任何可以使用的东西。也许对于更高级的人来说,这 2-3 行代码就足够了,但我需要更大的例子

标签: python speech-recognition pocketsphinx


【解决方案1】:

代替

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

试试

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

【讨论】:

  • 所以我评论了#lm=os.path.join(model_path, '8415.lm'), 并输入了kws=os.path.join(model_path, 'kphs.list'), 程序运行时没有编译错误,但在for phrase in liveSpeech: 中没有触发关键字(尝试没有其他条件只是为了让它工作,但是它没有用)我也尝试在文件中不使用短语而只使用单词,并且我尝试使用默认的 cmudict-en-us.dict 文件而不是 dic=os.path.join(model_path, '8415.dic')。谢谢你的时间。如果你有任何其他想法,请告诉我。
【解决方案2】:

假设当前目录中有一个名为 kws.txt 的文件,内容如下:

siri start music /1e-40/
siri read inbox /1e-40/
siri write new email /1e-40/

此脚本加载到文件中并监控关键短语的实时输入:

from pocketsphinx import LiveSpeech

speech = LiveSpeech(lm=False, kws="./kws.txt")
for phrase in speech:
    print(phrase.segments(detailed=True))

示例输出:

[('siri start music ', -874, 1857, 1984)]
[('siri read inbox ', -1120, 2018, 2157)]
[('siri write new email ', -1364, 2614, 2752)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多