色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

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

ESP32 AI玩偶連續(xù)對(duì)話重構(gòu):WebSocket全雙工音頻鏈路實(shí)踐

ESP32 AI玩偶連續(xù)對(duì)話重構(gòu):WebSocket全雙工音頻鏈路實(shí)踐 前兩天有個(gè)朋友問(wèn)我你們那個(gè) ESP32 AI 玩偶為什么每次問(wèn)完一句話都要轉(zhuǎn)圈等半天能不能像人一樣我說(shuō)上半句它就能接下半句我說(shuō)到一半它還能自己停下來(lái)這個(gè)問(wèn)題一下就戳中了我一直在做的重構(gòu)。老版本的玩偶用的是“按鍵對(duì)講”式交互按住說(shuō)話、松開(kāi)識(shí)別、轉(zhuǎn)圈等待、播放回答整個(gè)鏈路是半雙工的體驗(yàn)很像對(duì)講機(jī)。這次我和團(tuán)隊(duì)一起把音頻鏈路整體換成了 WebSocket 二進(jìn)制直連讓 ESP32 端持續(xù)推流音頻服務(wù)端流式識(shí)別和合成再通過(guò)二進(jìn)制幀把音頻一塊一塊推回給玩偶真正做到全雙工的連續(xù)對(duì)話體驗(yàn)。文章會(huì)從協(xié)議設(shè)計(jì)、ESP32 端采集上行、服務(wù)端流式處理、打斷控制、狀態(tài)機(jī)、穩(wěn)定性和踩坑排查幾個(gè)方面展開(kāi)每一步都有可直接落地的代碼、參數(shù)和思路適合正在做低成本 AI 硬件原型、想把“能對(duì)話”升級(jí)成“連續(xù)對(duì)話”的開(kāi)發(fā)者參考。1. 這個(gè)重構(gòu)到底在解決什么問(wèn)題1.1 老版“按鍵通話”模式的三個(gè)硬傷先說(shuō)說(shuō)我為什么要?jiǎng)邮种貥?gòu)。老版本的架構(gòu)很簡(jiǎn)單玩偶上有一個(gè)觸摸按鍵用戶按住說(shuō)話ESP32 錄一段音頻松開(kāi)按鍵后這段音頻通過(guò) HTTP POST 上傳到服務(wù)器服務(wù)器做 ASR 識(shí)別、再丟給 LLM 生成回復(fù)、TTS 合成語(yǔ)音最后把 MP3 文件地址返回ESP32 下載并播放。聽(tīng)著好像沒(méi)什么問(wèn)題但實(shí)際用起來(lái)有三個(gè)讓我抓狂的硬傷。第一個(gè)是交互節(jié)奏太慢。一次完整的問(wèn)答應(yīng)答鏈路里音頻上傳少則幾百毫秒服務(wù)器識(shí)別和生成回復(fù)少則兩三秒再算上播放 MP3 文件前要等整個(gè)文件下載完用戶從松開(kāi)按鍵到聽(tīng)到回答經(jīng)常要等 4 到 6 秒。成人等得起小朋友等不起等待超過(guò)兩秒就開(kāi)始亂按按鍵整個(gè)對(duì)話就亂掉了。第二個(gè)是用戶不能打斷。玩偶正在“說(shuō)話”的時(shí)候用戶沒(méi)辦法插話因?yàn)殒溌肥前腚p工的要么在錄音上傳要么在下載播放兩個(gè)方向不會(huì)同時(shí)跑??烧鎸?shí)對(duì)話里打斷和被搶話是最自然不過(guò)的事情。用戶都覺(jué)得它說(shuō)錯(cuò)了我就該能立刻喊停讓它重聽(tīng)我的指令。第三個(gè)是“一次一問(wèn)”缺乏上下文連續(xù)感。老版每次對(duì)話都是全新會(huì)話玩偶不記得上一句也不理解用戶會(huì)在兩句話之間停頓很久更不會(huì)在你還沒(méi)把話說(shuō)完時(shí)就“等著你”。所以體驗(yàn)是純問(wèn)答不是對(duì)話。1.2 連續(xù)對(duì)話需要什么樣的音頻鏈路連續(xù)對(duì)話和按鍵問(wèn)答的差異核心在于全雙工和流式處理。全雙工的意思是上行音頻和下行音頻可以同時(shí)跑流式處理的意思是客戶端一邊采集數(shù)據(jù)一邊發(fā)送服務(wù)端一邊接收一邊識(shí)別識(shí)別結(jié)果不再需要等整段音頻全部傳完TTS 合成出的語(yǔ)音也按幀發(fā)送而不是等整段合成完再一次性下發(fā)。要做到這一點(diǎn)需要滿足幾個(gè)硬條件端側(cè)有持續(xù)采集音頻的能力而不是按一次錄一段上行鏈路是長(zhǎng)連接可以一直推流而不是每次單獨(dú)建一個(gè) HTTP 請(qǐng)求服務(wù)端能對(duì)同一音頻流做增量識(shí)別能夠判斷什么時(shí)候是靜音、什么時(shí)候是停頓下行鏈路也能流式傳輸音頻播放器要有局部緩沖能力不能每來(lái)一個(gè)音頻包就立刻播放否則網(wǎng)絡(luò)抖動(dòng)會(huì)讓語(yǔ)音一頓一頓用戶可以在播放中繼續(xù)上行說(shuō)話服務(wù)端需要用“打斷”信號(hào)把下行語(yǔ)音切掉并切回識(shí)別狀態(tài)。相比傳統(tǒng) HTTP 上傳WebSocket 幾乎是天然為這種場(chǎng)景準(zhǔn)備的它天然支持全雙工TCP 連接建立后雙向都可以隨時(shí)發(fā)數(shù)據(jù)不需要反復(fù)握手同時(shí)它支持二進(jìn)制幀我們可以把音頻數(shù)據(jù)、控制命令、序列號(hào)、時(shí)間戳都封裝在一個(gè)自定義幀里。這個(gè)消息設(shè)計(jì)是整個(gè)重構(gòu)的地基也是我認(rèn)為最值得仔細(xì)講的部分。2. WebSocket 二進(jìn)制音頻鏈路的協(xié)議設(shè)計(jì)2.1 為什么選 WebSocket 而不是 RTMP 或 HTTP/2我評(píng)估過(guò)三個(gè)方案RTMP、WebSocket、HTTP/2 的流式上傳加 SSE 下行。RTMP 是成熟的流媒體協(xié)議做音視頻直播很穩(wěn)但對(duì) ESP32 這種資源受限設(shè)備來(lái)說(shuō)太重了協(xié)議棧復(fù)雜握手繁瑣而且很多服務(wù)端組件并不是為低延遲“對(duì)話式”場(chǎng)景設(shè)計(jì)的。HTTP/2 的流式能力很強(qiáng)服務(wù)端推流也很方便但 ESP32 端要支持 HTTP/2 需要加密和 HPACK 頭壓縮底層網(wǎng)絡(luò)棧的開(kāi)銷(xiāo)明顯比 WebSocket 大。WebSocket 勝在簡(jiǎn)單直接基于 TCP 的長(zhǎng)連接客戶端和服務(wù)端實(shí)現(xiàn)都成熟ESP32 的 ESP-IDF 里自帶 esp_websocket_client 組件服務(wù)端用 Go 的 gorilla/websocket 或者 nhooyr.io/websocket 都行。它還有現(xiàn)成的 Ping/Pong 控制幀配合應(yīng)用層的心跳能讓我非常清晰地判斷連接是不是還活著。最終我選 WebSocket主路線是 ws:// 明文等部署到生產(chǎn)環(huán)境再考慮 wss://。2.2 二進(jìn)制幀格式一次頂一個(gè)協(xié)議音頻數(shù)據(jù)如果用 WebSocket 的文本幀傳要先做 Base64 編碼體積膨脹 33%加解碼開(kāi)銷(xiāo)完全沒(méi)有必要。我直接用二進(jìn)制幀而且自定義了一個(gè)很精簡(jiǎn)的頭部結(jié)構(gòu)。WebSocket 的 frame payload 本身就帶長(zhǎng)度信息所以我只需要在 payload 最前面加一小段“頭部”用來(lái)表達(dá)消息類(lèi)型、序列號(hào)和時(shí)間戳。我這里定義每幀 payload 的結(jié)構(gòu)如下第 0 字節(jié)消息類(lèi)型opcode1 字節(jié)無(wú)符號(hào)整數(shù)第 1~4 字節(jié)序列號(hào) seq4 字節(jié)大端無(wú)符號(hào)整數(shù)用來(lái)做丟包檢測(cè)和重排第 5~8 字節(jié)時(shí)間戳 ts4 字節(jié)大端無(wú)符號(hào)整數(shù)單位是采樣數(shù)表示這一段音頻在采樣時(shí)間軸上的位置從第 9 字節(jié)開(kāi)始真正的業(yè)務(wù)數(shù)據(jù)音頻幀或控制命令。消息類(lèi)型我留了 4 種后面如果要擴(kuò)展還可以繼續(xù)加opcode方向含義0x01客戶端 → 服務(wù)端上行音頻幀攜帶 PCM 數(shù)據(jù)0x02服務(wù)端 → 客戶端下行音頻幀攜帶 TTS 音頻數(shù)據(jù)0x03雙向文本/元數(shù)據(jù)比如識(shí)別中間結(jié)果、設(shè)備信息0x04雙向控制命令如打斷、心跳、重連協(xié)商這種結(jié)構(gòu)的好處是一條 WebSocket 連接上既能傳音頻數(shù)據(jù)又能傳控制指令還不會(huì)互相干擾。服務(wù)端解碼時(shí)只要判斷 opcode就可以決定把 payload 交給音頻處理管線還是控制命令處理管線。2.3 心跳、序列號(hào)與音軌對(duì)齊網(wǎng)絡(luò)設(shè)備千奇百怪尤其是家用的路由器動(dòng)不動(dòng)就會(huì)把長(zhǎng)時(shí)間空閑的 TCP 連接斷開(kāi)。WebSocket 在 TCP 之上TCP 被斷開(kāi)時(shí)應(yīng)用層如果一直不收發(fā)數(shù)據(jù)就可能很久之后才發(fā)現(xiàn)連接已經(jīng)死了或者干脆出現(xiàn)半開(kāi)連接。所以我在幀設(shè)計(jì)里加了兩個(gè)機(jī)制。第一個(gè)是應(yīng)用層心跳。每隔 5 秒客戶端發(fā)一個(gè) opcode 為 0x04 的控制幀控制幀內(nèi)部用一個(gè)子字段表示心跳請(qǐng)求服務(wù)端收到后回復(fù)心跳響應(yīng)。如果連續(xù)三次心跳沒(méi)有收到響應(yīng)客戶端就認(rèn)為鏈路已經(jīng)失效主動(dòng)斷開(kāi)重連。注意這里心跳的間隔不能太短太短會(huì)增加無(wú)線模塊的喚醒次數(shù)抬高 ESP32 的功耗也不能太長(zhǎng)太長(zhǎng)則無(wú)法及時(shí)感知鏈路異常。實(shí)測(cè) 5 秒比較合適。第二個(gè)是序列號(hào)。在弱 WiFi 環(huán)境下就算 TCP 能保證數(shù)據(jù)不重復(fù)不亂序但重傳導(dǎo)致的延遲抖動(dòng)依然會(huì)讓音頻播放不連貫。有了 seq客戶端可以判斷自己收到的音頻幀是否有空洞有了 ts播放器可以計(jì)算 jitter buffer 的基準(zhǔn)點(diǎn)。音頻傳輸不要只看瞬時(shí)到達(dá)的速度更重要的是播放端能否維持穩(wěn)定的節(jié)奏。3. ESP32 側(cè)音頻采集、編碼與上行發(fā)送3.1 硬件選型與麥克風(fēng)/喇叭的接法我用的核心板是 ESP32-S3-WROOM-1 模組配 8MB PSRAM板子是 ESP32-S3-DevKitC-1。為什么選 S3因?yàn)樗懈渥愕?RAM有原生 USB 燒錄調(diào)試口AI 推理和 DSP 指令也比老 ESP32 強(qiáng)不少做音頻緩沖時(shí)不用太摳內(nèi)存。麥克風(fēng)用的是 INMP441 數(shù)字 MEMS 麥克風(fēng)走 I2S 接口。注意 INMP441 是 PDM 輸出的只是它內(nèi)部集成了數(shù)字接口直接用 I2S 協(xié)議去讀就行。喇叭功放用 MAX98357A 這種 D 類(lèi)功放模塊同樣走 I2S。這樣設(shè)計(jì)最大的好處是麥克風(fēng)采集和喇叭播放共用一條 I2S 總線不用額外占用模擬引腳抗干擾能力也比板載模擬麥克風(fēng)好太多。接線我列一下方便直接抄外設(shè)引腳ESP32-S3 GPIO說(shuō)明INMP441 SCKGPIO4I2S BCLK 位時(shí)鐘INMP441 WSGPIO5I2S LRCLK 左右聲道時(shí)鐘INMP441 SDGPIO6數(shù)據(jù)輸出MAX98357A BCLKGPIO4與麥克風(fēng)共享位時(shí)鐘MAX98357A LRCGPIO5與麥克風(fēng)共享 LRCLKMAX98357A DINGPIO7數(shù)據(jù)輸入兩者電源3.3V / GND注意共地這里有個(gè)很關(guān)鍵的坑MAX98357A 和 INMP441 最好用同一個(gè) 3.3V 電源域并且功放的電源要加 100uF 電解電容和 0.1uF 陶瓷電容并聯(lián)去耦。如果不加喇叭播放大動(dòng)態(tài)音頻時(shí)電源電壓會(huì)被拉低INMP441 的輸出就會(huì)帶上明顯的“電源噪聲”語(yǔ)音識(shí)別率直線下降。這個(gè)問(wèn)題我在 7.2 節(jié)里還會(huì)細(xì)說(shuō)。3.2 用 I2S DMA 連續(xù)采樣 16bit PCM在 ESP-IDF 里配置 I2S 非常簡(jiǎn)單但要注意版本差異。ESP-IDF 5.x 之后 I2S 驅(qū)動(dòng) API 和舊版 4.x 完全不兼容我這里按 5.x 的新驅(qū)動(dòng)寫(xiě)。配置成標(biāo)準(zhǔn) TDM 模式采樣率 16000位深 16bit單聲道內(nèi)置 DMA 緩沖。#include driver/i2s_std.h i2s_chan_handle_t rx_chan NULL; i2s_chan_handle_t tx_chan NULL; i2s_chan_config_t chan_cfg { .id I2S_NUM_0, .role I2S_ROLE_MASTER, .dma_desc_num 8, .dma_frame_num 240, .auto_clear true, }; i2s_new_channel(chan_cfg, tx_chan, rx_chan); i2s_std_config_t std_cfg { .clk_cfg { .sample_rate_hz 16000, .clk_src I2S_CLK_SRC_DEFAULT, }, .slot_cfg { .slot_mode I2S_SLOT_MODE_MONO, .data_bit_width I2S_DATA_BIT_WIDTH_16BIT, .slot_bit_width I2S_SLOT_BIT_WIDTH_16BIT, .slot_mask I2S_STD_SLOT_LEFT, }, .gpio_cfg { .mclk I2S_GPIO_UNUSED, .bclk GPIO_NUM_4, .ws GPIO_NUM_5, .dout GPIO_NUM_7, .din GPIO_NUM_6, }, }; i2s_channel_init_std_mode(rx_chan, std_cfg); i2s_channel_init_std_mode(tx_chan, std_cfg); i2s_channel_enable(rx_chan); i2s_channel_enable(tx_chan);dma_frame_num 我配成 240240 × 16bit × 2(雙聲道占位) 960 字節(jié)一個(gè) DMA 描述符8 個(gè)描述符就是 7680 字節(jié)的環(huán)形緩沖。這個(gè)數(shù)值不是隨便拍的DMA 幀數(shù)太小會(huì)導(dǎo)致中斷頻繁CPU 占用高太大則采集延遲變大。實(shí)測(cè) 240 幀、16000Hz 下每個(gè) DMA 塊對(duì)應(yīng)約 30ms 音頻反應(yīng)速度在玩具場(chǎng)景里完全可以接受。采集循環(huán)只需要不停調(diào)用 i2s_channel_read讀到一定長(zhǎng)度的 PCM 數(shù)據(jù)就攢進(jìn)一個(gè)發(fā)送隊(duì)列int16_t pcm_buf[320]; // 20ms 16kHz size_t bytes_read 0; esp_err_t ret i2s_channel_read(rx_chan, pcm_buf, sizeof(pcm_buf), bytes_read, 100 / portTICK_PERIOD_MS); if (ret ESP_OK bytes_read sizeof(pcm_buf)) { // 送到編碼或發(fā)送任務(wù) xQueueSend(audio_queue, pcm_buf, 0); }一次讀 320 個(gè)采樣正好是 20ms 的音頻快。為什么選 20ms因?yàn)楹芏?ASR 服務(wù)商對(duì)音頻分幀的最佳長(zhǎng)度就是 20ms 到 40ms20ms 的包大小適中即使加頭部整幀 WebSocket 消息也只有 650 字節(jié)左右無(wú)線鏈路一次就能發(fā)完不至于被底層 TCP 拆成多個(gè)小包造成無(wú)效重傳。3.3 本地 VAD什么時(shí)候該把音頻發(fā)出去如果 ESP32 采集到的所有音頻都無(wú)腦推給服務(wù)端服務(wù)端會(huì)被大量靜音數(shù)據(jù)淹沒(méi)ASR 也容易在無(wú)人說(shuō)話時(shí)產(chǎn)生幻覺(jué)識(shí)別。更可怕的是全雙工鏈路里下行播放的喇叭聲音會(huì)被麥克風(fēng)采進(jìn)來(lái)形成自激干擾。所以本地必須有一個(gè) VAD語(yǔ)音活動(dòng)檢測(cè)只把有效語(yǔ)音推上行。我用的方案是先做能量閾值檢測(cè)再做靜音尾判定。具體來(lái)說(shuō)對(duì)每一段 20ms 的音頻計(jì)算 RMS 值uint32_t sum 0; for (int i 0; i 320; i) { int32_t v pcm_buf[i]; sum (uint32_t)(v * v) 4; } uint32_t rms (uint32_t)sqrt(sum / 320);如果 RMS 大于某個(gè)閾值我習(xí)慣用 300 到 800 之間具體數(shù)值要靠板子實(shí)測(cè)因?yàn)辂溈孙L(fēng)增益差異很大就認(rèn)為有人聲開(kāi)始進(jìn)入“說(shuō)話中”狀態(tài)持續(xù)把音頻推給服務(wù)器。當(dāng)連續(xù)若干幀 RMS 都低于閾值比如 30 幀也就是 600ms 靜音就判定說(shuō)話結(jié)束給服務(wù)端發(fā)一個(gè)“語(yǔ)音結(jié)束”控制幀。這里我的經(jīng)驗(yàn)是靜音尾巴不要設(shè)太短否則會(huì)覺(jué)得“搶話”用戶停頓半秒想一下措辭也會(huì)被判定為說(shuō)話結(jié)束。也不要設(shè)太長(zhǎng)否則回答延遲會(huì)變高。600ms 到 1000ms 是常見(jiàn)區(qū)間。另外如果 ESP32-S3 內(nèi)存富余可以考慮用 ESP-SR 里的 WakeNet 做喚醒詞檢測(cè)把“小貝小貝”喚醒和 VAD 結(jié)合體驗(yàn)會(huì)更自然。我在原型里是先做成 WakeNet 喚醒 能量 VAD效果已經(jīng)很接近真實(shí)對(duì)話了。3.4 把 PCM 包成二進(jìn)制幀并走 WebSocket 上行發(fā)送邏輯我就直接基于 esp_websocket_client 實(shí)現(xiàn)。連接建立后單獨(dú)開(kāi)一個(gè)“音頻發(fā)送任務(wù)”從隊(duì)列里拿 PCM 數(shù)據(jù)拼裝成二進(jìn)制幀再發(fā)送。typedef struct __attribute__((packed)) { uint8_t op; uint32_t seq; uint32_t ts; } audio_pkt_head_t; static uint32_t g_seq 0; static uint32_t g_ts 0; void send_audio_pcm(int16_t *pcm, size_t sample_count) { size_t payload_len sizeof(audio_pkt_head_t) sample_count * sizeof(int16_t); uint8_t *buf heap_caps_malloc(payload_len, MALLOC_CAP_SPIRAM); audio_pkt_head_t *hdr (audio_pkt_head_t *)buf; hdr-op 0x01; hdr-seq htonl(g_seq); hdr-ts htonl(g_ts); memcpy(buf sizeof(audio_pkt_head_t), pcm, sample_count * sizeof(int16_t)); esp_websocket_client_send_bin(g_websocket, (char *)buf, payload_len, pdMS_TO_TICKS(100)); heap_caps_free(buf); g_ts sample_count; }這里要特別注意字節(jié)序問(wèn)題。C 語(yǔ)言在 ESP32 上是小端而網(wǎng)絡(luò)傳輸約定用大端所以 seq 和 ts 都做了一次 htonl 轉(zhuǎn)換。如果你在服務(wù)器端忘了用大端解析時(shí)間戳就會(huì)變成一個(gè)巨大的錯(cuò)誤數(shù)字。同時(shí)我建議發(fā)送緩沖區(qū)不要直接在任務(wù)棧上開(kāi)大數(shù)組。ESP32 的任務(wù)棧一般只有 4KB 到 8KB一個(gè) 650 字節(jié)的幀還好但如果你把多個(gè)幀拼在一起發(fā)就可能爆棧。我用 heap_caps_malloc 分配 PSRAM 內(nèi)存發(fā)完馬上釋放既靈活又不占??臻g。一個(gè)更重要的經(jīng)驗(yàn)是音頻發(fā)送任務(wù)必須保證低延遲不能被其他任務(wù)搶占太久。我把它設(shè)置成高優(yōu)先級(jí)并綁定到一個(gè)專(zhuān)用核心上運(yùn)行xTaskCreatePinnedToCore(send_task, audio_send, 4096, NULL, 5, NULL, 1);核心 0 用來(lái)跑 WiFi 協(xié)議棧和系統(tǒng)任務(wù)核心 1 跑音頻收發(fā)避免任務(wù)遷移導(dǎo)致的不確定延遲。實(shí)測(cè)對(duì)比后同樣的代碼綁定核心后首包延遲能低 10ms 到 30ms 左右別看這個(gè)數(shù)字不大對(duì)端到端低延遲很關(guān)鍵。4. 服務(wù)端把二進(jìn)制流變成“能聽(tīng)、能想、能說(shuō)”的閉環(huán)4.1 服務(wù)端框架與連接管理服務(wù)端我用 Go 寫(xiě)WebSocket 庫(kù)用的 gorilla/websocket。選 Go 而不是 Node 或 Python是因?yàn)樗烊坏牟l(fā)模型非常適合維護(hù)大量長(zhǎng)連接而且 gorilla/websocket 的接口對(duì)二進(jìn)制消息處理非常直接。每個(gè) ESP32 設(shè)備連上來(lái)后我會(huì)在服務(wù)端維護(hù)一個(gè) DeviceSession 結(jié)構(gòu)體里面把這條連接綁定的相關(guān)處理器都串起來(lái)type DeviceSession struct { Conn *websocket.Conn rwmu sync.Mutex asr ASREngine llm LLMClient tts TTSClient buffer *AudioBuffer state AtomicState }連接讀循環(huán)很簡(jiǎn)單通過(guò)判斷 opcode 分發(fā)0x01 的音頻包送給 ASR 緩沖0x04 的控制包觸發(fā)打斷或心跳等動(dòng)作。寫(xiě)循環(huán)單獨(dú)用一個(gè) channel 保證多 goroutine 不會(huì)并發(fā)寫(xiě)同一個(gè) WebSocket因?yàn)?gorilla/websocket 的同一時(shí)刻只允許一個(gè) goroutine 寫(xiě)連接并發(fā)寫(xiě)會(huì)把底層幀寫(xiě)壞。我在讀循環(huán)里獲取音頻幀的代碼示例如下mt, payload, err : conn.ReadMessage() if mt ! websocket.BinaryMessage || len(payload) 9 { return fmt.Errorf(invalid packet) } op : payload[0] seq : binary.BigEndian.Uint32(payload[1:5]) ts : binary.BigEndian.Uint32(payload[5:9]) data : payload[9:] switch op { case 0x01: session.buffer.Push(seq, ts, data) case 0x04: handleControl(session, data) }序列號(hào)在這里不只是好看它還能幫我過(guò)濾重復(fù)幀。由于 TCP 本身不會(huì)重復(fù)主要是 Wi-Fi 重傳可能導(dǎo)致亂序到達(dá)再加上 ESP32 端如果因?yàn)榫W(wǎng)絡(luò)卡頓重發(fā)了上一幀服務(wù)端需要對(duì) seq 做一次簡(jiǎn)單比較小于當(dāng)前已處理序列號(hào)的幀直接丟棄避免音頻內(nèi)容出現(xiàn)重復(fù)片段。4.2 流式 ASR 會(huì)話識(shí)別什么時(shí)候已經(jīng)說(shuō)完上行音頻到達(dá)服務(wù)端后我先累積到一個(gè)會(huì)話級(jí)緩沖里再按照 ASR 引擎要求的切片大小送識(shí)別。用的流式 ASR 模型內(nèi)部會(huì)持續(xù)更新“中間結(jié)果”不斷返回 它 目前聽(tīng)到的部分文字。關(guān)鍵點(diǎn)在于“結(jié)束判定”。我在設(shè)計(jì)里遵循了這樣的規(guī)則當(dāng) ESP32 端本地 VAD 判定說(shuō)話結(jié)束會(huì)發(fā)一個(gè)“end of speech”控制幀這是我的第一重結(jié)束信號(hào)服務(wù)端 ASR 自身也會(huì)根據(jù)靜音檢測(cè)產(chǎn)生一個(gè) vad_end 事件兩個(gè)信號(hào)只要有一個(gè)觸發(fā)ASR 就做一次 final 判定把完整文字交給下一環(huán)。如果只聽(tīng) ESP32 一個(gè)信號(hào)萬(wàn)一本地上行網(wǎng)絡(luò)丟了幾幀會(huì)導(dǎo)致結(jié)束信號(hào)丟失服務(wù)端就一直傻等著。所以服務(wù)端 ASR 的靜音檢測(cè)作為兜底很重要。雙保險(xiǎn)機(jī)制代碼上一點(diǎn)都不復(fù)雜但能避免大部分“它怎么還不回答我”的詭異問(wèn)題。這里還有一個(gè)細(xì)節(jié)ASR 是流式的中間結(jié)果可能每 200ms 變化一次。想讓玩偶有“正在認(rèn)真聽(tīng)”的感覺(jué)可以每拿到一個(gè)中間結(jié)果就通過(guò) 0x03 文本幀返回給 ESP32ESP32 再在屏幕上顯示或讓耳朵燈閃爍。這個(gè)功能對(duì)最終體驗(yàn)提升不是致命的但加了之后用戶會(huì)明顯覺(jué)得玩偶“活”了。4.3 LLM 流式輸出到 TTS再到下行音頻幀ASR 給出完整文本后我會(huì)帶著會(huì)話上下文請(qǐng)求 LLM。為了讓響應(yīng)延遲盡可能低LLM 必須用流式輸出接口也就是一邊生成文字一邊吐出 token不能等全部生成完再返回。LLM 流式輸出的每個(gè) token 片段被送進(jìn)一個(gè)“增量 TTS 合成器”。這里有個(gè)很現(xiàn)實(shí)的問(wèn)題TTS 引擎往往要求至少是完整的句子或合理短語(yǔ)才能合成自然語(yǔ)音如果每個(gè) token 都立刻合成音頻會(huì)支離破碎。我采用的折中方案是按標(biāo)點(diǎn)符號(hào)和語(yǔ)氣詞切句當(dāng)前面累積的文字出現(xiàn)逗號(hào)、句號(hào)、問(wèn)號(hào)、感嘆號(hào)時(shí)就把這一段提交 TTS一旦合成出第一段音頻立刻通過(guò) WebSocket 下行推給設(shè)備不用等整個(gè)回答結(jié)束。這樣做用戶感知到的首包延遲通常能壓到 300~800ms遠(yuǎn)比整段合成完再下發(fā)快了。而且因?yàn)?LLM 是邊生成邊提交 TTS整個(gè)下行的音頻流是連續(xù)的播放端不會(huì)出現(xiàn)“說(shuō)一句停半句”的割裂感。下行音頻幀格式我復(fù)用了 0x02 二進(jìn)制幀數(shù)據(jù)區(qū)域放 TTS 引擎輸出的 PCM 編碼。注意 TTS 輸出采樣率一定要統(tǒng)一設(shè)置成 16000Hz 16bit 單聲道和 ESP32 采集端一致否則 ESP32 播放時(shí)要么變速要么需要做重采樣。我最初沒(méi)統(tǒng)一TTS 默認(rèn)輸出 24000Hz結(jié)果播放速度變快了 1.5 倍非常滑稽。4.4 下行播放與打斷Barge-in控制下行播放最核心的問(wèn)題是打斷。用戶正在聽(tīng)玩偶說(shuō)話突然發(fā)現(xiàn)這不是自己想要的開(kāi)口插了一句話。這時(shí)候會(huì)發(fā)生兩件事第一ESP32 本地要識(shí)別到用戶開(kāi)口迅速停止播放當(dāng)前下行音頻同時(shí)往服務(wù)端發(fā)一個(gè) 0x04 打斷控制幀。把揚(yáng)聲器“閉嘴”的動(dòng)作放在設(shè)備端而不是等服務(wù)端指令這是降低打斷延遲的關(guān)鍵。本地判斷到用戶開(kāi)口到喇叭靜音延遲可以控制在 20ms 以內(nèi)如果等服務(wù)端處理再回傳控制幀至少要多出 200ms 的網(wǎng)絡(luò)往返用戶體驗(yàn)會(huì)感覺(jué)“它好像頓了一下才閉嘴”。第二服務(wù)端收到打斷幀后要立刻做三件事停止當(dāng)前 TTS 合成與下發(fā)、清空下行發(fā)送隊(duì)列、重置當(dāng)前 ASR 會(huì)話準(zhǔn)備接收新的語(yǔ)音。Go 代碼里大概是這樣一個(gè)流程case ctrlBargeIn: tts.Cancel() session.sendQueue.Clear() session.state.Set(stateListening) asr.Reset()這里有一個(gè)容易漏掉的細(xì)節(jié)清空下行發(fā)送隊(duì)列的時(shí)候當(dāng)前正在寫(xiě)連接的 goroutine 可能已經(jīng)拿到了一個(gè)音頻幀。所以寫(xiě)循環(huán)必須也監(jiān)聽(tīng)一個(gè) cancel channel當(dāng)打斷發(fā)生時(shí)即使拿取幀成功也要在發(fā)送前檢查會(huì)話狀態(tài)是中斷狀態(tài)就直接丟棄。5. 連續(xù)對(duì)話的狀態(tài)機(jī)與關(guān)鍵時(shí)序5.1 用一個(gè)狀態(tài)機(jī)統(tǒng)一“聽(tīng)、想、說(shuō)、被搶話”全雙工音頻鏈路最怕?tīng)顟B(tài)混亂。如果服務(wù)端還按照“收到一段音頻 → 處理 → 回復(fù)”這種線性思維設(shè)備端一旦同時(shí)發(fā)生上行和下行整個(gè)邏輯當(dāng)場(chǎng)就會(huì)卡死。我把整個(gè)會(huì)話抽象成一個(gè)狀態(tài)機(jī)這是重構(gòu)里性價(jià)比最高的一步。狀態(tài)定義如下?tīng)顟B(tài)含義備注IDLE空閑等待喚醒詞或本地 VAD 觸發(fā)LISTENING傾聽(tīng)中ESP32 上行音頻流入 ASRTHINKING思考中ASR 結(jié)束LLM 生成回復(fù)SPEAKING播放中TTS 音頻下行播放INTERRUPTED被打斷用戶插話清空下行WAIT_RECOVER恢復(fù)等待結(jié)束語(yǔ)處理回到 LISTENING狀態(tài)機(jī)的變化規(guī)則IDLE → LISTENING喚醒詞或本地 VAD 觸發(fā)LISTENING → THINKING語(yǔ)音結(jié)束ASR 輸出最終文本THINKING → SPEAKINGTTS 開(kāi)始產(chǎn)生下行音頻幀SPEAKING → INTERRUPTED收到 0x04 打斷控制幀或檢測(cè)到新的上行語(yǔ)音能量INTERRUPTED → LISTENING清空下行隊(duì)列、重置 ASR 后立刻進(jìn)入LISTENING → IDLE連續(xù)長(zhǎng)時(shí)間無(wú)人說(shuō)話超過(guò) 10 秒后釋放鏈路但不是斷開(kāi) WebSocket。這個(gè)狀態(tài)機(jī)在服務(wù)端和 ESP32 端各維護(hù)一份只不過(guò) ESP32 端的狀態(tài)不需要有 THINKING因?yàn)樗诘认滦幸纛l時(shí)只需要表現(xiàn)為“待播放”。兩端通過(guò)心跳幀里的狀態(tài)字段同步出現(xiàn)不一致時(shí)以服務(wù)端為準(zhǔn)。5.2 關(guān)鍵時(shí)序估算從“發(fā)聲”到“回應(yīng)”做流式架構(gòu)之后有個(gè)好處是各個(gè)環(huán)節(jié)的延遲可以并行疊加而不是串行相加。我拿實(shí)測(cè)數(shù)據(jù)列一份典型鏈路耗時(shí)階段耗時(shí)說(shuō)明ESP32 采集并打包上送20ms基于 20ms 一個(gè)音頻塊WiFi 上行傳輸50~100ms取決于路由器同一局域網(wǎng)更快ASR 語(yǔ)音結(jié)束判定300~600ms包含靜音尾判定LLM 首個(gè) token 輸出500~1500ms取決于模型和服務(wù)端性能TTS 合成首個(gè)音頻塊200~600ms流式合成下行傳輸 抖動(dòng)緩沖100~200ms包含足夠預(yù)讀量理論總延遲1.2~3s用戶實(shí)際感覺(jué)是“說(shuō)完后不到 2 秒開(kāi)始回應(yīng)”實(shí)際體驗(yàn)中用戶從停止說(shuō)話到聽(tīng)到玩偶開(kāi)口大約在 1 秒到 2 秒之間這比老版按鍵模式動(dòng)不動(dòng) 4 秒已經(jīng)強(qiáng)了很多。再往下壓延遲主要瓶頸在 LLM 的首 token 輸出如果你用本地小模型延遲能更快但要犧牲回復(fù)質(zhì)量如果接云上大模型網(wǎng)絡(luò)往返是硬成本只能靠流式接口盡量把首包提前。這里我強(qiáng)烈建議端到端延遲統(tǒng)計(jì)一定要拆開(kāi)測(cè)不要只記住一個(gè)總數(shù)字。我在服務(wù)端給每個(gè)會(huì)話都加了分層耗時(shí)日志ASR 結(jié)束時(shí)間、LLM 首 token 時(shí)間、TTS 首塊時(shí)間、下行首包時(shí)間分別記錄問(wèn)題出在哪一環(huán)看日志一眼就能定位。5.3 如何讓玩具“閉嘴”更干脆丟棄與清緩存很多人做打斷功能只在上層邏輯里喊一句“停止播放”結(jié)果還是要等當(dāng)前音頻緩沖播完才靜音體驗(yàn)非常拖沓。在 ESP32 端要讓喇叭立刻閉嘴必須連同 I2S 的 DMA 緩沖一起清掉。我在代碼里做了以下幾步void audio_playback_stop_now(void) { // 停止寫(xiě)入新的音頻數(shù)據(jù) playback_task_suspend(); // 清空軟件隊(duì)列 xQueueReset(play_queue); // 清空 DMA 緩沖防止舊音頻繼續(xù)播放 i2s_channel_disable(tx_chan); i2s_channel_enable(tx_chan); }i2s_channel_disable 再 enable 看起來(lái)粗暴卻是最有效的“軟復(fù)位”方式。清完之后從用戶開(kāi)口到喇叭靜音整體能做到 30ms 以內(nèi)耳朵基本聽(tīng)不出有殘余聲音。如果只清軟件隊(duì)列喇叭還會(huì)把 DMA 里已經(jīng)搬進(jìn)去的音頻繼續(xù)放完通常會(huì)產(chǎn)生 50ms 到 100ms 的“殘留尾巴”在打斷場(chǎng)景里會(huì)顯得特別拖。下行播放端還需要處理一個(gè)“新舊音頻黏連”的問(wèn)題。當(dāng)用戶說(shuō)“我要的不是這個(gè)”新 TTS 的音頻包已經(jīng)開(kāi)始進(jìn)入 play_queue但舊音頻可能還沒(méi)清干凈。我的經(jīng)驗(yàn)是打斷發(fā)生時(shí)不僅要把隊(duì)列里數(shù)據(jù)全清掉還要在狀態(tài)機(jī)切到新的 SPEAKING 之前強(qiáng)制間隔一個(gè) 50ms 的“靜音幀”防止新老語(yǔ)音在前面拼接處產(chǎn)生爆音。6. 穩(wěn)定性、延遲與內(nèi)存的工程細(xì)節(jié)6.1 WiFi 不穩(wěn)導(dǎo)致 1006 的那一晚在 WebSocket 錯(cuò)誤碼里1006 是個(gè)非常特殊的碼因?yàn)榘匆?guī)定客戶端和服務(wù)端都不該主動(dòng)發(fā)這個(gè)碼。1006 只表示“連接異常關(guān)閉”也就是說(shuō)底層連接掛了但雙方都沒(méi)有收到關(guān)閉幀。我遇到過(guò)不止一次ESP32 端打印出 onclose code 1006同時(shí)服務(wù)端也莫名其妙地發(fā)現(xiàn)連接中斷兩個(gè)進(jìn)程都沒(méi)有任何主動(dòng) close 的日志。印象最深的一次是同一個(gè)原型機(jī)在家里路由器信號(hào)弱的角落測(cè)試穩(wěn)定運(yùn)行了 5 分鐘然后就出現(xiàn) 1006。我一開(kāi)始懷疑是服務(wù)端空閑連接被路由器殺了但加長(zhǎng)應(yīng)用層心跳也沒(méi)用后來(lái)抓 WiFi 日志才發(fā)現(xiàn)是 ESP32 的 WiFi 射頻在持續(xù)上傳大流量時(shí)和 2.4G 頻段上藍(lán)牙或者其他設(shè)備的干擾打架導(dǎo)致 TCP 重傳超時(shí)底層連接被內(nèi)核直接斷開(kāi)WebSocket 層來(lái)不及發(fā) close 幀。解決思路有三個(gè)一是開(kāi)啟 WiFi 的 TCP keepalive讓底層協(xié)議棧盡快發(fā)現(xiàn)死連接二是應(yīng)用層心跳間隔縮短到 5 秒同時(shí)在收到心跳超時(shí)后代碼里主動(dòng) close 并重連三是 WiFi 工作模式固定為 STA關(guān)閉 BT 共存在某些型號(hào)上能減少射頻干擾。這一套組合下來(lái)我的設(shè)備已經(jīng)連續(xù)跑了幾十個(gè)小時(shí)沒(méi)再出現(xiàn) 1006。6.2 內(nèi)存優(yōu)化與 DMA 緩沖預(yù)算ESP32-S3 有 512KB SRAM但其中很大一部分可能被 WiFi 協(xié)議棧、TLS 和音頻緩沖占掉。如果再用老的靜態(tài)緩沖做法很容易莫名奇妙死機(jī)。我的內(nèi)存預(yù)算大致是這樣的用途內(nèi)存占用說(shuō)明ESP-IDF 基礎(chǔ) WiFi120KB包含協(xié)議棧和驅(qū)動(dòng)WebSocket 客戶端15KB緩沖和任務(wù)棧I2S DMA 緩沖8KB雙通道 8 描述符音頻發(fā)送隊(duì)列24KB最多 36 幀每幀 650B下行播放隊(duì)列48KB最多 72 幀每幀 650B其他任務(wù)和堆余量剩余用于系統(tǒng)抖動(dòng)我把大塊的環(huán)形緩沖放在 PSRAM 里但要注意 DMA 不能直接訪問(wèn) PSRAM所以 DMA 描述符本身必須留在內(nèi)部 RAM而承載數(shù)據(jù)的 buffer 放 PSRAM 是可以的只要先通過(guò) i2s_channel_read 讀到內(nèi)部 RAM 小緩沖區(qū)再拷貝到 PSRAM 大隊(duì)列里。這個(gè)做法能顯著提高內(nèi)存余量代價(jià)是多一次拷貝但在 20ms 的音頻塊尺度下一次 memcpy 性能損失可以忽略。還有一個(gè)讓我踩過(guò)的坑在 ESP-IDF 項(xiàng)目里同時(shí)啟用 BLE 和 WiFi會(huì)把內(nèi)部 RAM 占用推高很多。如果你不需要藍(lán)牙編譯時(shí)把 BLE 功能關(guān)掉內(nèi)存會(huì)寬裕不少。6.3 OTA 升級(jí)和日志給現(xiàn)場(chǎng)玩偶留一條后路玩偶是實(shí)體產(chǎn)品燒錄一次程序容易但發(fā)給用戶之后再想改邏輯沒(méi)有 OTA 簡(jiǎn)直是一場(chǎng)災(zāi)難。ESP32 的 OTA 升級(jí)是一個(gè)經(jīng)典操作我把 WebSocket 音頻鏈路和 OTA 分成兩個(gè)獨(dú)立邏輯平時(shí)走 WebSocket 長(zhǎng)連接升級(jí)時(shí)服務(wù)端下發(fā)一條 0x04 控制幀內(nèi)容是“進(jìn)入 OTA 模式”ESP32 收到后停止音頻鏈路然后從 OTA 服務(wù)器拉取固件。OTA 分區(qū)表需要提前分好我的 partition 大致是這樣nvs0x9000存放配置otadata0x2000OTA 狀態(tài)app00x200000主應(yīng)用app10x200000OTA 備份。OTA 升級(jí)過(guò)程中HTTP 下載固件會(huì)占滿網(wǎng)絡(luò)帶寬和 WebSocket 音頻鏈路完全沖突。所以設(shè)計(jì)上必須嚴(yán)格串行先斷開(kāi) WebSocket再做 OTA升級(jí)完重啟后重新連。否則音頻幀和固件數(shù)據(jù)在同一個(gè)網(wǎng)口搶帶寬可能導(dǎo)致固件下載超時(shí)失敗。日志方面ESP32 的串口日志在設(shè)備端調(diào)試時(shí)好使但設(shè)備一旦裝進(jìn)玩偶外殼串口就沒(méi)了。我做的方案是把關(guān)鍵日志封裝成 0x03 文本幀回傳服務(wù)端按設(shè)備 ID 存一份滾動(dòng)日志文件。這樣就算外殼完全封閉我依然能看到設(shè)備運(yùn)行時(shí)的每一次狀態(tài)切換、心跳超時(shí)和錯(cuò)誤碼。遇到用戶反饋問(wèn)題我直接查服務(wù)端日志就能還原現(xiàn)場(chǎng)。7. 踩坑記錄與問(wèn)題速查表7.1 必看排查速查表我把實(shí)際排查過(guò)程中遇到頻率最高的問(wèn)題和對(duì)應(yīng)解法整理成了一張表直接按圖索驥就行?,F(xiàn)象可能原因排查方法解決方案WebSocket 連不上報(bào) 1006網(wǎng)絡(luò)不穩(wěn)定、TCP 半開(kāi)連接抓包看 TCP 重傳看心跳是否超時(shí)縮短心跳到 5s應(yīng)用層主動(dòng)重連開(kāi)啟 TCP keepalive語(yǔ)音識(shí)別文字?jǐn)鄶嗬m(xù)續(xù)音頻幀丟失或亂序服務(wù)端打印 seq看是否有空洞增加播放端 jitter buffer服務(wù)端用 seq 去重和重排序玩偶播放聲音變快/變調(diào)TTS 采樣率和 I2S 播放采樣率不一致打印 TTS 音頻采樣率服務(wù)端強(qiáng)制 TTS 輸出 16000Hz 16bit 單聲道打斷時(shí)喇叭還有殘余聲音DMA 緩沖沒(méi)有清理聽(tīng)感判斷或示波器看音頻波形i2s_channel_disable/enable 清 DMA播放有滋滋聲且只在播放大音量時(shí)出現(xiàn)電源紋波大功放與麥克風(fēng)共享不干凈電源用示波器看功放供電紋波加電解電容去耦電源分路供電長(zhǎng)時(shí)間運(yùn)行后內(nèi)存不足崩潰任務(wù)棧太小或靜態(tài)緩沖占用過(guò)大打開(kāi) heap debugging查看任務(wù)棧高水位任務(wù)棧加大數(shù)據(jù)緩沖移到 PSRAMESP32 突然重啟但日志沒(méi)異常看門(mén)狗超時(shí)任務(wù)卡在 I2S 讀操作打開(kāi) Task WDT查看卡住的任務(wù)給 I2S 讀操作加超時(shí)任務(wù)循環(huán)里喂狗TTS 首包延遲高但之后正常TTS 合成器被阻塞比如申請(qǐng)了串行鎖看服務(wù)端并發(fā)日志有沒(méi)有鎖等待TTS 引擎實(shí)例化多個(gè) goroutine或做請(qǐng)求隊(duì)列隔離玩偶一段時(shí)間不響應(yīng)語(yǔ)音本地 VAD 閾值過(guò)高或麥克風(fēng)積灰查看上行流量統(tǒng)計(jì)看是否有音頻發(fā)送調(diào)低閾值添加 AGC 自動(dòng)增益定期清理麥克風(fēng)這張表里的問(wèn)題我基本都實(shí)際遇到過(guò)其中 1006 和 DMA 殘余聲音是最影響體驗(yàn)的兩個(gè)建議大家在開(kāi)發(fā)階段就做好可視化日志否則現(xiàn)場(chǎng)排查會(huì)非常痛苦。7.2 還踩過(guò)的幾個(gè)小坑最后把我一直想單獨(dú)拎出來(lái)說(shuō)的幾個(gè)“非典型坑”分享給大家這些問(wèn)題是官方文檔通常不會(huì)講清楚的。第一個(gè)是麥克風(fēng)和功放共地的問(wèn)題。我把 INMP441 和 MAX98357A 接到同一個(gè) 3.3V 電源上用了杜邦線連接一開(kāi)始沒(méi)有任何去耦電容。結(jié)果一旦喇叭輸出大音量麥克風(fēng)采到的音頻就會(huì)被電源紋波污染。這種污染不是簡(jiǎn)單的底噪而是帶有明顯包絡(luò)的哼聲ASR 在播放大音量時(shí)幾乎無(wú)法識(shí)別。后來(lái)我把電源線加粗在功放電源引腳旁并聯(lián)了 100uF 和 0.1uF 電容問(wèn)題大幅緩解。做音頻硬件電源潔凈度永遠(yuǎn)要排在第一位。第二個(gè)是 ESP32 WebSocket 客戶端發(fā)送大幀時(shí)的經(jīng)驗(yàn)。esp_websocket_client_send_bin 有一個(gè)超時(shí)參數(shù)如果你發(fā)送較長(zhǎng)的音頻幀在 WiFi 信號(hào)差的時(shí)候可能因?yàn)榈讓幼枞瑫r(shí)返回失敗。我一開(kāi)始沒(méi)檢查返回值結(jié)果部分音頻幀在弱信號(hào)時(shí)被靜默丟棄表現(xiàn)是玩偶聽(tīng)不清長(zhǎng)句。后來(lái)我在發(fā)送失敗時(shí)保留幀并重試一次重試還是失敗就把會(huì)話狀態(tài)重置效果穩(wěn)定很多。第三個(gè)是關(guān)于語(yǔ)音識(shí)別結(jié)束信號(hào)的“雙保險(xiǎn)”。早期我只依賴(lài)服務(wù)端 ASR 的靜音判定當(dāng)用戶說(shuō)話聲音很小或者背景安靜時(shí)識(shí)別結(jié)束非??斓?dāng)環(huán)境里有一點(diǎn)風(fēng)扇聲靜音判定就永遠(yuǎn)不觸發(fā)玩偶就會(huì)一直“聽(tīng)”不回答。加上 ESP32 本地 VAD 的結(jié)束信號(hào)后問(wèn)題基本消失。兩端各自獨(dú)立判斷誰(shuí)先觸發(fā)結(jié)束都可以這比單一來(lái)源可靠得多。7.3 下一步想做的事這次重構(gòu)把 WebSocket 二進(jìn)制音頻鏈路打通之后我至少已經(jīng)解決了從“能對(duì)話”到“連續(xù)對(duì)話”的全部核心問(wèn)題全雙工傳輸、流式識(shí)別、流式合成、打斷控制、狀態(tài)機(jī)、穩(wěn)定性優(yōu)化?,F(xiàn)在玩偶在安靜家庭環(huán)境里已經(jīng)能比較自然地實(shí)現(xiàn)多輪對(duì)話用戶說(shuō)話時(shí)可以隨時(shí)插話玩偶也會(huì)斷句式地合成回復(fù)不用再等待轉(zhuǎn)圈。下一步我想做兩個(gè)方向一是把音頻編碼從裸 PCM 換成 Opus。PCM 在 16kHz 16bit 單聲道時(shí)是 32KB/s 的流量對(duì)一般 WiFi 來(lái)說(shuō)完全沒(méi)壓力但如果以后要做電池供電和蜂窩網(wǎng)絡(luò)版本流量和功耗都是問(wèn)題。Opus 在 12kbps 到 24kbps 就能保持不錯(cuò)的語(yǔ)音質(zhì)量只是 ESP32 側(cè)的編碼庫(kù)和內(nèi)存開(kāi)銷(xiāo)還要調(diào)優(yōu)。二是在本地加入更豐富的喚醒交互比如讓玩偶通過(guò)檢測(cè)用戶音量來(lái)調(diào)整自己回答狀態(tài)甚至能夠識(shí)別用戶情緒。這些后續(xù)再單獨(dú)寫(xiě)文章分享。最后分享我實(shí)際的體會(huì)從“能對(duì)話”走向“連續(xù)對(duì)話”技術(shù)難點(diǎn)其實(shí)不在某一個(gè)點(diǎn)上而在于把全雙工鏈路、流式處理、打斷控制、狀態(tài)機(jī)這些環(huán)節(jié)耐心地串起來(lái)。每一個(gè)環(huán)節(jié)都不是無(wú)解的難點(diǎn)但它們彼此耦合一旦某個(gè)點(diǎn)沒(méi)有處理好整體體驗(yàn)就會(huì)回到對(duì)講機(jī)時(shí)代。我在這個(gè)項(xiàng)目里最大的感悟是設(shè)計(jì)協(xié)議時(shí)多做一層的序列號(hào)和時(shí)間戳實(shí)現(xiàn)音視頻鏈路時(shí)永遠(yuǎn)校驗(yàn)每一個(gè)返回值調(diào)試交互時(shí)一定要把自己當(dāng)成三歲小朋友把他們毫無(wú)邏輯的打斷和搶話當(dāng)成正常輸入。這三件事做到位你的 AI 玩偶大概率就已經(jīng)跑在真正的“連續(xù)對(duì)話”賽道上了。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日韩无码黄色片| 九九热最新| 五月天我淫我色av| 呦呦影院| 久久激情综合| 中文字幕性感少妇av| 九色 人妻 大香蕉| 日韩无码AB| 久草在| 久久久久久裸体| 97在线观| 超碰激情808| 精品无码人妻一区二区免费蜜桃| 九九九九一级| 综合网天天| 熟女五十路一区二区三| 六月丁操逼| 一本大道青青| 囯戸精品高潮呻吟旡码| 男人的天堂2018东京热啪啪啪| 欧美性爱网97| 国产成年精品高清在线观看91| 天天色粽合合合合合合合| 色婷婷蜜臀av| 国产精品白领在线观看| 亚洲丝袜二区| 欧美大香蕉久| 精品中文日韩字幕视频| 国产av激情无码久久天堂| 色吧五月| 4虎在线观看| 美国精品国产精品| 中文字幕一区二区三区蜜桃视频| 国人欧美精品一区二区| 99久在线精品99re8| 91网九色蝌蚪操熟女| 亚州情色j区| 精品人妻一区二区免费蜜桃视频| av天堂影视中文在字幕在线中文| 日本二三四区| 熟妇视频一区二区三区在线观看| 亚洲激情在线一区二区| 夜夜嗨视频| 亚洲最大91网| 国产日逼视频| 久久超碰天天| 国产极品999| 国产日韩区| 99只有精品| 色色婷婷五月天| 欧美成人免费在线观看| A级片一区| 丝袜制服字幕在线| 无码WWW免费视频网站| 欧美第一页| 一起草精品人妻| 久久受www免费人成| 偷拍导航视频网站| 久久综合女优| 国产一区96在线| 日本成人在线不卡一区二区三区 | 亚洲五月婷| 日日骚一区二区三区| 精品小视频在线| 丰满人妻一区二区三区免费,| Blackedraw视频一区二区| 夜夜嗨一区二区| 亚洲玖玖爱| 婷色五月| 天天躁日日躁xxxxx| 精彩久久中文| 97色视频在线| 少妇三P| 自慰白浆在线观看| 911av网站免费观看| AV天堂因数| 狠狠爱夜夜干| 精品少妇一区二区| 99re这里只有精品2| 天天综合网~91入口| 欧美激情欧美精品| 国产不卡中文字幕免费avi| 国产黄a三级三级三级av在线看| 欧亚性爱啪啪| 久久婷婷色| 天天看,天天做| 不卡啪啪视频| 97人妻色| 妇女视频网站| 美女爽到高潮91| 黄呦呦在线| 久久精品中文| 亚洲激情深爱文学小说网站| 啊啊啊啊啊啊啊啊在线观看| 亚洲天堂一区| www.99中文字幕| 91在线精品| 日韩中文字幕在线视频观看| 天天摸,夜夜摸| 狠狠中文字幕| 凹凸 69堂 在线播放| 人妻熟妇一区二区三区| 特级特黄一级毛片免费| 男人夜色天堂ss| 97色诱| 久久久无码精品人妻二区| 亚洲高清综合网| 日本人妻最新在线中| 欧美爱三级日韩久久| 亚洲男人天堂2019| 啊啊啊在线观看免费视频| 老司机免费视频在线91| 国产人妻久久精品一区二区三区| 国产精品久久天天干| 欧美图片色综合| 今日头条成人一区二区三区四虎精品| 久久高潮妇女视频| 中文字幕日本久久| 精品999一区二区| 91三级理论片播放器| 少妇蜜汁| 色约约一区=区三区| 翔田千里一区二区三区奶水| 啊啊啊快操我视频| ,成人免费啪啪视频| 亚洲欧洲小说图片视频 | 在线啊啊啊啊| 免费观看网黄| 乱老熟女一区二区三区| 另类亚洲一区二区三区| 精品无吗久久| 中文字幕aⅴ在线视频| 啊啊啊啊啊啊啊网址在线观看| 午夜小电影在线插入淫高潮| 亚洲熟妇图片| 亚洲国产欧美一区二区潘金莲| 96爱综合| 黑人嘿嘿嘿超爽免费视频| 综合欧美日韩在线| 尤物网址| 日韩色香| 精品然女一区二区| 亚洲欧美日韩精品久久久一区二区| 国精综合一二三区影视| 你懂得91| 91网九色蝌蚪操熟女| 日日日啊啊啊| 国产区性爱在线视频秋霞豆| 黑人性欧美| 920日本午夜免费| 亚洲资源站| 人妻出轨一区二区三区| 亚卅熟女乱色| 在线视频 亚洲精品| 久久的网站啊啊啊啊啊| 久久精品毛片免费不卡| 麻豆成人影音在线| 天综合网欧美| 精品人妻一区二区三区-国产精品 一个人在线看的黄色电影网站 | 中国少妇XXXX做受| 大香蕉日韩| 97资源超碰| 亚洲一区二区中文字幕| 五毛骚逼极品美女怕怕| 啊啊啊啊嗯嗯嗯用力好爽| 韩国一级做a久久久久| 96AV久久久| 国模少妇一区二区三区| a级免费在线观看| 久久久99999久网站| 99re公开精品免费视频| 狠狠婷婷亚洲中文综合久久| 91日日夜夜| 激情视屏国产乱伦强奸| 欧美日韩 强奸乱伦| 高清无码久操视频| 国产精品九九九| 五月开心久久AV官网| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 风月影院十八禁| 九九九九欧美| 亚洲情色一区二区三区| 婷婷色香| 青青操在线亚洲视频观看欧美在线| 国产亚洲精品av一区| 成人午夜高潮av猛片| 情色大香蕉| 亚洲国产青青| 久久免费精品96| 婷婷六月色| 囯产操逼片| 丝袜美腿制服人妻二区中文字幕 | 老外又粗又长一晚做五次| 亚洲丝袜诱惑| a男人的天堂久久一级A毛片| 啪啪AV导航| 尤物一级在线免费观看| 国产女人操逼视频| 99视频只有精品| 亚洲国产午夜真人一级片中文字幕精品黄网站 | 再深点灬舒服灬太大了添视频| 欧美精品久久久久久久丰满| 国产乱子伦久久精品综合一区二区三| 94色色电影网| 国产性久久久| 91精品91久久久中77777| 精品人妻一区二区三区-国产| AV天天综合| 97硬碰| 乱操9999| 日本一级婬片试看三分钟| 人妻性爱一区二区| 九九黄色网| 蜜桃久久综合视频| 校园春色家庭伦理欧美激情| 亚洲国产97| 午夜偷拍久久熟女| 亚州色站 日韩电影| 丝袜色综合| 亚洲瓯美色图| 我要去看2个日本美女.com曹逼| 亚洲精品白浆高清久久久久久 | 91九色蝌蚪在线观看| 亚洲精品 大香蕉| 风骚少妇视频中文字幕| 91深夜夜| 亚洲图片在线| 91久久精品中文字幕| 天天享受天天看| 99久草| 操逼日韩无码| 美女十八禁| 91综合色噜噜| 97极品无码| 婷婷九月| 91久久久亚洲| 久久久久久久久久久久久久久久9| 久热热| 欧美黄色片AAAAA| 天美一区在线| 色玖玖| 日韩三级伊人| 大香蕉宅男伊人| 久久精品国产亚洲AV高级北京| 青青操少妇| 色欧美综合| 91肏屄网| 国产A v无码专区| 欧美手机在线综合| 欧美亚综合色图| 欧美在线永久天堂| 国产精品禁久久久精品| 国产天天骚| 91情色| 熟妇艹鸡八| 国产精品一区二区亚洲人成毛片| 亚洲精品不卡一二三区| 加勒比大香蕉视频在线| 精品日韩中文在线| 国产精品九九九| 93人人操人人| 国产一级舔足在线观看| 精品在线观看视频在线| 久艹日日日| 久久久97| 亚洲成a人在线观看久| 国产精品成人福利在线| 污啪啪啪视频| 欧美日韩国产电影| 少妇的嫩逼图片| 日本欧美中文字幕| 99久久网站| 久久天天性久久伊人| 色盈盈影院| 无码九九九九| 人人操人人操人人操人人操人人操人人人11.CM | 91中文字幕制服丝袜免费视频| 中文字幕在线观| 欧 美 自 拍 偷 拍| 天天色综亚洲91污| 精品亚洲俞拍视频一区| 美女久久久久久久久久久| 高清有码一区二区| 九色97| 免费成人在线熟妇网| 精品久久9| 视频国产欧美在线播放| 在线国产探花| 天天综合网~91综合网| 久久久久久人妻一区精品色欧美| 婷婷丁香五月综合| 狠狠干妹子| 国产精品原创巨作?v网站| 日本在线不卡一二区| 久久久久9999妇女| 国产超碰AV在线精品| 色综合久| 大香蕉日亚洲日本亚大| 人人看人人摸人人色| 久偷拍| 中文字幕欧美丝袜07资源| 熟女人妇一区二区三区| 欧美日韩人妻少妇 一区二区三区| 亚洲97| AV综合中文字幕干| 亚洲限制级| 翔田千里无码一区| 高清不卡一二三区视频......| 91热色| 亚洲成a人片在线观看中文!!! | 少妇精品久久久八区九区| 国产av激情无码久久天堂| 欧美精品成人亚洲| 亚洲?V高清一区二区三区尤物| 免费精品中文字幕| 丁香婷婷激情五月天无毒不卡 | 超踫中文字幕| 亚洲精品一区二区日本| 亚洲日韩av一区二区三区百合| 欧美一二三| 亚洲精品官网在线观看| 一区,二区,三区视频| 2025年A片视频精品| 粉嫩国产精品久久粉嫩| 五十路熟女人妻一区二区在线观看| 婷婷色综合| 九九九九9999| 日韩午夜国产| 天天躁日日躁xxxxx| 天天天天做夜夜夜夜做| 天天干夜夜一操| 日本一卡二区在线| www.五月天| 国产成人91一区二区三区| 亚洲熟女乱色| 欧美操逼熟女| 91美女视频直播| www.狠狠| 日韩欧美午夜一区二区| 热热色综合网| 国产精品久久久亚洲一区| 91久久久亚洲| 男人天堂久久精品不卡| 亚洲欧美激情另类色图| 日韩福利综合一区| 风月影院男女十八禁| 午夜寂寞欧美| 熟妇综合一区二区三区| 国产精品久久久久久久免牛肉蒲团| 国产精品视频一区二区三区八戒| 超碰97国产欧美| 极品白嫩福利在线| 秋霞曰韩R级| 欧美亚洲今日在线| 91色综合色| 狠狠狠狠狠狠| 综合在线导航一区| 97天天综合| 久久久工口| 影音先锋国产精品| 天天夜躁日日躁狠狠2002| 欧美在线综合| 欧美在线伊人色| 立川理惠加勒比无码| 青草综合| 丝袜加勒比| 久久夜色一区二区| 色色色网站| 嗯啊抽插大香蕉网页| 亚洲乱妇p22| 亚洲日韩久久精品一区| 蜜臀99999| 99热精品在线| WWW啪啪的com| 69av一区二区三区| 呦呦一区| 久久精品熟妇丰满人妻99| 伊人网在线视频| 国产av白丝| 九九激情网| 亚洲暴力强奸AV| 欧美激情视频在线一区| 九九九久久久| 视频不卡中文字幕| 99在线精品视频| 性欧美第一页| Aa东京男人的天堂| 亚洲人码13| 秋霞男人网| 久久国色天香香蕉| 久久a久久| 亚洲色图大香| 婷婷五月天_亚洲小说欧美激情另类_精品久久国产字幕 | 久久超碰98| 日本免费一区二| 一品道视频一区二区三区| 立川理惠无码一区二区| 户外裸露刺激视频第一区| 日本欧美韩国国产在线| 国产男女边吃边摸视频网站| 日韩精品字幕| 99久久精品无码一区二区毛片免费 | 欧美亚洲清纯| 九九九九97| 4tube欧美女厕所| 一二三四区操操Av| 日本 情色 1区| 蜜汁欧美| 欧美色涩| 天堂69亚洲精品中文字| 伊人黄色片| 艹精品| 在线无码操| 欧美v亚洲v日韩v最新在线二区| 欧美传媒| 激情无码日韩| 九九无码视频| 五月激情小说| 天天日日日射| 亚精品无码毛片一区二区三区| 双插在线| 亚洲图片在线| 色臀AV| 国产精品爆乳懂色蜜乳| 亚洲国产91精品一区二区久久| 91亚洲色人| 另类 日韩 熟女| 色啪网| 久久国色天香香蕉| 亚洲资源网| 校园春色 亚洲| 精品久久久久综合无码| 一级@啪啪视频| 欧亚性爱视频免费看| 狠狠色婷婷7777久| 欧美白嫩女HD| 亚洲资源一区| 亚洲无码国产精品久久| 婷婷五月色| 躁躁日曰躁2020| 青青草导航在线视频| 亚洲激情视频| 亚洲国产精品无码AV在线| 五月丁香综合啪啪| 亚洲精品不卡一二三区| 69天堂| 日韩乱中文| 另类小色呦| 天天操女人| 国产精品国产| 日韩免费簧片| 亚洲宅男天堂| 亚洲在线综合| 日韩综合无码色欲vv| **一级毛片国产| 啊啊啊不要啊啊受不了了视频在线 | 欧美一二三区四五区| 亚洲欲| 91处女在线观看| 中文字幕久热视频在线| 国产精品亚洲四五区在线观看| 人妻色情天天操| 欧美一二三级精品在线| 久久麻豆一区二区| 亚洲脚交| 亚洲制服欧美另类内射| 亚洲激情天堂网| 国产成人亚洲精品无| 深夜激情无码| 亚洲精品白丝| 亚洲国产一级精品毛一级精品看免费视频 | 色第一页| 亚洲人妻在线精品| 青青草密桃在线播放| 美女黄色91| 国产三级中文有码在线视频| 亚洲啪啪啪啪视香蕉| 亚洲高清无码在线桃色| 一区| 国产隔壁老王影院在线| 亚洲熟妇乱女区二区三区| 十八禁黄色| 欧美日综合| 久久激情四射婷婷丁香五月天| av天堂天堂av日韩| 亚洲综合骚逼| 香蕉人人操tv| 日曰骚久久精品| 免费看日本操逼视频| 9999亚洲精品| 成人免费不卡在线视频| 国产丁香精品露脸视频| 91精品久久久久久77777| 骚妻少妇精品性色无码四色A V| 美國A片| 后入福利视频| 99久视频| 麻豆久久一区二区三区| 久久女人视频| 久久久久久一日韩字幕无码| 欧美影音在线| 丁香六月激情综合| 视频一区二区免费在线| 天天干天天中出av| 强奸乱亚洲| 亚洲精品蜜桃久久久| 五月天激情四射| 屁股久久久久久久久久| 狠狠搞 亚洲91| 熟女五十路一区二区三| 亚洲天堂久| 欧美性爱五月天| 亚洲精品国产无码高清| 欧美偷偷网| 婷婷五月成人| 国产精品 久久久精品一牛| 97 九色| 男女一级A片大黄,一进一出| 中文视频在线观看| 女人的天堂大香蕉网| 亚洲四虎熟女精品| 国产精品久久久啊| 骚逼自拍99| caorenqi shipin| 亚洲一区二区三区在线激情| 97精品在线| 亚洲激情网一二三四区| 精品无码不卡视频| 特色a在线上| 久久女同性恋一二区| 无码最新| 日婷婷| 欧美日韩国产精品久久色婷婷| 国产亚洲人妻综合日韩 久久| 91东京热男人的天堂| 日韩在线观看AV| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 欧美日韩亚洲国产中文永久天天看| 欧亚在线视频| 亚洲黄色视频在线观看视频| 久久男人| 亚洲欧洲无码一区夜| 亚州情色j区| 国产一级作爱毛片| 三级日本一区二区三区| 校园春色第一页| 亚洲性综合| 91精品成人www| 国语对白在线播放视频| 岛国网址国产| 亚洲精品国语在线播放| 日韩三级av片| 国产精品对白自产拍| 日韩精品99久久久久久中文字幕 | 99色在线| 久久精品美女一区| 久久性爱网站| 久久亚洲AV无码专区首页| 香蕉视频欧美一卡二卡| 91精品导航| 男人天堂最新手机版在线青青草| 九九九久久久久| 精品国产嫩穴视频| 日本99热| 亚洲不卡AV在线| 久久丁香五月天| 入口操逼网站| 色乱二区| 黄色网址在线免费观看| 久久久久久日韩| 午夜无遮挡男女啪啪视频| 国产中出内射一区二区| 亚洲中文字幕在现观看| 国产精品网址| 91精品国产综合久久久蜜臀酒店| 国产白丝AV| 精精品人妻一区二区三区| 91精品导航| 超碰色97| 久久久9999| 久久久精品91八戒| 特级特黄一级毛片免费| av网站在线观看了| HEYZO高无码国产精品227| 日韩一区二区高清在线观看的| 日本三级A片网站com| 国产精品熟女九色九色蜜臀| 国产欧美成人第一页在线观看| 国产一级高跟丝袜| 国产精品久久久久久久黄无码 | 日韩国产精品人妻无码久久久| 国产精品操| 凹凸视频在线一区二区| 三及片网站| 亚欧高清| 少妇xx精品| 久久精品性| 精品久久久久久亚洲| 欧洲综合视频| 亚州中文字幕超碰97| 日韩欧美天天爽爽爽天天爽爽| 婷婷精品国产欧美精品亚洲人人爽| 中文字幕午夜精品久久久| 国产精品96久久久久久| 欧美日韩国产另类综合| 亚欧高清在线| 校园春色制服丝袜中文字亚洲| 国产有码一区| 国产视频第2页| 中国韩国明星一极片一区乱码毛片人妻熟女一区二区三区 | 九t超碰| 亚洲成人激情小说视频| 精品成人亚洲午夜电影| 性色av婷婷久久一区二区点复制| 97人肏| a人片中文字幕一区二区| 男人的天堂VA| 久久久久久电影| 操91| 2026国产精品视频| 精品黄色电影| 精品区国产区一区二区三区| 精品网站9999| 自拍啪啪视频| 天天懆天天日| 一区二区三区精品黑丝白丝酒店对鸡 | 亚欧高清| 天堂种子在线www网资源| 亚州操操穴网| 欧美BT 亚洲色图| 国产AV色黄看到爽| 国产乱码久久| 人妻少妇精品无码专区二区密桃| 国产毛片毛片4p懂色| 亚洲一区中文字幕一区| 久久久久久久久久久久久久久性生活视频| 欲色啪| 人妻一区二区三区视频| 综合五月天| 白嫩妹子国产骚| 丁香九月 婷婷| 欧美色棕合| 五月天婷婷社区| 亚乱色| 亚洲淫乱骚妇AV| 好湿好紧视频| 久久婷综合| 综合久久99亚洲人妻中文在线| 成人免费性爱视视| 狠狠干,狠狠操| 蜜桃传媒视频第一区入口在线看| 国产操操日韩三级黄| 日少妇亚洲版| 极品销魂美女一区二区| 99热超碰| 啪啪视频免费在线观看| 人妻嗯啊啊在线播放| 亚洲综合色图欧美| 免费操逼视频下载| 久久网亚洲| 家庭乱伦网站国产| 亚洲综合 欧美| 国产一级不卡在线观看| 密臀视频一区二区三区| 亚洲,日韩,欧美,成人播放| 日本一片一区| 大香蕉视频一二三区| 日本裸体久久色噜噜| 亚洲欧美综合| 伊人午夜福利视频| 免费在线黄片视频| 茄子社区国产精品| 青娱乐日韩无码| 91M一社| 91爆操视频| 男人天堂导航| 欧美 亚洲 综合 制服| 欧美天天弄| 久久欧美1卡2卡3| 日韩精品在线放| 亚洲诱惑| 在线精品福利免费播放| 蜜桃久久一区| 国产精品久久久亚洲一区| 亚洲熟女乱色一区二区三区| 日韩天天本| 国人欧美精品一区二区| 97超级久久| 日本91白丝| 99婷婷一区二区| 青青草字幕AV| 97香蕉碰碰人妻国产欧美| 快灬快灬 一下爽蜜桃在线观看 | AV一二区| 午夜福利av电影在线| 欧美日韩国产人人| 大香蕉啪啪啪| 東南亚性呦成人伦理资源在线视频| www鬼畜国产男人的天堂| 在线岛国新天堂8| 夜夜嗨TV| 毛片视频白嫩| 插日本熟女视频| 日本一区二区三区四区五区六区七区八区九区 | 欧美18老人禁| 久久亚洲日韩国产欧| 欧美三级一级| 人、人、摸,人、人、草| 91天天综合日韩欧美| 久久亚洲人妻| 成人资源中文字幕在线观看天天| 日本黄色大片一级视频免费麻豆| 97超碰精品图片| 最新精品久久蜜桃 | 久久毛卡| 试看60秒 爽| 国产诱惑| 97内射偷拍| 日本道久久综合色色| 夜夜嗷嗷一区二区| 91免费看中出视频| 国产1769在线| 熟女啪啪视频| 深夜福利黄片| 亚洲精品国产精品乱码不99| 久久久久久性爱片| 国产后入| 这里只有精品视频在线| 国产精品久久泡妞网站| aⅴ日韩成人电影av在线免费看av大全| 在线 亚洲 网爆 自拍| 欧美综合狠| 中文字幕视频二区| 国产午夜精品理论片a大结局| 人妻久热在线| 99精品久久久久久久婷婷| 9久久久久| 一级免费精品| 屁股久久久久久久久| 97舔舔| 国产精选三级在线观看| av亚欧| 国产美女高潮视频| 亚洲18禁| 一二三区在线| www.久久| 99热久| 五月丁香激情综合网| 欧美日韩国产色图在线| 亚欧视频在线| www亚洲免费| 夜夜操美女| jazzjazz国产精品麻豆| 久久狠狠色噜噜狠狠狠狠97| 久久久97| 大香蕉乱级| 国产乱伦亚洲| 一级黄色视频网| 91丨豆花丨熟女| 亚洲天堂中文字| 国产成人在线观看综合| 五月丁香色情| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 天天操天天干美女网址导航| www.97在线| 大香蕉在线免| 中国熟女网站| 蜜臀99久久精品| 国产精品播放| 色香欲综合| ji熟女.com| 国产伦乱91| 国产成人资源| 91nbbbbbb| 亚洲色人| 草草网站影院白丝内射| 丁香九月 婷婷| 五月丁香婷婷综合| 性老妇一区二区三区| 国产熟女一区二区| 久久中文字幕一区不卡| av资源在线观看少妇| 殴美日韩m| 亚洲天堂久久| 久久精品欧美一区二区三区不卡| 成年在线视频日本亚洲在线视频区精品江靖宇公司 | 久久大香蕉手机高清视频| 无码精品久久| 五十路熟女人妻一区二区在线观看| 91夜夜蜜桃臀1区2区3区| 日本 成 人 小说 电影 一区二区| 国产精品不卡一区二区电影| 97天天在线| 熟女视频久久| 大香蕉一级黄色片久久| 你操综合| 在线观看精品国产免费| 亚洲丝袜诱惑| 内射黑丝袜| 欧美亚洲国产自久久| 日韩欧美亚欧在线视频| 六月婷婷一区二区三区| 盗摄女人妻在线| 欧美色图 人妻| 射久久| 狠狠躁日日躁夜夜躁A| 人人操人人插人www| 久久亚洲婷婷| 人人潮人人摸| 美国aaaaa一级黄片| 欧美性爱1080p| 91精品无码人妻系列| 久久HD| 国产精选三级在线观看| 国产高清成人mv在线观看| 欧美精品在线观看| 视频不卡中文字幕| 欧美中出1| 久久久久久九九九九| www老逼91| 夜夜夜夜久久久久| 久久天天摸| 国产AV色黄看到爽| 青青草五月天| 日韩久久激情精品| 青草综合| 日韩精品.久久精品.AV女优.天美传媒 | 九九黄色网| 粉嫩av平台| 亚洲超碰综合网| 志村玲子视频一区二区| 亚洲国产成人精品久久久国产成人一区二区 | 人妻超碰青青草98| 9 9精品一区二区三区| 日日操免费视频| 97超碰超| 人妻天天爽| 99热色这里只有精品| 日本理论在线| 午夜国产综合视频在线观看| nuu12国产麻豆精品| 欧美成不卡网| 丁香激情网| 国产小u女在线观看| 国产午夜精品在线观看| 蜜臀Av一区二区三区| 欧美熟女逼久久久久久| 亚洲国成人情色好看电影| 成年女人18级毛片毛片免费观看| 78超碰| 91痴汉| 夜夜精品视频一区二区| 日韩精品操少妇| 天天综和| 久久最新视频免费观看| 91AV老熟女视频| 亚洲 图片 综合91| 98一区二区精品| 亚欧精品久久久久久久久久久| 久久的免费性爱视频| 亚洲欧美一区二区网址| 日韩成人私密一级精品av| 欧美一区二区男人天堂| 久久精品 六十路 熟女 欧美| 男女一进一出视频久久| 国产精品白领在线观看| 操www| 人妻人人做人人澡人人爽欧美一区| 中国一级操逼视频| 99久久久er直播网址| a片在线播放| 欧美一级特黄淫片在线观看| 在线v中文字幕一区二区三区| 成人无码在线超碰网| 日韩欧美国产一区二区三区四区| 亚洲AV秘 精品久久老牛影视| 在线a v| 9久超碰| 最新精品久久蜜桃 | 综合国产影视三级| 三级片网站在线播放| 黄呦呦在线| 性夜影院爽黄A爽免费动漫| 久久亚洲影院一区二区| 国产精品内射婷婷一级二| 中文字幕伊人| 国产小黄片在线免费观看| 日韩一卡二卡三卡| 天堂国产AV| 午夜福利精品| 亚洲自拍欧美色综合| 国产精品不卡一区二区三区av| 久久99操天天日| 96国产污污污丝袜| 伊人网在线点播| 欧亚性爱啪啪| 亚州久久9| 久久久久九九九| 97超碰色五月| 日本操逼视频不卡直接放| 超碰亚洲欧美日韩无| 夜夜高潮夜夜爽高清视频一| 啊啊啊在线看| 欧美黄色大片在线观看| 97精品视频网站| 美女一区二区国产精品| 亚洲精品人妻吞精av| 久久久艹艹艹| 97久久免费| 国产极品久久久| 伦理第一页| 中文字幕乱码人妻二区三区| 国产亚洲日本精品在线| 久久人妻无码毛片A片麻豆| 波多野结衣一级视频| 又黄又爽在线观看视频 | 无码 黑人一区二区三区| 911粉嫩人妻| 怡红院视频在线| 啊啊啊啊,啊啊好多水| 久久‘黄片视频| 97超视频在线观看| 国产精品高朝久久久久久久| 亚洲欧洲视频小说在线观看| 久久久久久99999国产精品| 欧美精品三级黄片| 在线观看黄色电话| 欧美天堂日韩三级国产传媒| 丁香六月啪| 男女香蕉一区二区| 99综合免费视频| 日韩操p| 久久久久9999精品九九九| 日韩欧美亚洲一区二区三区影院| 97国产中文| 天天干天天日天天射黄色片| 熟女这里只有精品6| 夜夜操夜夜高潮夜夜爽国产精品区| 欧美日韩第一页| 偷拍亚洲熟女视频播放| 久久久无码精品人妻二区| 国产伦精品一区二区三区在线观| 亚州91| 欧美人妻熟女在线| 中文一区二区婷婷视频| 久久久久成人亚洲国产| 91熟女视频网| 国产亚洲精品美女| 久久久国产亚洲精品系列| 老鸭窝成人免费毛片视频| 女人天堂网| 久久大精品乱码视频人妻熟女| 久久‘黄片视频| 乱性AV| 黄片免费日韩| 91久久久亚洲| 久操精品| 亚洲伊人青青草| 色综合99999| 区一二区日韩亚洲乱码av电影| 五月激情小说| 色五月婷婷麻豆在| 久久熟女久| 2026国产精品视频| 大香蕉久久| 久久婷五月天| 亚洲91少妇| 欧美久久婷| 久久综合日韩亚洲欧美| 久久国色天香香蕉| 激情五月天丁香| 天天影视色香色欲| 亚洲欧洲视频小说在线观看| 亚洲色鬼| 神马午夜久久久| 中文字幕第95页| 亚洲青青青视频在线| 婷婷三区| 久久超碰亚洲人| 国产精品suv一区| 人妻熟女一区二区三区视频| 亚洲 欧美 小说| 99最新日韩偷拍视频| 黄站在线免费观看| 999久久久九九九九| 免费日韩黄片| 天堂岛av| 亚洲男人的天堂网| 欧美综合色图片| 亚洲图片日本AⅤ欧美在线| 超碰人人在线| 欧美熟女妇同| 火箭成精品视频884必出精品| 91人妻最真实刺激绿帽| 久久婷婷六月综合| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 天天天天天天天天综合| 天操天操夜操夜月操月年年操操| 97在线免费看视频| 久久精品国产亚洲AV嘿嘿| 热久久这里只有精品| 亚州色图片在线色| 国产91精品在线免费| 亚洲成人网站在线观看| 日本一区二区中文字幕久久| 伊人五月天婷婷| 天天舔日美女视频| 久久本道| 啪啪综合网| 国产网站在线播放| 操一对老熟妇爽上天视频| 亚洲熟妇丝袜在线观看| 亚洲最大无码中文字幕网站| 高清一区AV无码| 91色欧美| 亚洲男人天堂视频| 国产一区二区久久| 亚洲天堂99| 天天欧美| 高清有码一区二区| 亚洲人91| 亚洲成?V人片在线观看福利| 超碰诱惑| 一区二区 韩日AV| 成人久久久| 欧美猛交黑寡妇中文字幕| av在线免费一区二区| 色与欲影视天天看综合网| 亚洲综合另类欧美久久久| 可以在线观看的黄色网址| 快播久久人人aV| 鸥美精品一区二区久久婷婷| 欧美精品99久久久**| 五月婷婷激情网| 国产精品国产| 午夜天堂啪啪| 国产精品美女久久久久AⅤ国产馆| 桃色人妻在线视频| 另类欧美色| 国产一区二区在线电影| 极品出轨视频网站| 99精品久久久久久久婷婷蜜桃| 亚洲男人天堂2013| 中文字幕日韩精品久久| 97日视频| 25国产精品免费观看| 伊人久久综合影院| 在线日韩精品一区二区三区| 国产五码丝袜屁眼| 女同亚洲欧美一二三区久久电影| 三级特黄60分钟播放| 欧美日韩97| 欧美丝袜91| 亚洲欧美日韩中文久久自慰| 亚洲精品蜜桃久久久一区二区三区| 中文字幕AV乱伦| 激情一区二区| 人妻少妇精品无码专区二区密桃| 小骚逼被操的爽不爽| 人妻在线臀日韩| 一区二区首页| 国产日韩精品一区二区三区| 中文字暮97| 久久侵犯人妻爽爽爽| 久久久久久久久久久久久久9999| 桃花色涩综合影院| 五月天激情小说| 丁香五月天啪啪| 天天综合色电影| 韩国轻伦国内自拍一区| 伊人色综合超碰| 少妇与黑人高潮在线| 久久婷婷欧美| 黄色一区三区| 精品久久久久久久| 国产美女高潮| 国产亚洲女v在线观看| 在线观看成人性爱免费小视频| 欧美日韩岛国大片在线观看| 欧美综合区| 夜夜操av亚洲一区二区| 日韩少妇无吗| 97干在线视频| 中国AV美女| 婷婷综合五月天| 日韩情色视频| 丝袜av一区二区三区| 中文字幕人妻丝袜乱一区三区| 超碰97网站| 搡老熟女老女人老熟妇免费视频| 亚洲精品一区中文字幕乱码| oumeizonghese,www| 欧美日韩不卡传媒| 老司机老司机午夜影院| 亚洲国产激情国产av| 九热中文字幕| 天天操人人操狠狠插| www.欧精品| 欧美综合狠| 国产51色综合久久免费| 97精品国产97久久久| 九九九九九九免费视频| 欧美Ⅴ性爱| 久9久| 夜夜嗨TV| 欧美成人午夜免费福利785| 69AV女优男人的天堂| 在线视频97| 欧美天天插| 女人久久久| www.色婷婷.com| 性色A∨91| 日韩美一区| 2017亚洲天堂| 蜜臀av中字字幕网站| 伊人久久AV诱惑悠悠| 东京热激情视频一二三区 | 人妻啊啊人妻啊| 夜夜嗨免费视频| 九九香蕉网| 天天欲望网| 久久天天躁日日躁狠狠躁| 色香综合| 国产精品。| 久久久久久久精| 麻豆精品A片免费观看| 色噜噜精品一区二区三| 啊啊啊啊啊啊啊网址在线观看| 丰满人妻av一区二区三区| 日韩综合第八区国产精品| 天天影视综合网欧美精品| 久久女人| 日韩无码AB| 国产 三级自拍| a'v在线资源| 欧美,亚洲,日韩,v,天堂,手机在线观看| www.大香| 久操97| 欧美亚洲涩涩| 超碰久久中文| 欧美一级特黄淫片在线观看| 日韩熟女无码| 99色色网| 色婷婷香蕉| 日韩精品一区的| 激情久久久| 色色婷婷五月| 五月丁香六月婷| 99综合网| 国产精品久久久久久夜夜夜| 91亚洲黑人| 97色欧州| 香蕉久久精品| 九七人妻在线| 天天久久| 色呦呦国产精品免费看| 亚洲av无码成电影在线播放| 欧美激情亚洲| 无码久久亚洲高清,| 操逼www.|