久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

Windows下Python調(diào)用訊飛語(yǔ)音喚醒SDK實(shí)戰(zhàn)與避坑指南

Windows下Python調(diào)用訊飛語(yǔ)音喚醒SDK實(shí)戰(zhàn)與避坑指南 做了幾年語(yǔ)音交互相關(guān)的項(xiàng)目我一直有個(gè)感受喚醒詞能穩(wěn)定觸發(fā)的那一刻整個(gè)設(shè)備才算是真正“活”了。這次在Windows環(huán)境下用Python調(diào)用科大訊飛語(yǔ)音喚醒SDK說(shuō)實(shí)話一開(kāi)始我有點(diǎn)輕視它以為把SDK文檔里的接口照著調(diào)一遍就行了結(jié)果前前后后踩了十幾個(gè)坑光是解決“DLL加載就報(bào)錯(cuò)”和“回調(diào)遲遲不來(lái)”這兩個(gè)問(wèn)題就花掉大半天。這篇文章就是一次完整的實(shí)操記錄把Windows下用Python通過(guò)ctypes調(diào)訊飛喚醒SDK的整個(gè)鏈路講清楚包含完整可跑的代碼重點(diǎn)說(shuō)明哪些地方容易翻車、為什么翻車、怎么避開(kāi)。適合正在做語(yǔ)音喚醒、語(yǔ)音助手的開(kāi)發(fā)者尤其是想用Python快速驗(yàn)證產(chǎn)品原型的人參考。1. 方案選型為什么用Python調(diào)訊飛喚醒SDK以及整體思路1.1 Python與C SDK之間的“橋接”方案先回答一個(gè)最常見(jiàn)的問(wèn)題訊飛官方SDK是C/C接口為什么我還要用Python去調(diào)原因很現(xiàn)實(shí)。做項(xiàng)目原型、做算法驗(yàn)證、做自動(dòng)化測(cè)試的時(shí)候Python的開(kāi)發(fā)效率是C沒(méi)法比的。我有一次臨時(shí)要驗(yàn)證某個(gè)喚醒詞在真實(shí)麥克風(fēng)下的觸發(fā)率如果用C重新寫(xiě)一套采集流程光搭工程就要大半天用Python加上pyaudio采集音頻再通過(guò)ctypes直接加載訊飛SDK的動(dòng)態(tài)庫(kù)一小時(shí)以內(nèi)就能跑起來(lái)。另外團(tuán)隊(duì)的算法工程師、測(cè)試同學(xué)普遍更熟悉Python把SDK封裝成Python接口后大家都能直接上手調(diào)參、看日志不需要每個(gè)人都去研究C編譯環(huán)境。目前常見(jiàn)的方案有三條路方案A用ctypes直接加載訊飛SDK的動(dòng)態(tài)庫(kù)DLL在Python側(cè)定義接口簽名。這是本文采用的方式優(yōu)點(diǎn)是鏈路短、無(wú)重編譯、修改靈活適合快速調(diào)試驗(yàn)證。方案B用pybind11或cffi寫(xiě)一層C擴(kuò)展包裝SDK再在Python中導(dǎo)入。優(yōu)點(diǎn)是類型更清晰、性能更好但每次改SDK版本都要重新編譯搭建環(huán)境成本高。方案C完全脫離本地SDK走訊飛開(kāi)放平臺(tái)的HTTP接口做“云端喚醒”。這個(gè)方案其實(shí)不算真正的喚醒——因?yàn)樵贫俗R(shí)別意味著音頻要持續(xù)上傳網(wǎng)絡(luò)延遲、流量消耗和隱私問(wèn)題都比較明顯而且斷網(wǎng)時(shí)整個(gè)喚醒功能就廢了所以不適合本地語(yǔ)音交互場(chǎng)景。我做下來(lái)最終選了方案A。ctypes是Python標(biāo)準(zhǔn)庫(kù)自帶的不需要安裝額外依賴它可以直接調(diào)用DLL里導(dǎo)出的C函數(shù)。關(guān)鍵是把每個(gè)函數(shù)的參數(shù)類型、返回值類型、回調(diào)函數(shù)簽名在Python側(cè)聲明準(zhǔn)確只要這一步做對(duì)了后面的調(diào)用體驗(yàn)基本上跟調(diào)本地函數(shù)差不多。1.2 喚醒鏈路整體設(shè)計(jì)喚醒功能的整體數(shù)據(jù)流是這樣的麥克風(fēng)采集音頻 → 音頻數(shù)據(jù)寫(xiě)入SDK → SDK內(nèi)部做VAD檢測(cè)和喚醒詞特征匹配 → 命中后觸發(fā)回調(diào) → 應(yīng)用層執(zhí)行后續(xù)業(yè)務(wù)動(dòng)作這里有一點(diǎn)必須先搞清楚喚醒SDK內(nèi)部是有完整的聲音處理鏈路的它接收的是原始PCM音頻流不是音頻文件路徑。所以我們要做的第一步是拿到真實(shí)麥克風(fēng)的原始音頻數(shù)據(jù)然后把字節(jié)流持續(xù)、實(shí)時(shí)地喂給SDK。音頻參數(shù)必須嚴(yán)格匹配SDK要求一般是16kHz采樣率、16位量化、單聲道也就是PCM_S16LE格式。這個(gè)參數(shù)直接決定了喚醒的準(zhǔn)確率和觸發(fā)穩(wěn)定性后面我會(huì)專門(mén)展開(kāi)講。除了數(shù)據(jù)流Windows下的喚醒還要處理幾個(gè)容易忽略的問(wèn)題麥克風(fēng)設(shè)備權(quán)限、設(shè)備占用沖突、DLL依賴庫(kù)缺失、Python解釋器和DLL的位數(shù)匹配32位還是64位以及回調(diào)線程和Python主線程的交互。這些細(xì)節(jié)如果不提前規(guī)劃好連“Hello” 都跑不通。2. 初始化到喚醒監(jiān)聽(tīng)核心代碼與關(guān)鍵參數(shù)說(shuō)明2.1 環(huán)境準(zhǔn)備與SDK文件清單先說(shuō)環(huán)境我用的是Python 3.1064位版本。為什么強(qiáng)調(diào)位數(shù)因?yàn)閃indows下DLL也有32位和64位之分Python解釋器的位數(shù)必須和SDK DLL的位數(shù)一致。我一開(kāi)始圖省事用了Anaconda默認(rèn)的64位Python結(jié)果拷過(guò)來(lái)一個(gè)32位版本的訊飛喚醒SDK第一次調(diào)用就報(bào)OSError: [WinError 193] %1 不是有效的 Win32 應(yīng)用。這個(gè)錯(cuò)誤的意思就是DLL位數(shù)不匹配排查方法很簡(jiǎn)單打開(kāi)任務(wù)管理器看Python進(jìn)程是32位還是64位或者直接看DLL文件屬性。一個(gè)訊飛語(yǔ)音喚醒SDK包解壓后你通常會(huì)看到這些東西msc_x64.dll或msc.dll核心動(dòng)態(tài)庫(kù)喚醒能力封裝在里面。lib或bin目錄下的若干依賴DLL比如日志、網(wǎng)絡(luò)通信相關(guān)的庫(kù)這些也要放在能被找到的路徑下。resource/目錄或喚醒詞資源文件一般是.irres、.bin或.jet文件里面是喚醒詞的聲學(xué)模型和資源初始化時(shí)要指定路徑。頭文件ivw.h或qivw.h之類的Windows下用ctypes調(diào)用時(shí)最關(guān)鍵的是從這里面確認(rèn)函數(shù)名、參數(shù)類型和回調(diào)函數(shù)簽名。注意不同版本SDK解壓后的目錄結(jié)構(gòu)會(huì)有差異但大原則是所有DLL放在同一個(gè)目錄下并且讓Python啟動(dòng)時(shí)的當(dāng)前工作目錄或PATH環(huán)境變量包含這個(gè)目錄。否則即使主DLL加載成功它依賴的其他DLL找不到后面調(diào)用某個(gè)具體函數(shù)時(shí)會(huì)莫名其妙崩潰。2.2 加載DLL并定義接口簽名首先做三件事加載DLL、聲明函數(shù)原型、定義回調(diào)類型。這一步是ctypes調(diào)用的地基寫(xiě)錯(cuò)一個(gè)參數(shù)類型輕則回調(diào)不觸發(fā)重則直接導(dǎo)致Python進(jìn)程閃退。訊飛喚醒SDK的導(dǎo)出接口風(fēng)格是典型的C接口函數(shù)名類似QIVWRegisterCallback、QIVWSessionBegin、QIVWAudioWrite、QIVWSessionEnd。不同SDK版本函數(shù)名可能有差異務(wù)必以你下載版本的頭文件為準(zhǔn)。以我用的版本為例核心代碼如下import ctypes import os # 1) 加載DLL思路是把SDK目錄臨時(shí)加到PATH里 sdk_dir rD:\workspace\iflytek_wakeup\bin os.environ[PATH] sdk_dir ; os.environ[PATH] sdk ctypes.CDLL(os.path.join(sdk_dir, msc_x64.dll))這里我直接用ctypes.CDLL加載。如果你的SDK頭文件里聲明了__stdcallWindows API常見(jiàn)要用ctypes.WinDLL加載如果是普通C函數(shù)__cdecl用CDLL。拿不準(zhǔn)的時(shí)候打開(kāi)頭文件看一眼函數(shù)聲明前有CALLBACK、WINAPI字樣就是stdcall否則是cdecl。接著聲明函數(shù)的參數(shù)和返回值類型。這一步容易被忽略但它恰恰是ctypes調(diào)用C庫(kù)的核心# 2) 聲明函數(shù)簽名 # typedef void (*wakeup_handler)(const char *text, int len, void *user_data); WAKEUP_CB ctypes.CFUNCTYPE(None, ctypes.c_char_p, ctypes.c_int, ctypes.c_void_p) sdk.QIVWRegisterCallback.argtypes [WAKEUP_CB] sdk.QIVWRegisterCallback.restype ctypes.c_int sdk.QIVWSessionBegin.argtypes [ctypes.c_char_p, ctypes.c_char_p] sdk.QIVWSessionBegin.restype ctypes.c_void_p sdk.QIVWAudioWrite.argtypes [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_uint, ctypes.c_int] sdk.QIVWAudioWrite.restype ctypes.c_int sdk.QIVWSessionEnd.argtypes [ctypes.c_void_p, ctypes.c_char_p] sdk.QIVWSessionEnd.restype ctypes.c_int為什么要把a(bǔ)rgtypes和restype顯式寫(xiě)清楚因?yàn)閏types默認(rèn)情況下會(huì)把參數(shù)當(dāng)成c_int處理如果你傳入一個(gè)字符串或一個(gè)指針內(nèi)存布局就對(duì)不上。特別是64位系統(tǒng)下指針長(zhǎng)度是8字節(jié)如果不聲明restype c_void_p返回值會(huì)被截?cái)喑?2位整數(shù)后面回調(diào)、會(huì)話操作全都會(huì)錯(cuò)亂。這一行聲明往往就是調(diào)通和調(diào)不通的分水嶺。2.3 初始化、設(shè)置回調(diào)與啟動(dòng)喚醒初始化喚醒會(huì)話的流程通常是注冊(cè)回調(diào) → 設(shè)置喚醒詞資源 → 開(kāi)始會(huì)話 → 寫(xiě)入音頻 → 持續(xù)監(jiān)聽(tīng) → 命中后回調(diào)循環(huán)往復(fù)。下面是我把流程簡(jiǎn)化后的初始化代碼# 3) 回調(diào)函數(shù)喚醒成功后SDK在內(nèi)部線程里調(diào)用它 WAKEUP_CB def on_wakeup(text_bytes, length, user_data): if text_bytes: word text_bytes.decode(utf-8, errorsignore) print(f[喚醒成功] {word}) # 這里可以做后續(xù)動(dòng)作亮屏、錄音、播放提示音等 # 4) 注冊(cè)回調(diào) ret sdk.QIVWRegisterCallback(on_wakeup) if ret ! 0: raise RuntimeError(f注冊(cè)回調(diào)失敗: {ret}) # 5) 開(kāi)始喚醒會(huì)話sdk_params里要配置喚醒詞資源路徑和門(mén)限 params bappid12345678,work_dirD:\\workspace\\iflytek_wakeup\\resource,sstwakeup,ivw_threshold0:1450 session_id sdk.QIVWSessionBegin(None, params) if not session_id: raise RuntimeError(會(huì)話開(kāi)啟失敗)這里有兩個(gè)容易踩的坑。第一QIVWSessionBegin的參數(shù)是char*字節(jié)串所以在Python里必須用b...不能直接用普通字符串否則編碼不對(duì)DLL讀的是亂碼。第二work_dir指向的資源目錄里必須有對(duì)應(yīng)的喚醒詞資源文件而且喚醒詞編號(hào)和門(mén)限要匹配。ivw_threshold0:1450的含義是第0個(gè)喚醒詞的觸發(fā)門(mén)限是1450門(mén)限越低越容易被觸發(fā)但誤喚醒也會(huì)增加建議先用官方默認(rèn)門(mén)限跑通流程再根據(jù)實(shí)測(cè)調(diào)高或調(diào)低。如果你的SDK版本沒(méi)有QIVWSessionBegin這個(gè)函數(shù)名而是用AIUI方式初始化也不用慌核心邏輯是一樣的注冊(cè)回調(diào)、傳參配置資源、開(kāi)啟會(huì)話。2.4 音頻數(shù)據(jù)如何“喂”給SDK啟動(dòng)喚醒后要做的事情就是把麥克風(fēng)采集到的音頻寫(xiě)入SDK。我在項(xiàng)目里用的是pyaudio庫(kù)音頻參數(shù)固定為import pyaudio FORMAT pyaudio.paInt16 # 16位量化 CHANNELS 1 # 單聲道 RATE 16000 # 16kHz采樣率 CHUNK 960 # 30ms一塊CHUNK的選取是有講究的。一塊音頻對(duì)應(yīng)的時(shí)間太短比如5ms那么CPU會(huì)頻繁在Python層和SDK層之間切換調(diào)用開(kāi)銷變大一塊音頻對(duì)應(yīng)時(shí)間太長(zhǎng)比如500msSDK內(nèi)部做成幀處理時(shí)的喚醒延遲就會(huì)變高。實(shí)測(cè)下來(lái)16kHz采樣率下每塊音頻取960個(gè)采樣點(diǎn)即30ms是最舒服的平衡點(diǎn)喚醒延遲大概在200~400ms人耳幾乎感覺(jué)不到。把音頻數(shù)據(jù)寫(xiě)入SDK的循環(huán)p pyaudio.PyAudio() stream p.open(formatFORMAT, channelsCHANNELS, rateRATE, inputTrue, frames_per_bufferCHUNK) try: while running: audio_data stream.read(CHUNK, exception_on_overflowFalse) ret sdk.QIVWAudioWrite(session_id, audio_data, len(audio_data), 0) if ret ! 0: print(f音頻寫(xiě)入錯(cuò)誤: {ret}) except KeyboardInterrupt: pass finally: stream.stop_stream() stream.close() p.terminate() sdk.QIVWSessionEnd(session_id, b)注意exception_on_overflowFalse這個(gè)參數(shù)。Windows下麥克風(fēng)驅(qū)動(dòng)偶爾會(huì)緩沖區(qū)溢出如果這個(gè)參數(shù)不設(shè)置成Falsestream.read會(huì)直接拋異常導(dǎo)致喚醒循環(huán)中斷。設(shè)成False之后read會(huì)返回None或歷史殘留數(shù)據(jù)雖然理論上會(huì)有輕微噪聲但能保證循環(huán)不崩。更穩(wěn)的做法是判斷audio_data是否為空為空就跳過(guò)寫(xiě)入。3. 避坑實(shí)錄Windows環(huán)境下最容易翻車的6個(gè)問(wèn)題3.1 位數(shù)不匹配32位DLL vs 64位Python這個(gè)問(wèn)題我在前面提過(guò)但它太典型了值得單獨(dú)拿出來(lái)重點(diǎn)說(shuō)。報(bào)錯(cuò)OSError: [WinError 193]時(shí)第一時(shí)間檢查Python和DLL的位數(shù)。我見(jiàn)過(guò)不少同學(xué)折騰了半天最后發(fā)現(xiàn)是Anaconda裝的是32位版本而SDK給的是64位DLL或者反過(guò)來(lái)。判斷方法有幾種打開(kāi)cmd輸入python -c import platform; print(platform.architecture())輸出中的64bit或32bit就是解釋器位數(shù)。在文件資源管理器里右鍵DLL文件 → 屬性Windows不會(huì)直接顯示位數(shù)更可靠的方式是用dumpbin /headers msc_x64.dll或者用Python讀PE頭。還有一個(gè)容易混淆的點(diǎn)進(jìn)程位數(shù)和系統(tǒng)位數(shù)無(wú)關(guān)64位Windows完全可以運(yùn)行32位Python進(jìn)程。所以不要以為“我電腦是64位的就萬(wàn)事大吉”要看的是解釋器本身。3.2 工作目錄與中文路徑的坑訊飛這套SDK對(duì)路徑非常敏感尤其是老版本。我踩過(guò)一次很無(wú)語(yǔ)的坑SDK放在D:\項(xiàng)目\喚醒SDK\bin下路徑里帶中文“項(xiàng)目”兩個(gè)字初始化時(shí)QIVWSessionBegin一直返回失敗日志文件里提示找不到資源。后來(lái)把整個(gè)SDK目錄挪到純英文路徑D:\workspace\wakeup_sdk\下問(wèn)題立刻消失。原因不復(fù)雜很多C庫(kù)在Windows下把路徑字符串按**本地代碼頁(yè)GBK**處理而Python傳入的bytes字節(jié)串是UTF-8編碼路徑里一旦有非ASCII字符兩邊編碼不一致就會(huì)出錯(cuò)。所以最省心的做法是SDK工作目錄全部使用純英文路徑不要有空格、中文、特殊符號(hào)。在工程內(nèi)部統(tǒng)一用UTF-8編寫(xiě)代碼但傳給SDK的路徑參數(shù)顯示轉(zhuǎn)換成GBK編碼path.encode(gbk)。如果你的SDK版本比較新可能對(duì)中文路徑已經(jīng)做了兼容但項(xiàng)目上線前我仍然建議做一次路徑測(cè)試別在這上面賭運(yùn)氣。3.3 麥克風(fēng)權(quán)限與獨(dú)占沖突Windows 10/11有一個(gè)“麥克風(fēng)隱私設(shè)置”默認(rèn)情況下有些應(yīng)用是無(wú)法訪問(wèn)麥克風(fēng)的。這個(gè)坑藏得比較深因?yàn)槌绦虿粫?huì)像Android那樣彈權(quán)限對(duì)話框它只會(huì)“安靜地”讀到一段全零數(shù)據(jù)或者直接打開(kāi)設(shè)備失敗。表現(xiàn)就是程序在跑日志正常但喚醒永遠(yuǎn)不觸發(fā)。排查方法打開(kāi)Windows設(shè)置 → 隱私 → 麥克風(fēng)確認(rèn)“允許應(yīng)用訪問(wèn)麥克風(fēng)”打開(kāi)。同時(shí)確認(rèn)自己這個(gè)Python進(jìn)程對(duì)應(yīng)的宿主程序比如python.exe、pycharm64.exe也在允許列表中。有時(shí)候PyCharm里運(yùn)行的Python進(jìn)程和直接運(yùn)行的Python進(jìn)程不在同一個(gè)白名單條目里。用系統(tǒng)自帶的錄音機(jī)程序測(cè)試一下麥克風(fēng)是否正常工作。如果系統(tǒng)錄音正常但Python讀不到音頻大概率是權(quán)限或設(shè)備獨(dú)占問(wèn)題。此外Windows音頻設(shè)備同一時(shí)間通常只允許一個(gè)進(jìn)程獨(dú)占訪問(wèn)。如果你開(kāi)著微信語(yǔ)音、騰訊會(huì)議或者直播軟件它們可能已經(jīng)把麥克風(fēng)設(shè)備占了。這時(shí)候pyaudio打開(kāi)設(shè)備可能會(huì)成功但讀出來(lái)的數(shù)據(jù)是靜音或者SDK報(bào)寫(xiě)入異常。所以我習(xí)慣在跑喚醒程序前先關(guān)掉所有可能占用麥克風(fēng)的軟件再用一個(gè)簡(jiǎn)單的電平檢測(cè)腳本確認(rèn)能讀到非零數(shù)據(jù)。3.4 無(wú)喚醒反應(yīng)先查音頻格式如果麥克風(fēng)數(shù)據(jù)正常、代碼跑得順但喚醒就是沒(méi)反應(yīng)十有八九音頻格式出了問(wèn)題。訊飛喚醒SDK要求的是16kHz采樣率、16位量化、單聲道PCM這是硬性要求。下面這幾種情況我都遇過(guò)麥克風(fēng)默認(rèn)采樣率是48kHz某些USB麥克風(fēng)或筆記本麥克風(fēng)陣列默認(rèn)設(shè)備采樣率是48kHz。如果用pyaudio打開(kāi)設(shè)備時(shí)傳RATE16000很多驅(qū)動(dòng)會(huì)自動(dòng)重采樣這個(gè)重采樣質(zhì)量參差不齊會(huì)導(dǎo)致喚醒率嚴(yán)重下降。更好的做法是單獨(dú)查一下設(shè)備支持的采樣率如果設(shè)備只支持48kHz那就先通過(guò)系統(tǒng)設(shè)置把默認(rèn)格式改成16kHz或者用librosa、soundfile等庫(kù)在Python層顯式重采樣。聲道數(shù)填錯(cuò)有些麥克風(fēng)陣列是2聲道或4聲道。如果CHANNELS1但設(shè)備實(shí)際輸出多聲道數(shù)據(jù)讀回來(lái)的字節(jié)流就不是標(biāo)準(zhǔn)單聲道PCMSDK解析全亂??梢酝ㄟ^(guò)pyaudio打印設(shè)備信息確認(rèn)。數(shù)據(jù)格式不是int16個(gè)別采集庫(kù)默認(rèn)返回float32數(shù)組。如果直接把float32的二進(jìn)制內(nèi)容交給SDKSDK當(dāng)成int16解析出來(lái)的聲音完全是噪聲。我習(xí)慣在啟動(dòng)喚醒前先跑一個(gè)“音頻格式自檢”腳本打印當(dāng)前設(shè)備實(shí)際采樣率、聲道數(shù)、緩沖長(zhǎng)度并計(jì)算音頻數(shù)據(jù)的RMS能量。如果RMS接近0說(shuō)明沒(méi)采到真實(shí)聲音如果RMS正常但喚醒不觸發(fā)再重點(diǎn)查格式轉(zhuǎn)換。3.5 DLL加載失敗的隱藏依賴ctypes.CDLL(msc_x64.dll)這行代碼有時(shí)候會(huì)直接報(bào)OSError: [WinError 126] 找不到指定的模塊。這個(gè)“找不到模塊”不一定是指msc_x64.dll本身找不到更可能是它依賴的其他DLL找不到。Windows加載DLL時(shí)搜索順序大致是應(yīng)用程序所在目錄 → 系統(tǒng)目錄 → 環(huán)境變量PATH路徑。訊飛SDK的bin目錄里一堆DLL是互相依賴的如果直接把msc_x64.dll拷到桌面其他依賴DLL不在旁邊加載就會(huì)失敗。解決思路有三個(gè)盡量把SDK所有DLL保持一個(gè)目錄然后把該目錄加到PATH環(huán)境變量中。如果還是報(bào)126用Dependencies開(kāi)源工具可替代老舊的Depends打開(kāi)DLL看一下缺哪個(gè)依賴庫(kù)常見(jiàn)的是msvcp140.dll、vcruntime140.dll等VC運(yùn)行庫(kù)去微軟官網(wǎng)裝最新的“Visual C Redistributable”就行。再一個(gè)隱藏點(diǎn)DLL文件被殺毒軟件隔離。Windows Defender有時(shí)候會(huì)對(duì)SDK里某些加殼的庫(kù)誤殺導(dǎo)致文件還在但內(nèi)容被清空。查殺毒軟件的隔離區(qū)必要時(shí)把SDK目錄加入白名單。我在項(xiàng)目里遇到過(guò)QIVWSessionBegin返回空指針但沒(méi)報(bào)錯(cuò)的情況后來(lái)發(fā)現(xiàn)是SDK的日志DLL版本不兼容把依賴庫(kù)更新后問(wèn)題解決。所以遇到詭異問(wèn)題先開(kāi)SDK日志訊飛SDK通常支持通過(guò)參數(shù)log_level和log_path輸出詳細(xì)日志日志里一般會(huì)寫(xiě)清楚卡在哪一步。3.6 回調(diào)線程與GIL的剪不斷理還亂這是Python調(diào)C庫(kù)時(shí)一個(gè)非常微妙的問(wèn)題。訊飛SDK的回調(diào)函數(shù)是在SDK內(nèi)部線程里觸發(fā)的也就是說(shuō)當(dāng)喚醒詞命中時(shí)on_wakeup并不是跑在你的主線程里而是跑在DLL創(chuàng)建的工作線程里。這意味著兩件事不要在主線程與回調(diào)線程之間直接操作共享的非線程安全對(duì)象。比如在回調(diào)里直接print是可以的但如果要在回調(diào)里操作tkinter界面控件就會(huì)引發(fā)各種詭異問(wèn)題——因?yàn)閠kinter不是線程安全的更穩(wěn)妥的方式是回調(diào)里只記錄事件把真正的UI操作通過(guò)隊(duì)列丟回主線程執(zhí)行。Python GIL會(huì)限制回調(diào)線程和主線程的同時(shí)執(zhí)行。如果你的主線程一直忙于處理其他重計(jì)算喚醒回調(diào)可能被延遲。所以喚醒監(jiān)聽(tīng)線程最好是一個(gè)獨(dú)立、輕量的循環(huán)不要在同一個(gè)線程里又做喚醒采集又做大量的業(yè)務(wù)邏輯。我比較推薦的做法是使用queue.Queue做一個(gè)事件隊(duì)列import queue wakeup_event_queue queue.Queue() WAKEUP_CB def on_wakeup(text_bytes, length, user_data): try: word text_bytes.decode(utf-8, errorsignore) except Exception: word wakeup_event_queue.put(word) # 主線程或其他線程 while True: word wakeup_event_queue.get() print(主線程處理喚醒詞:, word) # 做燈光、播放提示音、啟動(dòng)語(yǔ)音識(shí)別等這樣就把SDK內(nèi)部線程和業(yè)務(wù)邏輯解耦了回調(diào)只負(fù)責(zé)“入隊(duì)”主線程負(fù)責(zé)“處理”。無(wú)論后面接什么動(dòng)作都不會(huì)因?yàn)榫€程安全問(wèn)題莫名其妙崩潰。4. 完整示例代碼與擴(kuò)展思路4.1 可直接運(yùn)行的完整實(shí)例把前面所有部分串起來(lái)一個(gè)完整的、可運(yùn)行的Python版本語(yǔ)音喚醒demo如下。為了減小篇幅我把錯(cuò)誤處理壓縮了一下但核心鏈路是完整的拿過(guò)去改一下SDK路徑就能用。 Windows Python 訊飛語(yǔ)音喚醒SDK 最小可用實(shí)例 依賴: pyaudio 注意: 請(qǐng)根據(jù)你的SDK版本頭文件調(diào)整函數(shù)名和參數(shù)類型 import ctypes import os import queue import platform import sys import time import pyaudio # ---------- 配置區(qū) ---------- SDK_DIR rD:\workspace\wakeup_sdk\bin RESOURCE_DIR rD:\workspace\wakeup_sdk\resource APPID b12345678 # 換成你的appid WAKEUP_CB_NAMES [QIVWRegisterCallback, IVWRegisterCallback] SESSION_BEGIN_NAMES [QIVWSessionBegin, IVWSessionBegin] AUDIO_WRITE_NAMES [QIVWAudioWrite, IVWAudioWrite] SESSION_END_NAMES [QIVWSessionEnd, IVWSessionEnd] RATE 16000 CHANNELS 1 FORMAT pyaudio.paInt16 CHUNK 960 # 30ms 16kHz running True wakeup_event_queue queue.Queue() # ----------------------------- def load_sdk(dll_namemsc_x64.dll): os.environ[PATH] SDK_DIR ; os.environ[PATH] dll_path os.path.join(SDK_DIR, dll_name) if not os.path.exists(dll_path): raise FileNotFoundError(fSDK動(dòng)態(tài)庫(kù)不存在: {dll_path}) print(f[INFO] 加載動(dòng)態(tài)庫(kù): {dll_path}) return ctypes.CDLL(dll_path) def get_func(sdk, names, func_type): for name in names: if hasattr(sdk, name): func getattr(sdk, name) func_type(func) # 這里只是為了觸發(fā)ctypes的函數(shù)包裝檢查 return func, name raise AttributeError(fSDK中不存在可用函數(shù): {names}) def build_callback_type(): # 回調(diào): void handler(const char *text, int len, void *user_data) CB_TYPE ctypes.CFUNCTYPE(None, ctypes.c_char_p, ctypes.c_int, ctypes.c_void_p) return CB_TYPE def main(): if platform.architecture()[0] ! 64bit: print([WARN] 當(dāng)前Python不是64位如果SDK是64位會(huì)出現(xiàn)WinError 193) sdk load_sdk() # 通過(guò)工具函數(shù)查找SDK函數(shù) CB_TYPE build_callback_type() cb_func, cb_name get_func(sdk, WAKEUP_CB_NAMES, CB_TYPE) session_begin, begin_name get_func(sdk, SESSION_BEGIN_NAMES, ctypes.c_void_p) audio_write, write_name get_func(sdk, AUDIO_WRITE_NAMES, ctypes.c_int) session_end, end_name get_func(sdk, SESSION_END_NAMES, ctypes.c_int) # 聲明簽名 cb_func.argtypes [CB_TYPE] cb_func.restype ctypes.c_int session_begin.argtypes [ctypes.c_char_p, ctypes.c_char_p] session_begin.restype ctypes.c_void_p audio_write.argtypes [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_uint, ctypes.c_int] audio_write.restype ctypes.c_int session_end.argtypes [ctypes.c_void_p, ctypes.c_char_p] session_end.restype ctypes.c_int CB_TYPE def on_wakeup(text_bytes, length, user_data): try: word text_bytes.decode(utf-8, errorsignore) except Exception: word text_bytes wakeup_event_queue.put(word) ret cb_func(on_wakeup) if ret ! 0: raise RuntimeError(f注冊(cè)回調(diào)失敗, 錯(cuò)誤碼: {ret}) params ( fappid{APPID.decode()}, fwork_dir{RESOURCE_DIR}, sstwakeup, ivw_threshold0:1450 ).encode(utf-8) session_id session_begin(None, params) if not session_id: raise RuntimeError(會(huì)話開(kāi)啟失敗請(qǐng)檢查appid、資源路徑是否有效) print([INFO] 喚醒會(huì)話已開(kāi)啟正在監(jiān)聽(tīng)...) print([INFO] 按下 CtrlC 退出) p pyaudio.PyAudio() stream None try: stream p.open(formatFORMAT, channelsCHANNELS, rateRATE, inputTrue, frames_per_bufferCHUNK) except Exception as e: print(f[ERROR] 打開(kāi)麥克風(fēng)失敗: {e}) session_end(session_id, b) return global running try: while running: audio_data stream.read(CHUNK, exception_on_overflowFalse) if not audio_data: time.sleep(0.01) continue ret audio_write(session_id, audio_data, len(audio_data), 0) if ret ! 0: print(f[WARN] 音頻寫(xiě)入錯(cuò)誤碼: {ret}) # 非阻塞處理喚醒事件 try: while True: word wakeup_event_queue.get_nowait() print(f[喚醒成功] {word}) # TODO: 在這里接后續(xù)業(yè)務(wù)動(dòng)作 except queue.Empty: pass except KeyboardInterrupt: print(\n[INFO] 手動(dòng)退出) finally: running False if stream is not None: stream.stop_stream() stream.close() p.terminate() session_end(session_id, b) print([INFO] 資源已釋放) if __name__ __main__: main()這個(gè)demo跑通之后你再往里加功能就很輕松了。比如喚醒成功后自動(dòng)錄音5秒并調(diào)用識(shí)別接口或者喚醒成功后在終端播放一段歡迎音。只要記住喚醒回調(diào)里只做最快的事真正的業(yè)務(wù)放到主線程。4.2 后續(xù)擴(kuò)展建議接語(yǔ)音識(shí)別、控制智能家居等喚醒只是語(yǔ)音交互鏈路的“第一公里”。真正實(shí)用起來(lái)你大概率要把它接入后續(xù)的識(shí)別、理解、執(zhí)行能力。我做過(guò)的幾種擴(kuò)展方式供參考本地喚醒 云端識(shí)別喚醒成功后在設(shè)備端錄制一段音頻通過(guò)訊飛WebSocket或HTTP接口做一句話識(shí)別。這種模式比全時(shí)云端識(shí)別省電、省流量而且用戶體驗(yàn)很自然——只有喊出喚醒詞后才會(huì)啟動(dòng)“聆聽(tīng)”狀態(tài)。喚醒詞多詞表訊飛喚醒SDK通常支持配置多條喚醒詞比如“你好小飛”“小飛小飛”兩個(gè)詞條對(duì)應(yīng)不同編號(hào)。在初始化參數(shù)里配置多個(gè)喚醒詞時(shí)回調(diào)返回的text會(huì)告訴你命中了哪一條可以針對(duì)不同喚醒詞做不同動(dòng)作比如“小飛小飛”調(diào)起助手“關(guān)閉屏幕”直接進(jìn)入休眠。和其他傳感器聯(lián)動(dòng)如果把喚醒SDK放在樹(shù)莓派、Windows盒子這類設(shè)備上喚醒成功后的回調(diào)里還可以發(fā)MQTT消息給其他智能家居設(shè)備實(shí)現(xiàn)“語(yǔ)音控制整個(gè)房間”的效果。最后分享兩個(gè)我實(shí)際積累的小技巧第一個(gè)技巧是務(wù)必給SDK回調(diào)加上超時(shí)自愈。我在長(zhǎng)時(shí)間運(yùn)行喚醒程序時(shí)發(fā)現(xiàn)某些USB麥克風(fēng)偶爾會(huì)“卡死”導(dǎo)致音頻流不產(chǎn)生數(shù)據(jù)程序看起來(lái)還在跑實(shí)際上已經(jīng)完全聾了。后來(lái)我在音頻讀取循環(huán)里加了一個(gè)靜態(tài)計(jì)數(shù)如果連續(xù)3秒讀不出非空數(shù)據(jù)就自動(dòng)重啟音頻流同時(shí)重新初始化一遍喚醒會(huì)話。這個(gè)自愈機(jī)制在最開(kāi)始的聯(lián)調(diào)階段幫了我大忙否則半夜測(cè)試喚醒穩(wěn)定性時(shí)根本不敢跑整宿。第二個(gè)技巧是先跑音頻電平檢測(cè)再跑喚醒。每次換電腦、換麥克風(fēng)、重裝驅(qū)動(dòng)之后不要直接上來(lái)就測(cè)喚醒率先用一個(gè)20行的小腳本讀一下麥克風(fēng)數(shù)據(jù)計(jì)算RMS能量并打印波形幅值。如果能量值一直為零或者異常偏低說(shuō)明設(shè)備權(quán)限、驅(qū)動(dòng)格式有問(wèn)題的概率遠(yuǎn)大于SDK調(diào)用的問(wèn)題。把這一步當(dāng)成習(xí)慣之后幾乎不會(huì)再被“為什么喚醒不觸發(fā)”這種問(wèn)題浪費(fèi)大量時(shí)間了。語(yǔ)音喚醒這個(gè)東西理論上不復(fù)雜但Windows環(huán)境下的坑確實(shí)很雜——從DLL位數(shù)、編碼方式、系統(tǒng)權(quán)限到線程模型任何一個(gè)環(huán)節(jié)出錯(cuò)都會(huì)讓整個(gè)鏈路靜默失敗。希望這篇記錄能幫你少走幾步彎路早點(diǎn)聽(tīng)到那句自己設(shè)備的喚醒詞回應(yīng)。后面有時(shí)間我再寫(xiě)一寫(xiě)如何把這套喚醒能力封裝成Windows服務(wù)讓程序能在后臺(tái)常駐運(yùn)行歡迎關(guān)注。注意由于項(xiàng)目開(kāi)發(fā)環(huán)境和SDK版本差異某些接口名稱可能與你本地的版本不同如果發(fā)現(xiàn)函數(shù)名不一致請(qǐng)以官方頭文件或示例代碼為準(zhǔn)并把本文的代碼當(dāng)作一種結(jié)構(gòu)參考來(lái)使用。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
91在线免费精品视频| 色色无码| 五月天精品| 91久久久久免| 亚洲无码一二三区| 岛国免费视频在线| 亚洲色宗合| 婷婷色香| 按摩中文字幕| 久久久婷婷| 欧美第一页| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 日本一级不卡一二区| 狠狠穞A片一區二區三區| 五十路六十路素人熟女| 99re超碰| 中文字幕三四五区| 性一级黄色录像片网站导航 | 黄色片,com| 农村少妇久久久久久久| 91狠狠狠| 女上位精品在线| 麻豆久久久久久久久丝袜| 国产欧美精选激情视频| 亚洲欧洲中文日韩女优乱码| 78超碰| 国产十八禁视频| 久久久人体| 欧美视频边做饭边橾| 日韩在线地址一| 亚洲动态色图| 欧美日韩狠狠爱| 91色综合色| 成人一区二区三区四区| 成人综合视频久久| 97硬碰| 99999无码| 破苞ⅩXXX性无码动漫无码| 国产精品蜜臀久久久久无码AV| 久久久91| 久久久一区二区三区四区五区| 精品少妇人妻一区二区三区| 91热色| 日韩青久久| 污污污8888| 观看视频图片一区二区三区| 欧洲乱码一区二区| 欧洲精品在线播放| 国产精品白丝AV| 精品久久97| 超碰97综合网| 欧美桃色网| 日本精品久久久久久久| 91视频综合在线| 91操人| 亚洲日韩久久精品一区| 美日韩在线不卡人妻| 夜夜嗨绯色| 日日日色色色色色| 97亚洲综合| 人妻丰满熟妇一区二区三| 高清有码一区二区| 色青青久久影视| 静品嫩模一区二区| 一色网男人的天堂| 亚洲乱色视频一区、二区在线| 天天摸天天插天天日| 在线天堂999| www.高清无码诱惑一区.com | 欧美亚洲91| 一起草高清无码| 亚欧无码线免费观看视频| 亚洲高清无毛一区二区| 99re这里只有精品中心播放| 欧美色天堂网在线视频| 老鸭窝日丰县女人| 国产h小视频在线观看免费| 欧美传媒| 凹凸视频特色日本特黄| 嗯阿好爽好紧| 日韩有码中文字幕女同性恋| 日韩欧美午夜一区二区| 丁香五月激情网| 手机av天堂久久久久| 久婷婷一区| 久久大香蕉97| 日韩在线观看字幕精品| 久久99操天天日| 九九亚洲精品| 中文字幕制服诱惑| 亚洲精品视频在线播放| 好舒服视频| 亚洲熟女人妻中文字幕一区二区| 激情五月天插| 欧美美女自慰一区二区三区| 欧美亚洲特P| 乱伦一二三区| 99青草| 日韩欧美中文字亚洲慕| 乱伦色图网址是多少| 九九探花视频在线观看| 97中文字幕色| 日本不卡二区| 成 人 A V免费视频在线观看| 亚洲第一页第二页激情| 影音先锋日本乱伦| 亚洲AV无码久久久国产精品| 人妻精品4K4K4K4K4| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 欧美性91| www国产天美久久久| 任你草| 东北老女人的激情视频| 在线看污网站| 91色婷婷综合久久中文字幕二区| 日日A∨| 亚洲成人ab| 亚洲第一狼人丝袜美女另类| 亚洲熟妇乱女区二区三区| 色欲色香天天天综合网www-亚洲综合国| 久艹视频在线| 日本3级一区二区免费 | 亚洲欧美91√| 大香蕉免费乱伦视频| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 国产欧美精选自拍一区| 久久性爱视频| 天天爽天天操啊啊啊| 东京日日夜夜| 国产精品美女久久久久久网站| 婷婷综合网| 天天天肏屄肏屄肏屄欧美欧美| 91社操逼| 欧美一区二区三熟女剧情| 黄色电影观看久久9| 国产欧美日韩臀| 大色综合| 清纯唯美激情四射| www.91理论| 亚洲欧美综合网站| 丁香色婷婷| 97av在线观看| 土豪酒店各种姿势玩弄极品幼稚| 丁香六月激情综合| 亚洲天堂在线怕怕视频| 9 9无尺码天堂网| 肉嘟嘟www视频在线观看高清| 成人精品水蜜桃久久久久久久| 竹菊影视国产一区二区| 密臀视频三区免费网站| 情色五月天网| 精品视频日日夜夜| 天天操天天干一区二区 | 9久久美女首页| 亚洲AV成人无码一区二区三区在线观看 | 国产97亚洲| 亚洲欧洲日产国产综合网| 国产区91柔拿会所技师| 91丨九色丨国产丨人妻在线| 亚欧美综合网| 夜夜青青无码影院| 青青伊人久久| 99国产精品久久久久久久成人热| 欧美超碰9798| 91 手机在线播放 绯色| 91久久婷婷| 亚洲αv一区二区三区| 国产精品美女| 久久大黄片| 国产9熟妇视频网站| 久久超碰97中文字幕| 大香蕉伊人亚洲| 婷婷色一区| 亚洲丝袜二区| 亚洲国产精品乱码在线观看| 国产久久一区二区午夜| 色999人与兽| 婷婷五月天成人| 国产无马视频| 大屁股xxxxx| 五月天社区| 欧美成人精品A片免费一区99| 思思热免费视频观看| 国产女人与拘做受视频免费| 国产精品探花视频| 超碰97起碰| 亚洲最大黄网| 久久久111| 久久精品免费| 欧美九一精品久久久熟妇| 亚洲大色鬼| 91精品免费| 亚洲交性| 97WW精品| 一牛一区二区三区久久| 亚洲资源吧| 久久成年片色大黄全免费网站| 国产精品黑人一区二区三区| 999岛国大片| 婷婷久草一区二区三区| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 岛国片国产成人亚洲播放| 国产日本久久免费精品| 一区 欧美 日韩 麻豆| 九一亚洲国产免费| 欧美黄色片AAAAA| 欧美综合骚| 国产熟女精品区| 97超碰欧美| 国产专区第一页| 精品久久久久9999| 欧美精品一二三| 亚洲熟女中文字幕在线| 亚洲色图 综合| 蜜臀一区二区三区在线| 国产少妇肉丝在线观看| 一区二区影视| 熟女人妻久久中文字幕一二区| 伊人九九九| 爆操无码| 久9精品| 色综合20p| 日韩丰满熟妇| 日本久久久久久久久久| 操比国产| 亚洲黄色电影| 超碰79人人乐| 亚洲av无码国产精品字幕| 激情图片伦理国产一区二区日韩| 人人人摸人人| 美女让帅哥通她小鸡鸡| 色色色色网站| 亚洲欧美日韩制服另类| 囯产精品强| 亚洲精品久久久久久久蜜桃臀| 99热线麻豆| 中文字幕 码 自拍 视频 区| 欧美黄色手机在线观看| 亚洲男人的天堂网| 色综合色综合网| 偷拍精品一区二区三区| 后入式在线免费观看60秒| 大香蕉免费乱伦视频| 欧美三级偷拍| 亚洲欧洲无码一区夜| 丁香五月综合| 伊人网综合在线视频| 天天影视综合色| 青青草十区九区爱夜| 天天干天天操天天干天天操| 亚洲欧美高清无码| 骚货 中文字幕 av| 午夜精品久久久久| 欧美最婬乱婬爆婬性视频 | 五月婷色| 日韩AV一起草| 人妻日日干| 嗯嗯啊啊操我| 久久久青青草| 78精品在线| 综合网天天| 日日躁狠狠躁天天躁精品| 神马久久网| 久久av色| 欧美第38页| 久久婷婷影院| 日本高清有码网址视频| 岛园激情| 五月丁香婷婷色| 日亚韩精品视频二区三| 国产97视频免费观看| 成人免费看吃奶视频网站| 久久区| 午夜毛片亚洲精品片国产久久久| 亚洲天天操| 亚洲欧洲av影音| 97超碰人人模人人拍人人| 亚洲欧美日韩中文播放| 日日操免费视频| 美国精品国产精品| 99色视频| 亚洲 综合 第一页| 国产AV中文| 天天视频黄| V A在线| 超碰97人妻在线| 日语五十路和六十路亚洲国产精品| 蜜臀99久久精品久久久懂爱| 日韩美女操b| 人妻少妇av在线观看| 97超碰色五月| 亚洲欧美国产精品久久久久久久| 免费操逼91| 乳欲人妻办公室奶水| 蜜乳av首页| 国产精品久久久久久夜夜夜| 97超碰伊人| 亚洲精品白浆高清久久久久久| 精品伊人久久久大香线蕉小说| 五月天综合| 啊啊啊无码| 久久天堂| 精品亚洲黄色片 国产精品导航一区二区 | 传媒免费一区二区三区| 国产精品 亚洲情色| 国产女人高潮视频| 日本韩高清无砖码22o| 都市激情人妻一区二区青青操视频 | 国产精品伦理| 五月丁香成人网| 一区超碰一区| 日本3级一区二区免费| 日本天天干天天搞一区| 日韩免费高清大片在线| 日本一区二区三区精品| 国产午夜在线观看| 欧美曰韩国产精品| 久久 国产 无码| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 毛片一区二区| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 在线电影亚洲色图| 麻豆国产免费影片| 亚洲91色| 亚洲麻豆18发?| 五月婷婷色色| 奇米狠999| 国产超碰欧美| 日韩精彩免费| www.大香| 91美| 久久久久久91香蕉国产| 亚洲精品人妻在线| 欧美,日韩,中文,另类| 长长久久88视频| 五月天婷婷在线看| 死我十八禁| 欧美一级色| 翔田千里无码一区| 91天天爽| 91精品国产乱码| 亚洲精品视频二区| 色综合色欲色综合色综合色综合| 日韩国产精品人妻无码久久久| 97超碰免费人人性爱| 91人妻Pr| 奇米四色影视777久久久| 综合熟妇一区二区三区| 日日AV加勒比| 毛片视频白嫩| 激情婷婷五月天| 少妇一级无码精品| 九九九精品美女| 最新亚洲风情电影| 91蜜桃婷婷狠狠久久综合9色| 天天操天天射天天日| 97天堂| 91制服丝袜| 99re在线视频国产| 99热99re6国产在线播放| 玖玖爱综合| 亚洲精品 大香蕉| 亚洲码专区| 亚洲AV无码国产精品久久久久| 五月天婷婷在线看| 思思视频免费看网站| 91少妇| 丰满人妻-区二区三区| 又黄又硬又粗又长国产视频| 天天综合色图| 一级乱伦网站| 国产精品白领在线观看 | 蜜乳Av成人片网站| 亚洲高清无码免费观看视频| 啊啊啊啊一区| 久久最新视频免费观看| 国产蜜臀在线| 激情婷婷黑人91| 91亚洲欧洲| ,成人免费啪啪视频| 欧美成人免费在线观看| 一个国产在线综合网站| 国产精品无码在线| 超碰97爽| 久久精品一区二区三区蜜桃臀| 天美传媒AV在线播放| 久久成年片色大黄全免费网站| 日韩激情毛片一级久久久| 在线看的av| 中文字幕啊啊啊在线观看视频| 91亚洲青青草原精品1区| 果冻传媒A片一二三区| 清纯唯美综合| 26uuu国产日韩综合在线观看| 亚洲综合中文字幕有码| 国产精品91一样| 伊人96在线| 少妇久久久| 伊人激情五月天一区二区| 91丝袜美女国产| 骚熟女吞| 激情干在线| 亚洲经典啪啪| 国产蜜臀在线| 超碰无码加勒比| 91亚·色| 国产女大学生AV| 97资源制服丝袜| 蜜臀th| 日韩女模中文造逼| 97视频网站在线观看| 亚洲aV无码成人在线观看| 中文字幕日本久久| 亚洲精品视频二区| 无码逼| 色臀AV| 国产亚洲精品第一最新| 久久久久久91香蕉国产| 国产精品国产自产高清AV| 亚洲国产另类在线中文| 少妇二级| a片 xxxx受爽视频| 日比av无码| 日韩性爱视频免费在线| 欧美性高潮| 吻戏激情性巴克| 亚洲在线A| 91精品大奶人妻| 羞答答AV中文字| 婷婷99| 日韩熟女无码| 青青草中日韩在线| 首页亚洲国产高跟丝袜诱惑视频| 97视频在线观看免费高清| 国产无马av| 亚洲日韩国产精品| 色亚州人久干视频在线观看免费版| 免费在线黄片视频| 国产精品一区二区三| 久久9亚洲| 亚洲精品国产精品乱码不99| 色欲三区| 综合五月天| 很黄很污的免费网站| 无码乱人伦中文视频| 黄色香蕉视频网站一区| 青青久草| 91欧美性| 九九热最新| 欧美激情黑人| 香港久久久| 欧美色亚洲色| 黄页av| 精品视频在线观看精品| 草草电影院| 国产精品无码av嫩草| 美女一区二区国产精品| 99热这里是精品| 97综合在线观看| 男人久久精品| 成人性交免费视屏| 亚洲欧洲日本精品中文a∨| 岛国黄| www.狠狠操| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 婷婷五月丁香五月| 男人久久精品| 国产日本一区二区三区蜜臀在线观看| 乱伦熟女专区| 99精彩视频| 欧美久久婷婷| se..亚洲欧美| 丰满的三级少妇欧美久久久| 色综合加勒比四四季| 久久久青青草| 日本日皮视频逼| 国产农村妇女精品1区二区| 男女香蕉一区二区| 亚欧日韩成人| 爽爽爽免费视频| 美女性91| 91视频国品一二三区| 蜜桃久久精品一区二区三区| 无码操逼视频一下| 99热免费| 国产午夜精品理论片一二三区区| 99热综合| 九九九九88| 综合干干干av久久久综合网 | 蜜臀99久久精品久久久久| 国产精品天堂| 看黄片视频免费| 激情AV| 丁香色色网| 在线只有精品| 精品久一区免费| 嗯嗯啊啊好大好爽| 拍拍拍拍大尺度黄色三级片拍拍拍拍拍照| 欧美日韩人妻婷婷一区| 久久九精品| 伊人宅男大香蕉| 超碰色综合| 欧美性生活男人的天堂| 国产综合网站在线播放| 男人的天堂2019AV| 91精品免费| 亚洲色人阁| 亚洲日韩在线a不卡99精品| 国产成人bd在线观看| 男人的天堂不卡一区二区| 啊好大好舒服| 清纯唯美综合| 青青操综合网| 精品91摸| 91综合网| 强奸xx国产| 欧美aⅴ99久久黑人专区| 天美91| 国产成人无码久久精品| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 色综合久久夜色精品国产天堂| 加勒比性爱成人在线| 97久久超碰| 天天影视综合网欧美精品| 加勒比人妻综合| 99亚洲国产精品色一区二区三区| 97视频网站在线观看| 丝袜美女诱惑 91 视频| 91爱看| 又大又大又大又粗爽高潮观看| 人人人人插| 黄网站黄视频网站进入口| 春色综合网| 精品丝袜无码一区二区三APP| 国产精品青青草| 精品人妻免费观看| 久久手机视直播| 色在线视频导航| 天天看天天综合成人网| 日本大香蕉综合网| 超碰性爱97| 久久无码成人| 天天综合网亚洲综合网| 精品人妻伦一二三区久久| 亚洲人妻中文在线视频| 欧洲乱码视频| 超碰国产在线| 国产日韩欧美亚洲精品95 | 久艾草在线精品视频在线观看| 丁香五月社区| 国产真乱mangent| 激情文学小说一区二区| 久久婷婷伊人| 奇米四色网| 亚欧美综合网。| 久都青青视频 | 色综合91| 97色色视频| 淫荡熟女乱伦网| 超碰免费人妻在线| 色香综合天天影视综合 | www.91色| 人妻一二三区| 熟女人妻精品一区二区视频 | 九区国产| 九九九九九九九九九五码| 婷婷五月天成人网| 午夜理论片在线观看免费| 国产一级不卡在线观看| 人人 操人人 操人人| 放黄片放3级黄片没穿衣服| 性91| 四虎av在线| 久久宗合亚洲| 国产又长又大又粗的视频| x97av| 久久久一区二区| 午夜噜噜噜| 久久久久久久久久久久97| 欧美亚洲色的图| 97国产综合欧美| 超碰97人人乐| 亚洲人妻精品一区二区| 中文字幕视频在线观看| 亚洲天堂在线怕怕视频| 2019久久久久久久久福利| 飘花国产午夜精品不卡| 亚洲国产ⅴ高清在线观看| 极品综合| 日韩激情啪啪| 亚洲中文人妻色| 殴美综合色88| 2017大香蕉国产精品久久| 精品妇操一区二区三区| 九九九九九精品视频| 欧美色宗合| 精品一区二区人妖| 日韩精彩免费| 啊啊啊啊,啊啊好多水| 亚洲天堂2020| 亚洲成人免费中文字幕| 哈哈操电影AV| 殴美色网| 中文字幕亚韩| 97色97好| www.亚洲黄色| 久九九九九九九热| 色婷婷一区二区三区久久午夜成人不| 女优大全 - 91n| 91小视频| 久噜噜| 色牛aV| 91色婷婷综合久久中文字幕二区| 亚洲男人的天堂V| 久操免费电影| 五月天大香蕉| 91热热色| 久久免费精品视频免一| 嫩草伊人久久精品| 精品偷拍13p欧美dodk视频| 精品美女在线视频| 成人无遮挡毛片免费看| 天天做天天爱天天爽AV| 曰韩人妻中文字幕在线| 大鸡吧尹人在线| 日韩精品一区二区人人人| 中文字幕 国产 精品| 足交视频老司机| 亚洲精品三区在线观看| 大屁股国产在线视频| 欧美日韩国产另类综合| 偷拍在线观看视频| 国产精品大香蕉| 激情小说在线视频| 九九久久国产精品| 99精品在线播放| 欧美翘臀视频网站一区二区三区| 91蜜臀在线久久久久| 操东北女人| yazhousetuoumei| 美女国产一区二区久久 | 亚洲宗合网| 狠狠激情综合狠狠操中文字幕| 骚女天天综合网| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 婷婷99狠狠躁天天躁| 熟妇人妻精品一区二区| 九九九九九九九九九九九免费国产| 中文字幕奈奈美被公侵犯| 久久久久久久久女黄| 国产超碰国产97| 国产亚洲欧美每日在线| 蜜桃香蕉久草精品在线| 91色综合激情| 精品视频123区小说区| 免费A V在线播放| 秋霞网无码| 人妻中文字幕精品无码| 91欧| 欲色综合| 久草看看看| 亚洲欧美天| 国产污视频麻豆传媒一区二区| 日韩激情中文字幕有码| 国产欧美日韩一区二区三区| 自拍偷拍国产欧美日韩韩| 青青草公开在线免费不卡视频| 国产精品 午夜福利| 亚洲 欧美 中文 日韩超碰| 97精品综合久久| 国内毛片无码一级毛片| 亚洲国产91精品一区二区久久| 美女91| 中文字幕精品码亚洲| 超碰一区二区| 超碰97首页| 死我十八禁| 在线观看啊啊啊啊啊| 蜜桃传媒视频第一区入口在线看| 无码人妻丰满熟妇区毛片| 亚洲人精品午夜不卡| 国产情色在线| 久久久久久久九九九九| 久久久一区二区三区麻豆| 九七人妻在线| 成人九九| 日韩大香蕉AV影片| 蜜乳中文字幕a在线| 国产在线观看一区二区三区| 岛国在线国产| 国产精品久久久久久久黄无码| 日韩丝袜二区| 麻豆60秒| 任我爽在线视频免费观看| 日韩97精| 麻豆国产97在线| 亚欧高清在线| yazhousetuoumei| 中文字幕免费在线观看| 曰韩操B| 91久久精品国产| 91操人| 1区2区3区视频| 美国一区二区三区视频| 插入综合网| 98超碰欧美| AV污污污污| 素人美腿视频网站| 中文字幕免费在线观看| 亚川综合视频| 熟女丝袜视频| 精品少妇一区二区| 综合欧美日本三级| 97在线日韩中文字幕| 国产欧美成人第一页在线观看| 亚洲不卡AV在线| 干妹子| 亚洲 欧美 日韩 国产一区二区 | 蜜臀无码一区二区| 欧美日韩啪啪电影| 国产亚洲在线| 人妻熟女一区二区三区视频| 色999;丁香五月| 亚洲在线观看| 美女人妻色网站| 91五十路| 男人的天堂成人的社区| 99无码狠狠久久| 嗯嗯啊啊用力视频免费| 亚洲国产ⅴ高清在线观看| 美女黑人91神马| 欧美成人午夜免费福利785| 狠狠爱夜夜| 一区二区中文| 爽爽歪在线视频| 爱逼综合| 黑人中出21连凳花野真衣| 欧洲亚洲国产综合在线| av影院十区| www.狠狠干.coom| 亚洲高清国产理伦片| 色九九久九九| 亚洲中文字幕乱码无码一区二区 | 黑人精品欧美一区二区蜜桃| 手机看av网站在线看| 熟女熟妇一区二区三四区| 久久久一级| 亚洲系列第一页| 久9九综合在线| 国产999精品久久久久久| ji熟女.com| 久久人| 欧美女同在线| 女生自91网站| 91肏屄网| 2020视频1区2区3区| av亚欧| 99热伊人| 一起草在线视频| 欧美97av| q2午夜理论片夜色av| 不卡中文字幕aⅴ在线| 97视频在线免费播放| 欧亚乱色熟一区二区三四区| 久热伊人| 国产精品国产拍高清AV| 黄色片大香蕉| a在线视频免费观看| 伊人色综合网电影| 久久成人国产| 日韩不卡毛片Av免费高清| 秋霞免费AV| 九九碰九九爱97超碰| 婷婷五月影院| 东京热一区二区三区四区五区六区| 久久久蜜桃一区二区三区| 国产成人网址| 96久久科窝| 97超碰亚洲| 色男人色天堂东京热| 亚洲欧美综合网站| 精品视频一区二区| 在线观看高清AV| 国产三级中文有码在线视频| 国产欧美一区激情交| 国产激情久久| 嫩草 人人网精品| 青青草乱入乱欲视频在线观看| 东京热熟女亚洲视频网站| 玖玖爱伊人玖玖爱| 久久春色| 一区二区乱码福利| 综合国产影视三级| 留下AⅤ黄色片| 一级免费啪啪片| 91偷拍欧美亚洲| 免费精品AB| 国产亚洲精品久久久久小| www色色com| 久9久9精品| 97超碰人妻| 乱伦图av| 久热久操| 无码高清操逼网址| 六月激情网| 91伊人久久在线| 国产精品原创巨作?v网站| 欧美在线视频99| 黄站在线免费观看| 人妻乱仑一区二区三区| 人妻五十路在线| 少妇一级婬片免费放一级a性色.| 97视频在线观看播放与子乱对白在线……| 日韩精品系列| 图片区小说区| 91插B网站| 啪一啪免费视频| 精品九九九九九九九九九| 日韩成人在线性爱视频| 好淫网一二三视区| 人人搞人人插人人操| 99亚洲天堂| 97超碰色色| www.狠狠干.coom | 成人线上超碰| 懂色AV一区二区三区| 久久人妻| 日日天天久久啊啊aaa| 绯色一区二区三区不卡少妇| 色婷婷狠狠| 激情欧美97| 夜夜操91744565| 中文字幕蜜乳av| 91亚洲精品青草| 国产资源中文字幕在线| 麻豆区99999| 日日操丁香五月天| 长久操视频| 婷婷五月天影院| 天天干嫩逼网| 性老妇一区二区三区| 国产精品人人爽人人做可爱福利| 丰满人妻一区| 丝袜美腿欧美| 18禁精品网站在线看| 亚洲精品久久久久久| 99青草| 精品国产乱码久久久久久口爆网站| 青青草依人大香蕉| 久噜噜| 午夜激情床戏激情| 亚洲综合网图| 上床啊啊啊| 大香蕉久| 成人日本精品九区| 人妻啪| 欧美性天天影院| 亚洲 一区二区 自拍| 日韩特一级久久| 天天插天天射| 日本影视久久免费| 国产suv精品一区二区四区999 | 日韩三A大片在线观看| 国产13区| 黄色免费网页无码| 伊人宅男大香蕉| 欧美日韩高潮喷水91| 国产又猛又粗又爽又黄| 丝袜美腿校园春色| 欧美黄片视频在线观看免费 | 日本高清视频在线观看黄已三辽| 日韩999| 69一区二区三区| 91爰爱欧美| 免費黃色視頻觀看一| 在线a亚洲视频播放在线| 久婷婷一区| 一区二区三区精品久久| 国产97亚洲| 熟女一区二区三区| 婷婷综合网| 国内偷自视频区视频综合| 99热8| 亚洲国产综合久久天堂| 欧美黄色大片在线观看 | 精品午夜福利| 在线视频五十市| 超碰成人免费| 亚洲成aⅴ人片不卡无码| 色九九久九九| 欧美精品第四五页中文字幕在线观看| 日韩乱插| 日B操| 午夜一区| 久久华人网| 精品国产网站| 色色操| 国产野战露脸在线播放| 精品久| 啊啊啊啊啊啊啊啊啊在线观看| 亚洲国产欧美日韩人妻日中文| 丰满岳乱妇一区二区三区| 欧美综合亚洲综合| 国产人妻精品一区二区三区秋霞 | 男人综合网| 少好三P| 香一区二区三区| 激情五月天色色| 操逼片国产| 亚洲人成网站7777| 久久老熟女| 人妻少妇久久| 91丝袜激情在线| 国产性感骚丝袜在线| 亚洲精品国产日韩无码AV永久免 | 最新国产亚洲精品精品国产亚洲综合| 好吊色综合| 男人的天堂99| 9997se| 99爱爱| 又黄又粗又硬又长又大| 午夜呻吟欧美| 天天日天天色| 午夜丁香| 岛国福利在线精品播放| a片自拍直播视频| 久久69| 中文字幕丝袜| 欧成人精品一区二区三区| 好爽免费视频,| 久久九操在线观看| 搞中出视频在线观看| 麻豆精品天美| 校园春色制服丝袜中文字亚洲| 久久婷婷精品| 天天综合,91综合永久| 婷婷九月色| 婷婷五月av| 成人性爱电影网| 国产亚洲综合欧美一区| 女同性恋久久| 日本九九九九| 色性综合| 亚洲少妇色| 偷窥自拍亚洲色图| www.狠狠干.coom| 91九九九馒头| 欧洲中文字幕| 亚爽爽爽爽爽爽爽爽| 国产美女口爆吞精| 国产吹潮女在线观看| 91欧美美女日韩国产婷婷| 欧美日韩大陆黑人少妇99| 91爱欧美| 福利五区| 久久免费少妇| 国产精品点击进入在线影院高清| 国产午夜福利专区综合| 澳门色噜噜色噜噜色噜噜色噜噜色噜噜| 欧美性性性| 人人操 欧美| 秋霞成人一级在线观看| 嫩草影院性色| 日韩啪啪视频| 蜜臀AV一区二区三区激情综合| 日韩中文字幕av在线播放| 搞中出视频在线观看| 97在线观看免费| 99热这里都是精品| 肏逼福利网站| 中文人妻av高清一区| 精品国产久热在线观看| 欧美亚洲激情小说| 亚洲成人妻日韩在线| 97人人夜| 视频国产欧美在线播放| 色噜噜精品一区二区三| 日日干夜夜干| 国产亚洲日本| 78操B| 黄色片A级一区二区三区| 久久免费精品视频免一| 精品国产一区二区三区av在线资源| 黄色不卡视频| 久久系列| 日逼逼免费看| 亚洲成人av色网| 亚洲激情天堂网| 久久内射| 国产精品蜜乳AV| 天天狠| 日本不卡免费二区| 欧美日本成人一区二区| 欧美特大黄一级片片免费| 国产激情综合| 97超碰精品成| 久久亚洲中文字幕视频| 探花一区在线| 天天α片| 亚洲人精品久久久| 国产精品毛片?v一区二区三区 | 视频在线97| 欧美一区二区三区四区综合| 色区久久| 死我十八禁| 香蕉国产精品麻豆亚洲欧美日韩| 天天插天天操| 欧美91久久久久| 偷拍精品一区二区三区| 婷婷久久综合久| 色娱乐色呦呦夜夜夜夜av| 久久狠狠色噜噜狠狠狠狠97| 国内三级自拍小视频在线观看| 诱惑人妻欧美一区在线播放| 久久九色| 日韩成人电影AV| 麻豆a'v电影| 中文字幕中文字幕一区二区| 天天影视网综合少妇| 97亚洲色图| 亚洲无码一二三区| 日韩美女,国产传媒,视频一区| 免费精品无码一级毛片牛牛影视| 高清国产av无码| 亚洲天天精品| 12一15性XXXX粉嫩国产| 亚洲人精| 国产免费一区2区3区| 人妻久久久久久| 98超碰欧美| 久久婷婷视频| 亚洲男人天堂视频| 五月天丁香婷婷综合网站| 免费看污网址| 国产精品分类在线观看| 在线女人91| 国产精品白丝| 大香蕉伊人色偷偷在线| 91 天天综合| 日本福利二区视频| 亚洲综合在线91| 操逼操逼视频操逼| 好舒服视频| 国产浮力影院第1页| 一区二区三区色综合| 欧美黑人精品一区二区| 爱丝福利| 爱做久久久久久| 亚洲男人的天堂va亚洲男人社| 国产伦精品一区二区三区在线观| 久草色在线观看| 日韩一级二级| 不卡在线观看视频| 欧洲免费一区二| 岛国激情视频软件| 欧美天堂超碰97| 青青操狠狠撩| 精品夜夜澡人妻无码AV| 五月天啪啪| 小说区 图片区色 综合区| 国产传媒日本欧美专区| 亚洲中文字幕久久人妻| 久9久9久9久9久9久9| 超碰精品在线| 婷婷操视频| 欧美性综合| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 色臀aV| 欧美操逼一二三区| 毛片一区二区| 色臀aV| 成人无码电影在线观看网| 欧美在线|亚洲| 欧美性爱97超碰| 日韩有码 一区二区三区| AV色五月天| 69人妻精品一区二区绯色| 91丝袜在线观看| 91精品国产乱码| 青青草九九九九九| 女同女同恋久久级三级| 久夜操| 亚洲熟妇熟在线电影视频| 九月丁香综合网| 亚洲精品久久久久毛片A片拉屎 | 国产三区免费在线观看| 97资源站日韩| 嫩草 人人网精品| 天天看,天天做| a亚洲欧美色欲| 蜜臀无码一区二区| 国产视频三区四区| 最新啪啪视频| 搡老女人老熟女91| 久久久九九| 综合网欧| 三级片网站在线播放| 精品国产无码中文| 婷婷五月天激情四射| 国产乱码精品久久久久久| 天天综合网一91网| 抽插无码高清一区| 啪啪性爱免费视频| 東南亚性呦成人伦理资源在线视频| www.91欧美| 亚洲丝袜色| 韩国一级婬片A片AAAAA| 吖在线不卡一区二区国产剧情| 91精品国产91久久久久久久久久久久| 久久精品老司| 一品道视频一区二区三区| 国产精品无码av嫩草| 中文字幕第9页萱萱影音先锋 | 91亚洲人电影| 91黑人无码激情在线| 中国一级特黄大片护士| 欧美激情精品| 97伊人超碰| 国产精品色| 夜夜騷av、一區二區| 嗯嗯,啊啊,国产精品| 国产原创自拍| 亚州操逼网| 最新日产中文在线麻豆| 欧美黄色片在线播放| 白丝AV| 少妇久久久久久久久| 青青草一区二区高清无码视频| 精品一二三区女同| 亚洲欧美日韩电影网站一区| 国产精品欧美激在线| 97超级久久强资源| 亚洲最大91网| 欧美色三级片91| 婷婷色色五月天| 另类天堂| 亚洲熟妇自偷自拍另欧美| 久精品无码av一区二免费国产在线观看 | 91久久精品中文字幕| 午夜a成v人电影| 九九九精品成人免费视频小说| 九九九九久久久久| 精品无码少妇| 亚洲三级网址久久最新| 久草婷婷| 欧美综合色综合| 热的中文 热的有码 热的国产| 日韩美女高潮喷水视频| 超碰99热| 男人兔费天堂| 日本在线不卡123| 色婷婷五月综合激情中文字幕| 3d成人精品一区二区| 午夜久久无码1000合集| 深夜激情无码| 国产树林里野战在线看| 五月天激情四射| 国产suv精品一区二区四| 人妻久热在线| 夜夜嗷嗷一区二区|