python语音唤醒-pocketsphinx
原标题:python语音唤醒-pocketsphinx
原文来自:51CTO 原文链接:http://aix.51cto.com/blog/60226.html
使用pocketsphinx模块,实现唤醒词功能。
win10 + Python3.6.2
地址:https://pypi.org/project/pocketsphinx/
> pip install pocketsphinx C:Usersqpf10>pip install pocketsphinx Collecting pocketsphinx Downloading https://files.pythonhosted.org/packages/52/53/30b12c3e4de918e32e73e9d635b4c9e1765512acc94ad0b51bfe960b54c9/pocketsphinx-0.1.15-cp36-cp36m-win_amd64.whl (29.1MB) 100% |████████████████████████████████| 29.1MB 104kB/s Installing collected packages: pocketsphinx Successfully installed pocketsphinx-0.1.15
Pocketsphinx是CMU Sphinx语音识别开源工具包的一部分。
这个包为使用SWIG和Setuptools创建的CMU Sphinxbase和Pocketsphinx库提供了一个python接口。
原文:It's an iterator class for continuous recognition or keyword search from a microphone.
有道翻译:它是一个迭代器类,用于从麦克风连续识别或关键字搜索。
在pycharm中运行代码,完美运行。
import os from pocketsphinx import LiveSpeech, get_model_path model_path = get_model_path() speech = 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, 'en-us.lm.bin'), dic=os.path.join(model_path, 'cmudict-en-us.dict') ) for phrase in speech: print("phrase:", phrase) print(phrase.segments(detailed=True))
运行后,我说了两句(发音不标准),一句hello,一句hello word,显示结果:感觉识别的很有问题。。。虽说不标准,但是不至于这个情况。
Allocating 32 buffers of 2500 samples each phrase: i'm [('<s>', -7, 37837, 37890), ('<sil>', -6, 37891, 38010), ("i'm(2)", -913, 38011, 38064), ('[SPEECH]', -6069, 38065, 38070), ('</s>', 0, 38071, 38078)] phrase: hello or earth [('<s>', -5, 186767, 186778), ('hello', -9386, 186779, 186834), ('or', -3672, 186835, 186854), ('earth', -1192, 186855, 186904), ('</s>', 0, 186905, 186907)]
添加中文语言模型和中文声学模型
中文相关文件下载地址:
https://sourceforge.net/projects/cmusphinx/files/Acoustic%20and%20Language%20Models/Mandarin/
声学模型:zh_broadcastnews_16k_ptm256_8000.tar.bz2
语言模型:zh_broadcastnews_64000_utf8.DMP
拼音字典:zh_broadcastnews_utf8.dic
拷贝到model文件夹下:
将文件放到PHTHON_HOME的pocketsphinx模块包下,我这里是在C:Python36Libsite-packagespocketsphinxmodel
放代码:没有变化,只是加载的目录文件变了。
import os from pocketsphinx import LiveSpeech, get_model_path model_path = get_model_path() speech = LiveSpeech( verbose=False, sampling_rate=16000, buffer_size=2048, no_search=False, full_utt=False, hmm=os.path.join(model_path, 'zh/zh_broadcastnews_16k_ptm256_8000'), lm=os.path.join(model_path, 'zh/zh_broadcastnews_64000_utf8.DMP'), dic=os.path.join(model_path, 'zh/zh_broadcastnews_utf8.dic') ) for phrase in speech: print("phrase:", phrase) print(phrase.segments(detailed=True))
运行后的结果,还是非常的不准确。虽说带点东北口音,但是识别的还是挺差的。。。说的,你好,你好吗,滚。还说了挺多其他的,都没有很好的效果,就不贴了。
运行后,半天才反应过来开始识别,不知道是什么原因,刚开始我还以为是程序监听不到语音呢。
Allocating 32 buffers of 2500 samples each phrase: 尼 尔 奥 [('<s>', 2, 2645708, 2645714), ('尼', -357, 2645715, 2645771), ('尔(2)', -2, 2645772, 2645811), ('奥', -42088, 2645812, 2645853), ('</s>', 0, 2645854, 2645857)] phrase: 尼 尔 欧盟 [('<s>', -2, 2828757, 2828765), ('尼', -11911, 2828766, 2828782), ('尔(2)', -2519, 2828783, 2828837), ('欧盟', 0, 2828838, 2828868), ('</s>', 0, 2828869, 2828872)] phrase: 不同 [('<s>', 1, 3023056, 3023061), ('不同', -18424, 3023062, 3023128), ('</s>', 0, 3023129, 3023133)] 还会出现如下这种空的情况- -!: phrase: [('<s>', -4, 6295811, 6295819), ('++incomplete++', 0, 6295820, 6295973), ('</s>', 0, 6295974, 6296015)]
这里有个前提:我只把pocketsphinx当做唤醒词来使用。
具体操作步骤
编辑一个自定义的keyword.txt文本,里面写入打算唤醒的中文词语,和发音可能混淆的词(如果拼音相同只记录一个就行)。再添加一些其他的乱七八糟的词,这样匹配的时候就不会一直匹配唤醒词了。(唤醒词的重点)
以小贝为例,则keyword.txt中的内容如下: 小贝 小魏 巧倍 啊 呵呵 哈哈 么么哒
在[http://www.speech.cs.cmu.edu/tools/lmtool-new.html] 上面训练上一步的keyword文本。会生成“随机数.lm”和“随机数.dic”,下载这两个文件就可以。用来替代语言模型和拼音字典。
如: 1234.lm 1234.dic
编辑下载的随机数.dic文件,对照着zh_broadcastnews_utf8.dic的拼音字典,更改成与其同样格式的内容。原字典中不一定会有相同的词语,有的话,就按照原先的写,没有的话,就按照单个发音的写上就可以。
例如: 小贝 x i ao b ei 小魏 x i ao w ei 巧倍 q i ao b ei 啊 a as . . .
在代码中,替换掉对应的lm和dic路径。
import os from pocketsphinx import LiveSpeech, get_model_path model_path = get_model_path() speech = LiveSpeech( verbose=False, sampling_rate=16000, buffer_size=2048, no_search=False, full_utt=False, hmm=os.path.join(model_path, 'zh/zh_broadcastnews_16k_ptm256_8000'), lm=os.path.join(model_path, 'zh/1234.lm'), # 这个目录位置自己设置 dic=os.path.join(model_path, 'zh/1234.dic') # 同上 ) for phrase in speech: print("phrase:", phrase) print(phrase.segments(detailed=True)) # 只要命中上述关键词的内容,都算对 if str(phrase) in ["小贝", "小魏", "巧倍"]: print("正确识别唤醒词")
免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。
合作及投稿邮箱:E-mail:editor@tusaishared.com
上一篇:caffe学习
热门资源
Python 爬虫(二)...
所谓爬虫就是模拟客户端发送网络请求,获取网络响...
TensorFlow从1到2...
原文第四篇中,我们介绍了官方的入门案例MNIST,功...
TensorFlow从1到2...
“回归”这个词,既是Regression算法的名称,也代表...
机器学习中的熵、...
熵 (entropy) 这一词最初来源于热力学。1948年,克...
TensorFlow2.0(10...
前面的博客中我们说过,在加载数据和预处理数据时...
智能在线
400-630-6780
聆听.建议反馈
E-mail: support@tusaishared.com