基於http的百度語音 REST api

什麼是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()去請求.
相關文章
相關標籤/搜索