树莓派系列二(语音识别)
Posted yue_zhong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树莓派系列二(语音识别)相关的知识,希望对你有一定的参考价值。
树莓派的基本概念和安装系统在系列文章一中介绍了.这篇准备介绍一下语音识别.
一直想研究一下语音识别,用来做家庭物联网的控制入口,未来也许就是这样,讯飞的叮咚音响可以连接京东的物联平台,苹果的homekit平台,华为的平台暂时落后的有点多...
国内语音识别领域,我个人比较欣赏讯飞.识别效果业界领先,这几年百度语音识别也在追赶,这次的研究让我对百度的语音识别效果刮目相看,Google的在国内不用想了...
言归正传
1讯飞语音识别接口.
这次在树莓派上实现语音识别控制家里的设备(插座,灯 等等)的研究,第一反应是找讯飞的解决方案,结果讯飞收回的arm平台开放的sdk,需要申请,有网友放出之前开放出来的sdk库,但是仍然收每天识别次数的限制.反感搞这些事情(申请需要在论坛里贴上研究过程,一个有效评论+1,申请后,三个星期发一次...),转而研究一下百度的语音识别接口.这里贴上网友的链接,里面有早期讯飞开放的sdk下载链接,有兴趣的可以去下载.
http://blog.csdn.net/yanghuan313/article/details/50992909
2百度语音识别接口.
百度语音开放平台号称永久免费,开发需要去注册账号,在平台上创建应用,这里不详细叙述了,平台操作比较简单,可以参考下面的链接(不用下载sdk什么的,这里使用语音识别 REST API ,只需要拿到API KEY、Secret KEY.)
http://www.tuicool.com/articles/z2m6V3v
平台支持android, ios.我们这里使用的是语音识别 REST API接口,也就是http传输识别.
使用python开发,在ubuntu上先尝试一下效果
需要安装pycurl
sudo apt-get install libcurl4-gnutls-dev
pip install pycurl安装好后,下面是python的代码:
#encoding=utf-8
import wave
import urllib, urllib2, pycurl
import base64
import json
## get access token by api key & secret key
def get_token():
apiKey = "*******"
secretKey = "***************"
auth_url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=" + apiKey + "&client_secret=" + secretKey
res = urllib2.urlopen(auth_url)
json_data = res.read()
return json.loads(json_data)['access_token']
def dump_res(buf):
print buf
## post audio to server
def use_cloud(token):
# fp = wave.open('test.pcm', 'rb')
fp = wave.open('cn_word.wav', 'rb')
# fp = wave.open('vad_1.wav', 'rb')
nf = fp.getnframes()
f_len = nf * 2
audio_data = fp.readframes(nf)
#mac addr
cuid = "123456"
srv_url = 'http://vop.baidu.com/server_api' + '?cuid=' + cuid + '&token=' + token
http_header = [
'Content-Type: audio/pcm; rate=16000',
# 'Content-Type: audio/pcm; rate=8000',
'Content-Length: %d' % f_len
]
c = pycurl.Curl()
c.setopt(pycurl.URL, str(srv_url)) #curl doesn't support unicode
#c.setopt(c.RETURNTRANSFER, 1)
c.setopt(c.HTTPHEADER, http_header) #must be list, not dict
c.setopt(c.POST, 1)
c.setopt(c.CONNECTTIMEOUT, 30)
c.setopt(c.TIMEOUT, 30)
c.setopt(c.WRITEFUNCTION, dump_res)
c.setopt(c.POSTFIELDS, audio_data)
c.setopt(c.POSTFIELDSIZE, f_len)
c.perform() #pycurl.perform() has no return val
if __name__ == "__main__":
token = get_token()
use_cloud(token)
识别结果如下:
这里使用的是讯飞sdk中的wav文件,所以代码中rate=16000.大家根据自己的音频数据去修改.识别结果完全正确,可见音频文件效果可以的话,百度语音识别接口完全可以用,不需要讯飞sdk.
这里插一下题外的话,因为考虑语音文件效果的问题,自然考虑到了麦克风硬件的优劣,这里又再次提到讯飞,讯飞出了六麦环形阵列的麦克风阵列,链接:http://www.xfyun.cn/services/mic#list_wrap
不得不说,虽然没有使用,但是我相信效果,只是好贵.......不考虑成本的可以试试.
说一下我最后选择的方案,语音识别效果可以的情况下,要考虑唤醒的问题,唤醒方案有很多,上讯飞麦克风阵列的可以用唤醒词,可以增加声音传感器,某宝上也就几块钱,但是声音传感器的阀值是我比较担心的,我并不想语音识别被莫名的声音唤醒,因为这种传感器只能检测声音的有无.大家根据自己的需求去增加特定的传感器去唤醒语音识别就好.对于我来说,考虑到家里有小米网关,插座等大量的小米设备,使用了树莓派nodejs homebridge插件(虚拟出一个HomeKit网关),这样就可以对接到苹果手机的家庭应用,用苹果的siri控制了.当然以后还是想上自己的语音识别的.
先把关系整理一下:
- nodejs是一个命令行下的javascript运行环境。
- npm是nodejs的插件社区,里面有无数的好东西和不好的东西,因为是不需要审核的。
- homebridge是npm社区上的插件之一,可以虚拟出一个HomeKit网关出来,但并不负责任何设备的适配。
- 其它设备要想使用homebridge和HomeKit互通,就要写一个homebridge的插件,现在这种插件也有上百个了
- 做homebridge-aquara,Aquara是做小米多功能网关的深圳绿米联创的自有品牌,最近出的墙壁开关和空调伴侣都是这个品牌的
最后具体的步骤参见小米bbs
http://bbs.xiaomi.cn/t-13198850
以上是关于树莓派系列二(语音识别)的主要内容,如果未能解决你的问题,请参考以下文章