使用百度API实现语音识别——in python

前几天研究了一下在树莓派上使用麦克风,目的是实现树莓派上的语音识别。
现在要实现语音识别不需要自己实现算法,只要能把声音通过网络传给语音识别服务提供商就可以了,语音识别在服务提供商的服务器上完成,然后把结果返回过来。这种模式对于我这种不追求自主知识产权的人来说已经足够了。
目前语音识别服务主要有百度、科大讯飞、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)

你可能感兴趣的:(python)