前几天研究了一下在树莓派上使用麦克风,目的是实现树莓派上的语音识别。 现在要实现语音识别不需要自己实现算法,只要能把声音通过网络传给语音识别服务提供商就可以了,语音识别在服务提供商的服务器上完成,然后把结果返回过来。这种模式对于我这种不追求自主知识产权的人来说已经足够了。 目前语音识别服务主要有百度、科大讯飞、google。 百度提供ios、安卓、linux等的sdk,同时还提供基于http的访问接口,用户只要能实现http post method就可以了,可以说非常的方便。百度的开放平台审核效率还是很高的,我在大年初一申请语音识别API权限,他们初三就审核通过了!大年初三!通过了!!!用起来也很简单,半天时间就可以调通的了。 科大讯飞也提供各主流平台的sdk,另外有树莓派的sdk可供申请(还没拿到,不知道是不是基于http的)。讯飞能做到目前的程度,一定有其过人之处,希望有机会能试用一下。 google,呵呵,国内不要用了吧。 下面记录一下百度语音识别API的开发过程: 1. 在百度开放平台新建工程,申请到ID、API key、secret key以及开发文档等。 2. 用上面的数据到百度oauth获取access token。 3. 把要识别的语音数据按照百度文档中的格式传到其服务器上。我使用的是隐式上传,需要对语音数据做base64编码,和另外一些格式信息组成json数据,post到服务器端。 4. 服务器返回识别结果的json文本,对结果进行解析即可。 百度提供了c++、java等的例子工程,太复杂了。python 50行代码搞定的事儿,c++要一堆代码,还是不要看了。 1 #! /usr/bin/env python3
2 3 import baidu_oauth 4 import uuid 5 import base64 6 import json 7 import urllib.request 8 import sys 9 10 asr_server = 'http://vop.baidu.com/server_api' 11 baidu_oauth_url = 'https://openapi.baidu.com/oauth/2.0/token/' 12 client_id = 'xxx' 13 client_secret = 'xxx' 14 access_token = baidu_oauth.get_baidu_access_token(baidu_oauth_url, client_id, client_secret) 15 mac_address=uuid.UUID(int=uuid.getnode()).hex[-12:] 16 17 def baidu_asr(speech_file): 18 with open(speech_file, 'rb') as f: 19 speech_data = f.read() 20 speech_base64=base64.b64encode(speech_data).decode('utf-8') 21 speech_length=len(speech_data) 22 data_dict = {'format':'wav', 'rate':8000, 'channel':1, 'cuid':mac_address, 'token':access_token, 'lan':'zh', 'speech':speech_base64, 'len':speech_length} 23 json_data = json.dumps(data_dict).encode('utf-8') 24 json_length = len(json_data) 25 26 request = urllib.request.Request(url=asr_server) 27 request.add_header('Content-Type', 'application/json') 28 request.add_header('Content-Length', json_length) 29 fs = urllib.request.urlopen(url=request, data=json_data) 30 31 result_str = fs.read().decode('utf-8') 32 json_resp = json.loads(result_str) 33 return json_resp 34 35 json_resp = baidu_asr(sys.argv[1]) 36 print(json_resp) |
|