什麼是REST api?
-- REpresentational State Transfer
REST api是基於http請求的一種api,就百度語音識別的實例來說,經過百度提供的url加上通過編碼的音頻文件,向百度服務器發出請求,而後百度服務器返回識別的內容。結束。php
優勢java
不受平臺限制(我在樹莓派上操做的) 代碼簡單
缺點:python
依賴網絡 對要識別的音頻格式要求高
百度語音REST api 支持的語言java、php、python、c# 、Node.js。下面分享一個python2.7版的實例
1.先去註冊開發者帳號,新建應用,得到APP_ID,API_KEY,SECRET_KEY
2.安裝SDKjson
安裝使用SDK有以下方式: 若是已安裝pip,執行pip install baidu-aip便可。 若是已安裝setuptools,執行python setup.py install便可
3.安裝完了看代碼
語音合成c#
# -*- coding: UTF-8 -*- from aip import AipSpeech # 定義常量 APP_ID = '9****418' API_KEY = 'uXmKYE0zX67****kGxO8c0' SECRET_KEY = 'ba7c43158****2d0d180c80f132a' # 初始化AipSpeech對象 aipSpeech = AipSpeech(APP_ID, API_KEY, SECRET_KEY) result = aipSpeech.synthesis(' 一二三四五六七八九十', 'zh', 1, { 'vol': 5, }) # 識別正確返回語音二進制 錯誤則返回dict 參照下面錯誤碼 if not isinstance(result, dict): with open('8k.wav', 'wb') as f: f.write(result)
完了,就這些,synthesis()方法的第一個參數是要合成的文字,open()方法的第一個參數是合成後的文件名加後綴,其餘沒啥。api
語音識別
語音識別分爲顯式和隱式。實測效果同樣。
我搞不清哪一個叫顯式哪一個叫隱式了
一個是這樣的服務器
# -*- coding: UTF-8 -*- from aip import AipSpeech import json # 定義常量 APP_ID = '99***418' API_KEY = 'uXmKY*****kcbCWkGxO8c0' SECRET_KEY = 'ba7c43158*******d0d180c80f132a' # 初始化AipSpeech對象 aipSpeech = AipSpeech(APP_ID, API_KEY, SECRET_KEY) # 讀取文件 def get_file_content(filePath): with open(filePath, 'rb') as fp: return fp.read() # 識別本地文件 result = aipSpeech.asr(get_file_content('8k.amr'), 'amr', 8000, { 'lan': 'zh', }) json_result = json.dumps(result) strtestObj = json.loads(json_result) #print strtestObj lists = strtestObj["result"] print "識別結果:".decode('utf-8').encode('gbk'),lists[0]
get_file_content()方法的參數是要上傳的音頻文件名加後綴(音頻格式),
asr()方法的第二個參數是音頻格式,第二個參數是採樣率,僅支持 8000 或者 16000網絡
另外一個是這樣的app
# -*- coding: UTF-8 -*- import base64 import urllib2 import urllib import json import wave def get_token(): URL = 'http://openapi.baidu.com/oauth/2.0/token' _params = urllib.urlencode({'grant_type': 'client_credentials', 'client_id': 'uXmKYE0z*****cbCWkGxO8c0', 'client_secret': 'ba7c43158dca*****2d0d180c80f132a'}) _res = urllib2.Request(URL, _params) _response = urllib2.urlopen(_res) _data = _response.read() _data = json.loads(_data) return _data['access_token'] # 讀取文件 def get_file_content(filePath): with open(filePath, 'rb') as fp: return fp.read() def wav_to_text(wav_file): try: speech_data= get_file_content(wav_file) speech_base64=base64.b64encode(speech_data).decode('utf-8') speech_length=len(speech_data) except IOError: print u'文件錯誤!' return data = {"format": "wav", "token": get_token(), "len": speech_length, "rate": 8000, "speech": speech_base64, "cuid": "74-D0-2B-78-BF-AA", "channel": 1} data = json.dumps(data) res = urllib2.Request('http://vop.baidu.com/server_api', data, {'content-type': 'application/json'}) response = urllib2.urlopen(res) res_data = json.loads(response.read()) print res_data ['result'][0] if __name__ == '__main__': wav_to_text('1.wav')
「duang」 拉麼多!仍是果斷選第一種,不過仍是先簡單介紹一下吧:思路是這樣的:python2.7
先根據API_KEY和SECRET_KEY得到token, 而後壓縮音頻文件 b64encode()方法之類操做 最後封裝url後Request()去請求.