音視頻系列——Websockets接口封裝為Http接口

模型服務示例:實時語音轉文本服務

本示例展示一個支持雙協議(WebSocket流式接口+HTTP同步接口)的語音轉文本模型服務,并提供將WebSocket接口封裝為HTTP接口的代碼實現。


一、服務架構設計

HTTP POST
WebSocket
客戶端
HTTP接口
流式接口
協議適配層
語音識別模型
文本結果

二、WebSocket流式接口實現(Python)

使用FastAPI實現流式語音識別服務:

# websocket_server.py
from fastapi import FastAPI, WebSocket
import asyncioapp = FastAPI()async def process_audio_stream(bytes_data: bytes) -> str:# 調用語音識別模型(示例用偽代碼)return "識別文本片段"@app.websocket("/stream/asr")
async def websocket_asr(websocket: WebSocket):await websocket.accept()try:while True:audio_chunk = await websocket.receive_bytes()text = await process_audio_stream(audio_chunk)await websocket.send_text(text)except WebSocketDisconnect:print("客戶端斷開連接")

技術特點
? 支持分片音頻流實時識別
? 全雙工通信降低延遲
? 自動處理連接斷開


三、HTTP同步接口實現

# http_server.py
from fastapi import FastAPI, File, UploadFile
import httpxapp = FastAPI()@app.post("/api/asr")
async def http_asr(file: UploadFile = File(...)):# 調用內部WebSocket服務(后文實現封裝)async with httpx.AsyncClient() as client:result = await client.post("http://adapter:8000/adapt/asr", files={"file": (file.filename, await file.read())})return result.json()

四、WebSocket轉HTTP適配器實現

方案1:異步代理模式(推薦)
# adapter.py
from fastapi import FastAPI, UploadFile, File
import websockets
import asyncio
import uuidapp = FastAPI()async def websocket_client(audio_data: bytes):async with websockets.connect("ws://localhost:8000/stream/asr") as ws:# 分片發送音頻數據chunk_size = 1024for i in range(0, len(audio_data), chunk_size):await ws.send(audio_data[i:i+chunk_size])await asyncio.sleep(0.01)  # 模擬流式傳輸# 接收最終結果final_result = []while True:try:result = await asyncio.wait_for(ws.recv(), timeout=1.0)final_result.append(result)except (asyncio.TimeoutError, websockets.ConnectionClosed):breakreturn "".join(final_result)@app.post("/adapt/asr")
async def adapt_http_to_ws(file: UploadFile = File(...)):audio_data = await file.read()return {"text": await websocket_client(audio_data)}
方案2:消息隊列橋接
# 使用Redis Stream實現
import redis
r = redis.Redis()async def process_task(file_data: bytes):task_id = str(uuid.uuid4())# 將任務放入隊列r.xadd("asr_tasks", {task_id: file_data})# 等待結果while True:result = r.get(f"result:{task_id}")if result:return result.decode()await asyncio.sleep(0.1)@app.post("/queue/asr")
async def queue_adapter(file: UploadFile = File(...)):return {"text": await process_task(await file.read())}

五、協議轉換關鍵技術點

  1. 數據分片處理
    ? HTTP接口接收完整文件后自動切分為WebSocket流式分片
    ? 設置合理的數據塊大小(建議1-4KB)

  2. 超時控制

    # 設置10秒超時
    async with async_timeout.timeout(10):return await websocket_client(data)
    
  3. 錯誤重試機制

    @retry(stop=stop_after_attempt(3), wait=wait_fixed(0.5))
    async def safe_websocket_call():# 包含心跳檢測的穩定連接
    
  4. 協議頭轉換

    # 攜帶HTTP認證頭到WebSocket
    headers = {"Authorization": request.headers.get("Authorization")}
    async with websockets.connect(ws_url, extra_headers=headers) as ws:# ...
    

六、性能對比

指標WebSocket流式接口HTTP封裝接口
延遲200-500ms1-2s
吞吐量1000 req/s300 req/s
CPU占用較高(持續連接)較低(短連接)
適用場景實時語音/視頻流文件上傳/短文本
開發復雜度需要處理連接狀態簡單請求響應模型

七、部署建議

  1. 容器化配置

    # Dockerfile
    FROM python:3.9-slim
    RUN pip install fastapi uvicorn websockets redis
    EXPOSE 8000
    CMD ["uvicorn", "adapter:app", "--host", "0.0.0.0"]
    
  2. 負載均衡策略

    # Nginx配置
    upstream asr_servers {server ws1:8000;server ws2:8000;keepalive 10; # 保持WebSocket長連接
    }
    
  3. 監控指標
    ? WebSocket連接存活時間
    ? HTTP請求成功率
    ? 音頻流分片處理延遲


以上實現完整支持兩種協議的混合調用模式,開發者可根據實際場景選擇適配方案。如需測試完整代碼,建議參考WebSocket官方測試方法建立端到端驗證流程。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/72925.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/72925.shtml
英文地址,請注明出處:http://en.pswp.cn/web/72925.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Axure項目實戰:智慧城市APP(一)(動態面板、拖動效果)

親愛的小伙伴,在您瀏覽之前,煩請關注一下,在此深表感謝! 課程主題:智慧城市APP便民服務平臺 主要內容:完整智慧APP原型設計 應用場景:各類政務型、B端APP均可參考 案例展示:&…

MySQL 入門大全:數據類型

🧑 博主簡介:CSDN博客專家,歷代文學網(PC端可以訪問:https://literature.sinhy.com/#/literature?__c1000,移動端可微信小程序搜索“歷代文學”)總架構師,15年工作經驗,…

Java 記憶鏈表,LinkedList 的升級版

文章目錄 記憶鏈表 MemoryLinkedList實戰源代碼 眾所周知,ArrayList 和 LinkedList 是 Java 集合中兩個基本的數據結構,對應數據結構理論中的數組和鏈表。但在這兩個數據結構,開發者們通常使用 ArrayList,而不使用 LinkedList。JD…

《白帽子講 Web 安全》之開發語言安全深度解讀

目錄 引言 1.PHP 安全 1.1變量覆蓋 1.2空字節問題 1.3弱類型 1.4反序列化 1.5安全配置 2Java 安全 2.1Security Manager 2.2反射 2.3反序列化 3Python 安全 3.1反序列化 3.2代碼保護 4.JavaScript 安全 4.1第三方 JavaScript 資源 4.2JavaScript 框架 5.Node.…

鴻蒙HarmonyOS NEXT應用崩潰分析及修復

鴻蒙HarmonyOS NEXT應用崩潰分析及修復 如何保證應用的健壯性,其中一個指標就是看崩潰率,如何降低崩潰率,就需要知道存在哪些崩潰,然后對癥下藥,解決崩潰。那么鴻蒙應用中存在哪些崩潰類型呢?又改如何解決…

分析K8S中Node狀態為`NotReady`問題

在Kubernetes(k8s)集群中,Node狀態為NotReady通常意味著節點上存在某些問題,下面為你分析正常情況下節點應運行的容器以及解決NotReady狀態的方法。 正常情況下Node節點應運行的容器 1. kubelet kubelet是節點上的核心組件&…

第六屆機電一體化技術與智能制造國際學術會議(ICMTIM 2025)

重要信息 4月11-13日 南京江北新區工業大學亞朵酒店 www.icmtim.org(點擊了解參會投稿等) 簡介 由南京工業大學主辦,南京工業大學電氣工程與控制科學學院、中國礦業大學、黑龍江大學、江蘇省自動化學會承辦的第六屆機電一體化技術…

INT202 Complexity of Algroithms 算法的復雜度 Pt.2 Search Algorithm 搜索算法

文章目錄 1.樹的數據結構1.1 有序數據(Ordered Data)1.1.1 有序字典(Ordered Dictonary)1.1.1.1 排序表(Sorted Tables) 1.2 二分查找(Binary Search)1.2.1 二分查找的時間復雜度 1.3 二叉搜索樹&#xff0…

【AVRCP】藍牙鏈路控制器(LC)與AVRCP互操作性要求深度解析

目錄 一 、Link Controller(LC)概述 1.1 LC的定義與功能 1.2 LC在藍牙技術中的重要性 二、Link Controller(LC)互操作性要求 2.1 互操作性要求概述 2.2 物理層互操作性要求 2.3 鏈路管理互操作性要求 2.4 其他互操作性要求…

高級背景摳圖工具(python)

這是一個專業的圖像背景處理工具,基于Python開發,主要功能包括:1. 智能背景去除 - 使用rembg庫的深度學習模型自動識別并移除圖片背景。 2. 背景自定義 - 支持純色背景替換,保留透明通道(Alpha通道)。3. 高級參數調節 - 提供5種專業級圖像處理參數。4. 實時預覽 - 雙窗口…

如何設計外貿郵件開發信主題

開發信是打開客戶大門的第一步,而郵件主題則是決定客戶是否打開郵件的關鍵。一個吸引人的主題不僅能提高打開率,還能為后續溝通打下良好基礎。 一、突出價值和利益 郵件主題要直接傳達收件人能從中獲得的價值和利益,引起他們的興趣和關注。…

wordpress表單插件CF7調用方式

Contact Form 7(CF7)是WordPress中非常流行的表單插件,以下是其常見的調用方式: 通過短代碼調用 在頁面或文章編輯器中添加:完成表單設置后,復制表單對應的短代碼,然后在需要顯示表單的頁面或文章的編輯器中直接粘貼…

快速入手-基于Django的主子表間操作mysql(五)

1、如果該表中存在外鍵,結合實際業務情況,那可以這么寫: 2、針對特殊的字典類型,可以這么定義 3、獲取元組中的字典值和子表中的value值方法 4、對應的前端頁面寫法

網絡運維學習筆記(DeepSeek優化版) 021 HCIA-Datacom新增知識點03園區網典型組網架構及案例實戰

文章目錄 園區網典型組網架構及案例實戰1 園區網定義2 園區網絡典型架構3 各層級協議與技術4 項目生命周期管理5 小型園區網絡設計框架5.1 組網方案設計5.2 IP地址規劃5.3 園區內部的路由設計5.4 NAT設計5.5 WLAN設計5.6 安全設計5.7 運維管理設計 6 小型園區的實施方案與運維手…

1.8 函數的連續性和間斷點

1.連續的定義 2.間斷點的定義 3.間斷點的分類

基于Arm GNU Toolchain編譯生成的.elf轉hex/bin文件格式方法

基于Arm GNU Toolchain編譯生成的.elf轉hex/bin文件格式方法 已經棄用的版本(Version 10.3-2021.10):gcc-arm-none-eabi:https://developer.arm.com/downloads/-/gnu-rmArm GNU Toolchain當前版本:https://developer.a…

希爾排序中的Hibbard序列

一 定義 Hibbard序列的每個元素由以下公式生成: h_k = 2^k - 1 其中k從1開始遞增,序列為:1, 3, 7, 15, 31, 63, … 二 生成方式 起始條件:k=1,對應h_1=2^1-1=1 遞推公式:每次k增加1,計算 h_{k+1}=2^{k+1}-1 示例:前5項…

失敗的面試經歷(??∧??)

一.面向對象的三大特性 1.封裝:將對象內部的屬性私有化,外部對象不能夠直接訪問,但是可以提供一些可以使外部對象操作內部屬性的方法。 2.繼承:類與類之間會有一些相似之處,但也會有一些異處,使得他們與眾…

算法及數據結構系列 - 二分查找

系列文章目錄 算法及數據結構系列 - BFS算法 文章目錄 二分查找框架思路經典題型二分查找尋找左側邊界尋找右側邊界 刷題875. 愛吃香蕉的珂珂1011. 在 D 天內送達包裹的能力392. 判斷子序列 二分查找 框架思路 int binarySearch(int[] nums, int target) {int left 0, righ…

SpringBoot的啟動原理?

大家好,我是鋒哥。今天分享關于【SpringBoot的啟動原理?】面試題。希望對大家有幫助; SpringBoot的啟動原理? 1000道 互聯網大廠Java工程師 精選面試題-Java資源分享網 Spring Boot的啟動原理主要是通過 SpringApplication 類來…