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

訊飛的接口沒有Restful,而我們偏偏要用Python開發(fā),在官網論壇找了份Python實現的代碼瞭郑,但是已經不能正常運行,參考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")
 #登錄參數袜茧,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)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末瓣窄,一起剝皮案震驚了整個濱河市笛厦,隨后出現的幾起案子,更是在濱河造成了極大的恐慌俺夕,老刑警劉巖裳凸,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異劝贸,居然都是意外死亡姨谷,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門映九,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梦湘,“玉大人,你說我怎么就攤上這事“埔椋” “怎么了哼拔?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瓣颅。 經常有香客問我倦逐,道長,這世上最難降的妖魔是什么宫补? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任檬姥,我火速辦了婚禮,結果婚禮上守谓,老公的妹妹穿的比我還像新娘穿铆。我一直安慰自己,他們只是感情好斋荞,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布荞雏。 她就那樣靜靜地躺著,像睡著了一般平酿。 火紅的嫁衣襯著肌膚如雪凤优。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天蜈彼,我揣著相機與錄音筑辨,去河邊找鬼。 笑死幸逆,一個胖子當著我的面吹牛棍辕,可吹牛的內容都是我干的。 我是一名探鬼主播还绘,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼楚昭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拍顷?” 一聲冷哼從身側響起抚太,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎昔案,沒想到半個月后尿贫,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡踏揣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年庆亡,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捞稿。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡身冀,死狀恐怖钝尸,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情搂根,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布铃辖,位于F島的核電站剩愧,受9級特大地震影響,放射性物質發(fā)生泄漏娇斩。R本人自食惡果不足惜仁卷,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望犬第。 院中可真熱鬧锦积,春花似錦、人聲如沸歉嗓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鉴分。三九已至哮幢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間志珍,已是汗流浹背橙垢。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留伦糯,地道東北人柜某。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像敛纲,于是被迫代替她去往敵國和親喂击。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內容