树莓派系列二(语音识别)

树莓派的基本概念和安装系统在系列文章一中介绍了.这篇准备介绍一下语音识别.

一直想研究一下语音识别,用来做家庭物联网的控制入口,未来也许就是这样,讯飞的叮咚音响可以连接京东的物联平台,苹果的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)

识别结果如下:

树莓派系列二(语音识别)_第1张图片


这里使用的是讯飞sdk中的wav文件,所以代码中rate=16000.大家根据自己的音频数据去修改.识别结果完全正确,可见音频文件效果可以的话,百度语音识别接口完全可以用,不需要讯飞sdk.

这里插一下题外的话,因为考虑语音文件效果的问题,自然考虑到了麦克风硬件的优劣,这里又再次提到讯飞,讯飞出了六麦环形阵列的麦克风阵列,链接:http://www.xfyun.cn/services/mic#list_wrap

不得不说,虽然没有使用,但是我相信效果,只是好贵.......不考虑成本的可以试试.


说一下我最后选择的方案,语音识别效果可以的情况下,要考虑唤醒的问题,唤醒方案有很多,上讯飞麦克风阵列的可以用唤醒词,可以增加声音传感器,某宝上也就几块钱,但是声音传感器的阀值是我比较担心的,我并不想语音识别被莫名的声音唤醒,因为这种传感器只能检测声音的有无.大家根据自己的需求去增加特定的传感器去唤醒语音识别就好.对于我来说,考虑到家里有小米网关,插座等大量的小米设备,使用了树莓派nodejs homebridge插件(虚拟出一个HomeKit网关),这样就可以对接到苹果手机的家庭应用,用苹果的siri控制了.当然以后还是想上自己的语音识别的.

先把关系整理一下:

  1. nodejs是一个命令行下的javascript运行环境。
  2. npm是nodejs的插件社区,里面有无数的好东西和不好的东西,因为是不需要审核的。
  3. homebridge是npm社区上的插件之一,可以虚拟出一个HomeKit网关出来,但并不负责任何设备的适配。
  4. 其它设备要想使用homebridge和HomeKit互通,就要写一个homebridge的插件,现在这种插件也有上百个了
  5. 做homebridge-aquara,Aquara是做小米多功能网关的深圳绿米联创的自有品牌,最近出的墙壁开关和空调伴侣都是这个品牌的

最后具体的步骤参见小米bbs

http://bbs.xiaomi.cn/t-13198850


你可能感兴趣的:(树莓派)