python语音唤醒之pocketsphinx库

使用pocketsphinx模块,实现唤醒词功能。

运行环境:

win10 + Python3.6.2
   
   

安装模块包:

地址:https://pypi.org/project/pocketsphinx/


   
   
  1. > pip install pocketsphinx
  2. C:\Users\qpf1 0>pip install pocketsphinx
  3. Collecting pocketsphinx
  4. Downloading https:/ /files.pythonhosted.org/packages /52/ 53/ 30b12c3e4de918e32e73e9d635b4c9e1765512acc94ad0b51bfe960b54c9/pocketsphinx- 0. 1.15-cp36-cp36m-win_amd64.whl ( 29.1MB)
  5. 100% |████████████████████████████████| 29.1MB 104kB/s
  6. Installing collected packages: pocketsphinx
  7. Successfully installed pocketsphinx- 0. 1.15

pypi官方简介:

Pocketsphinx是CMU Sphinx语音识别开源工具包的一部分。
这个包为使用SWIG和Setuptools创建的CMU Sphinxbase和Pocketsphinx库提供了一个python接口。

一、运行官方自带案例-LiveSpeech

原文:It's an iterator class for continuous recognition or keyword search from a microphone.
有道翻译:它是一个迭代器类,用于从麦克风连续识别或关键字搜索。

在pycharm中运行代码,完美运行。


   
   
  1. import os
  2. from pocketsphinx import LiveSpeech, get_model_path
  3. model_path = get_model_path()
  4. speech = LiveSpeech(
  5. verbose= False,
  6. sampling_rate= 16000,
  7. buffer_size= 2048,
  8. no_search= False,
  9. full_utt= False,
  10. hmm=os.path.join(model_path, 'en-us'),
  11. lm=os.path.join(model_path, 'en-us.lm.bin'),
  12. dic=os.path.join(model_path, 'cmudict-en-us.dict')
  13. )
  14. for phrase in speech:
  15. print( "phrase:", phrase)
  16. print(phrase.segments(detailed= True))

运行后,我说了两句(发音不标准),一句hello,一句hello word,显示结果:感觉识别的很有问题。。。虽说不标准,但是不至于这个情况。


   
   
  1. Allocating 32 buffers of 2500 samples each
  2. phrase: i 'm
  3. [( '<s>', -7, 37837, 37890), ('<sil>', -6, 37891, 38010), ("i'm(2)", -913, 38011, 38064), ('[SPEECH]', -6069, 38065, 38070), ('</s>', 0, 38071, 38078)]
  4. phrase: hello or earth
  5. [( '<s>', -5, 186767, 186778), ('hello', -9386, 186779, 186834), ('or', -3672, 186835, 186854), ('earth', -1192, 186855, 186904), ('</s>', 0, 186905, 186907)]

二、运行中文语言模型内容

添加中文语言模型和中文声学模型

放代码:没有变化,只是加载的目录文件变了。


   
   
  1. import os
  2. from pocketsphinx import LiveSpeech, get_model_path
  3. model_path = get_model_path()
  4. speech = LiveSpeech(
  5. verbose= False,
  6. sampling_rate= 16000,
  7. buffer_size= 2048,
  8. no_search= False,
  9. full_utt= False,
  10. hmm=os.path.join(model_path, 'zh/zh_broadcastnews_16k_ptm256_8000'),
  11. lm=os.path.join(model_path, 'zh/zh_broadcastnews_64000_utf8.DMP'),
  12. dic=os.path.join(model_path, 'zh/zh_broadcastnews_utf8.dic')
  13. )
  14. for phrase in speech:
  15. print( "phrase:", phrase)
  16. print(phrase.segments(detailed= True))

运行后的结果,还是非常的不准确。虽说带点东北口音,但是识别的还是挺差的。。。说的,你好,你好吗,滚。还说了挺多其他的,都没有很好的效果,就不贴了。
运行后,半天才反应过来开始识别,不知道是什么原因,刚开始我还以为是程序监听不到语音呢。


   
   
  1. Allocating 32 buffers of 2500 samples each
  2. phrase: 尼 尔 奥
  3. [( '<s>', 2, 2645708, 2645714), ( '尼', -357, 2645715, 2645771), ( '尔(2)', -2, 2645772, 2645811), ( '奥', -42088, 2645812, 2645853), ( '</s>', 0, 2645854, 2645857)]
  4. phrase: 尼 尔 欧盟
  5. [( '<s>', -2, 2828757, 2828765), ( '尼', -11911, 2828766, 2828782), ( '尔(2)', -2519, 2828783, 2828837), ( '欧盟', 0, 2828838, 2828868), ( '</s>', 0, 2828869, 2828872)]
  6. phrase: 不同
  7. [( '<s>', 1, 3023056, 3023061), ( '不同', -18424, 3023062, 3023128), ( '</s>', 0, 3023129, 3023133)]
  8. 还会出现如下这种空的情况- -!:
  9. phrase:
  10. [( '<s>', -4, 6295811, 6295819), ( '++incomplete++', 0, 6295820, 6295973), ( '</s>', 0, 6295974, 6296015)]

三、运行自定义的中文语言模型内容

这里有个前提:我只把pocketsphinx当做唤醒词来使用。

具体操作步骤

  1. 编辑一个自定义的keyword.txt文本,里面写入打算唤醒的中文词语,和发音可能混淆的词(如果拼音相同只记录一个就行)。再添加一些其他的乱七八糟的词,这样匹配的时候就不会一直匹配唤醒词了。(唤醒词的重点)
    
         
         
    1. 以小贝为例,则 keyword .txt中的内容如下:
    2. 小贝
    3. 小魏
    4. 巧倍
    5. 呵呵
    6. 哈哈
    7. 么么哒
  2. 在[http://www.speech.cs.cmu.edu/tools/lmtool-new.html] 上面训练上一步的keyword文本。会生成“随机数.lm”和“随机数.dic”,下载这两个文件就可以。用来替代语言模型和拼音字典。
    
         
         
    1. 如:
    2. 1234 .lm
    3. 1234 .dic
  3. 编辑下载的随机数.dic文件,对照着zh_broadcastnews_utf8.dic的拼音字典,更改成与其同样格式的内容。原字典中不一定会有相同的词语,有的话,就按照原先的写,没有的话,就按照单个发音的写上就可以。
    
         
         
    1. 例如:
    2. 小贝 x i ao b ei
    3. 小魏 x i ao w ei
    4. 巧倍 q i ao b ei
    5. 啊 a as
    6. .
    7. .
    8. .
  4. 在代码中,替换掉对应的lm和dic路径。

   
   
  1. import os
  2. from pocketsphinx import LiveSpeech, get_model_path
  3. model_path = get_model_path()
  4. speech = LiveSpeech(
  5. verbose= False,
  6. sampling_rate= 16000,
  7. buffer_size= 2048,
  8. no_search= False,
  9. full_utt= False,
  10. hmm=os.path.join(model_path, 'zh/zh_broadcastnews_16k_ptm256_8000'),
  11. lm=os.path.join(model_path, 'zh/1234.lm'), # 这个目录位置自己设置
  12. dic=os.path.join(model_path, 'zh/1234.dic') # 同上
  13. )
  14. for phrase in speech:
  15. print( "phrase:", phrase)
  16. print(phrase.segments(detailed= True))
  17. # 只要命中上述关键词的内容,都算对
  18. if str(phrase) in [ "小贝", "小魏", "巧倍"]:
  19. print( "正确识别唤醒词")

转载于:https://blog.51cto.com/feature09/2300352

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值