python使用百度語音識別API注意事項

大森林home發表於2017-11-08



程式碼如下:

# -*- coding:utf-8 -*-
#http://blog.csdn.net/happen23/article/details/45821697
#百度語音識別API的使用樣例(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 = "xjlSpsvUgGF8a9ltNOtREoTr"
    secretKey = "a95ca71b81854b526e7eb04ae8f51d23"

    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('8k.wav', 'rb')
    nf = fp.getnframes()
    f_len = nf * 2
    audio_data = fp.readframes(nf)

    cuid = "xxxxxxxxxx" #my xiaomi phone MAC
    srv_url = 'http://vop.baidu.com/server_api' + '?cuid=' + cuid + '&token=' + token
    http_header = [
        '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)



以上程式碼是不能直接跑的,一般錄音得到的音訊檔案,該程式碼下執行不了,目前只知道百度提供的音訊檔案可以識別,百度提供的音訊檔案下載連結如下:

http://yuyin.baidu.com/docs/asr/54

在上面這個連結的頁面中,往下拖,可以得到下載連結如下:
http://speech-doc.gz.bcebos.com/rest-api-asr/public_audio/public.zip


然後執行結果:

{"corpus_no":"6485972281376050071","err_msg":"success.","err_no":0,"result":["北京科技館,"],"sn":"651708407021510133099"}


注意事項:

百度的語音識別和語音合成用的是相同的

appid、API key和Secret Key,所以使用相同的token即可

獲取以上三個欄位的教程:

http://jingyan.baidu.com/article/f3e34a12df0cddf5eb65359f.html

後記:


下面的程式碼可以執行任意自己錄製的音訊檔案,注意,執行前必須apt-get install ffmpeg

另外,rate改成了16000,不然會識別不準,不過,也沒有經過大量測試,不知道識別準確的情況還會不會出現。

# -*- coding:utf-8 -*-
#http://blog.csdn.net/happen23/article/details/45821697
#百度語音識別API的使用樣例(python實現)
#encoding=utf-8



import wave
import urllib, urllib2, pycurl
import base64
import subprocess
import json
## get access token by api key & secret key

def get_token():
    apiKey = "xjlSpsvUgGF8a9ltNOtREoTr"
    secretKey = "a95ca71b81854b526e7eb04ae8f51d23"

    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):
    subprocess.call(['ffmpeg', '-i', 'tian.mp3', 'tian.wav'])#這句程式碼的意思是在終端中執行[]中的命令。所以執行的前提是apt-get install ffmpeg
    fp = wave.open('tian.wav', 'rb')
    nf = fp.getnframes()
    f_len = nf * 2
    audio_data = fp.readframes(nf)

    cuid = "xxxxxxxxxx" #my xiaomi phone MAC
    srv_url = 'http://vop.baidu.com/server_api' + '?cuid=' + cuid + '&token=' + token
    http_header = [
        'Content-Type: audio/pcm; rate=16000',
        '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)
所謂的離線資源下載,其實仍然是本地向伺服器請求,效率上是無法提高的。


相關文章