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

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

一直想研究一下语音识别,用来做家庭物联网的控制入口,未来也许就是这样,讯飞的叮咚音响可以连接京东的物联平台,苹果的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开发,需要安装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控制了.当然以后还是想上自己的语音识别的.

先把关系整理一下:

  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

时间: 2024-08-10 07:27:02

树莓派系列二(语音识别)的相关文章

ASP.NET MVC学习系列(二)-WebAPI请求

继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现数据调用. 继续使用上一文章中的示例,添加一个index.html页面,添加对jquery的引用. 一.无参数Get请求 一般的get请求我们可以使用jquery提供的$.get() 或者$.ajax({type:"get"}) 来实现: 请求的后台Action方法仍为上篇文章中的GetU

highcharts 结合phantomjs纯后台生成图片系列二之php2

上篇文章中介绍了phantomjs的使用场景,方法. 本篇文章详细介绍使用php,highcharts 结合phantomjs纯后台生成图片.包含一步步详细的php代码 一.highcharts 结合phantomjs纯后台生成图片系列的准备: 下载phantomjs解析插件,从highcharts官方下载所需插件. 新建一个工程文件夹phantomjs,所必备的js文件有: highcharts 结合phantomjs纯后台生成图片系列二之php 其中jquery.js为 v1.7.1; hi

iOS开发UINavigation系列二——UINavigationItem

iOS开发UINavigation系列二--UINavigationItem 一.引言 UINavigationItem是导航栏上用于管理导航项的类,在上一篇博客中,我们知道导航栏是通过push与pop的堆栈操作来对item进行管理的,同样,每一个Item自身也有许多属性可供我们进行自定制.这篇博客,主要讨论UINavigationItem的使用方法. UINavigationBar:http://my.oschina.net/u/2340880/blog/527706. 二.来说说UINavi

windows下mongodb基础玩法系列二CURD操作(创建、更新、读取和删除)

windows下mongodb基础玩法系列 windows下mongodb基础玩法系列一介绍与安装 windows下mongodb基础玩法系列二CURD操作(创建.更新.读取和删除) 简单说几句 在mongodb中3元素:db(数据库).collection(集合).document(文档) 其中collection类似于数据库中的表,document类似于行,这样一来我们就将内容对比起来记忆学习了. 数据格式 MongoDB documents是BSON格式(一种类json的一种二进制形式的存

原始套接字基础(原始套接字系列二)

在进入Raw Socket多种强大的应用之前,我们先讲解怎样建立一个Raw Socket及怎样用建立的Raw Socket发送和接收IP包. 建立Raw Socket 在Windows平台上,为了使用Raw Socket,需先初始化WINSOCK: // 启动 WinsockWSAData wsaData;if (WSAStartup(MAKEWORD(2, 1), &wsaData) != 0){ cerr << "Failed to find Winsock 2.1 or

C# 玩转计算机系列(二)-操作IIS服务

之前由于工作需要自己做一个一键部署的小工具,实现三个模块的功能:TFS操作创建映射并获取最新源代码:SQL Server数据库注册表配置数据库连接:IIS站点部署,生成可访问的IIS站点.由于是基于自己的工作环境下的开发,所以在TFS和SQL Server配置工具化实现,有一些点是默认按照公司的环境配置参数默认的,虽然不是广泛适用每一种情况的环境部署,但是在学习这三个模块的开发过程中,还是有很多东西是可以值得分享的. 今天先分享一下,如何通过工具化实现IIS站点部署和配置,为了可复用性,IIS操

Exchange Server 2013系列二:服务器角色

杜飞 在上一篇文章中,我们提到现在硬件性能的增加以及成本的下降,硬件已经不再成为软件应用的约束因素,特别是CPU,其 计算能力的成本显著降低.Exchange 2013 的主要设计目标是简化缩放.提高硬件利用率和实现故障隔离.Exchange 2013一开始将服务器角色的数目减少到了两个:客户端访问服务器角色和邮箱服务器角色,当然,升级到SP1之后也包含边缘服务器角色或者是边界网络中安装 Exchange 2007 或 Exchange 2010 边缘传输服务器角色.如下图所示: 客户端访问服务

highcharts 结合phantomjs纯后台生成图片系列二之php

上篇文章中介绍了phantomjs的使用场景,方法.本篇文章详细介绍使用php,highcharts 结合phantomjs纯后台生成图片. 一.准备: 下载phantomjs解析插件,从 highcharts官方 下载所需插件. 新建一个工程文件夹名位:phantomjs,所必备的js文件有: 其中jquery.js为v1.7.1; highcharts-convert.js的下载地址可去 github上下载 . highcharts官方文档有关于highcharts-convert.js的使

Apache Kafka系列(二) 命令行工具(CLI)

Apache Kafka系列(一) 起步 Apache Kafka系列(二) 命令行工具(CLI) Apache Kafka命令行工具(Command Line Interface,CLI),下文简称CLI. 1. 启动Kafka 启动Kafka需要两步: 1.1. 启动ZooKeeper [[email protected] kafka_2.12-0.11.0.0]# bin/zookeeper-server-start.sh config/zookeeper.properties 1.2.