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