音视频系列——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.mzph.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 类来…