Python3.5 調用訊飛動態(tài)鏈接庫實現(xiàn)語音識別

訊飛的接口沒有Restful,而我們偏偏要用Python開發(fā),在官網(wǎng)論壇找了份Python實現(xiàn)的代碼,但是已經(jīng)不能正常運行,參考win開發(fā)SDK里的demo和文檔,終于調通了,直接上代碼,環(huán)境為Python3.5。

from ctypes import *
import time
from glob import glob
 
 # 調用動態(tài)鏈接庫
dll = windll.LoadLibrary("msc_x64.dll")
 #登錄參數(shù),apppid一定要和你的下載SDK對應
login_params = b"appid = 你的APPID, work_dir = ."
 
FRAME_LEN = 640  # Byte
 
MSP_SUCCESS = 0
# 返回結果狀態(tài)
MSP_AUDIO_SAMPLE_FIRST = 1
MSP_AUDIO_SAMPLE_CONTINUE = 2
MSP_AUDIO_SAMPLE_LAST = 4
MSP_REC_STATUS_COMPLETE = 5
 # 你的語音文件路徑
filename = "data\\iflytek01.wav"
 
 
class Msp:
    def __init__(self):
        pass
 
    def login(self):
        ret = dll.MSPLogin(None, None, login_params)
        # print('MSPLogin =>', ret)
 
    def logout(self):
        ret = dll.MSPLogout()
        # print('MSPLogout =>', ret)
 
    def isr(self, audiofile, session_begin_params):
        ret = c_int()
        sessionID = c_voidp()
        dll.QISRSessionBegin.restype = c_char_p
        sessionID = dll.QISRSessionBegin(None, session_begin_params, byref(ret))
        # print('QISRSessionBegin => sessionID:', sessionID, 'ret:', ret.value)
 
        # 每秒【1000ms】  16000 次 * 16 bit 【20B】 ,每毫秒:1.6 * 16bit 【1.6*2B】 = 32Byte
        # 1幀音頻20ms【640B】 每次寫入 10幀=200ms 【6400B】
 
        piceLne = FRAME_LEN * 20
        epStatus = c_int(0)
        recogStatus = c_int(0)
 
        wavFile = open(audiofile, 'rb')
        wavData = wavFile.read(piceLne)
 
        ret = dll.QISRAudioWrite(sessionID, wavData, len(wavData), MSP_AUDIO_SAMPLE_FIRST, byref(epStatus), byref(recogStatus))
        # print('len(wavData):', len(wavData), 'QISRAudioWrite ret:', ret, 'epStatus:', epStatus.value, 'recogStatus:', recogStatus.value)
        # time.sleep(0.2)
        while wavData:
            wavData = wavFile.read(piceLne)
 
            if len(wavData) == 0:
                break
 
            ret = dll.QISRAudioWrite(sessionID, wavData, len(wavData), MSP_AUDIO_SAMPLE_CONTINUE, byref(epStatus), byref(recogStatus))
            # print('len(wavData):', len(wavData), 'QISRAudioWrite ret:', ret, 'epStatus:', epStatus.value, 'recogStatus:', recogStatus.value)
            time.sleep(0.2)
 
        ret = dll.QISRAudioWrite(sessionID, None, 0, MSP_AUDIO_SAMPLE_LAST, byref(epStatus), byref(recogStatus))
        # print('len(wavData):', len(wavData), 'QISRAudioWrite ret:', ret, 'epStatus:', epStatus.value, 'recogStatus:', recogStatus.value)
 
        # -- 獲取音頻
        laststr = ''
        counter = 0
        while recogStatus.value != MSP_REC_STATUS_COMPLETE:
            ret = c_int()
            dll.QISRGetResult.restype = c_char_p
            retstr = dll.QISRGetResult(sessionID, byref(recogStatus), 0, byref(ret))
            if retstr is not None:
                laststr += retstr.decode()
                # print(laststr)
            # print('ret:', ret.value, 'recogStatus:', recogStatus.value)
            counter += 1
            time.sleep(0.2)
            counter += 1
            if counter == 500:
                laststr += '訊飛語音識別失敗'
                break
 
        print(laststr)
        ret = dll.QISRSessionEnd(sessionID, '\0')
        # print('end ret: ', ret)
        return laststr
 
 
def XF_text(filepath, audiorate):
    msp = Msp()
    msp.login()
    session_begin_params = b"sub = iat, ptt = 0, result_encoding = utf8, result_type = plain, domain = iat"
    if 8000 == audiorate:
        session_begin_params = b"sub = iat, aue=speex;7, auf=audio/L16;rate=8000, ptt = 0, result_encoding = utf8, result_type = plain, domain = iat"
    text = msp.isr(filepath, session_begin_params)
    msp.logout()
    return text
 
 
if __name__ == '__main__':
    # 8000為音頻碼率
    res = XF_text(filename, 8000)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容