当前位置: 首页 > news >正文

浏览器端实时语音采集 + WebSocket 传输 + 后端 Whisper + GPT 翻译 + 实时字幕返回

这个版本相当于一个轻量级“实时同传字幕服务器”,
打开网页 → 点击录音 → 说话
后端实时识别并翻译 → 字幕实时显示
延迟在 1~2 秒内(取决于网络与模型大小)
可部署在局域网或云服务器(HTTP + WebSocket)

项目结构
realtime_subtitles/
├── server.py # FastAPI 后端(ASR + 翻译 + WebSocket)
├── static/
│ └── index.html # 前端网页
├── .env # OPENAI_API_KEY
└── requirements.txt

requirements.txt
fastapi
uvicorn
faster-whisper
soundfile
python-dotenv
openai
numpy
安装依赖:
pip install -r requirements.txt

.env
OPENAI_API_KEY=sk-…

server.py (FastAPI 后端)
import os
import asyncio
import tempfile
import numpy as np
import soundfile as sf
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
from fastapi.staticfiles import StaticFiles
from faster_whisper import WhisperModel
from dotenv import load_dotenv
import openai

load_dotenv()
openai.api_key = os.getenv(“OPENAI_API_KEY”)

app = FastAPI()
app.mount(“/”, StaticFiles(directory=“static”, html=True), name=“static”)

初始化 Whisper 模型

print(“🚀 Loading Whisper model…”)
model = WhisperModel(“small”, device=“cuda” if torch.cuda.is_available() else “cpu”)
print(“✅ Model ready.”)

async def translate_text(text: str):
“”“调用 LLM 翻译”“”
prompt = f"将以下英文句子翻译成自然、口语化的中文字幕:\n{text}\n翻译:"
try:
response = openai.ChatCompletion.create(
model=“gpt-4o-mini”,
messages=[{“role”: “user”, “content”: prompt}],
temperature=0.2,
max_tokens=150,
)
return response.choices[0].message.content.strip()
except Exception as e:
return f"(翻译失败:{e})"

@app.websocket(“/ws/audio”)
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
buffer = bytearray()
last_receive = asyncio.get_event_loop().time()

try:while True:data = await websocket.receive_bytes()buffer.extend(data)now = asyncio.get_event_loop().time()# 每约1秒钟处理一次if len(buffer) > 32000 * 2 or (now - last_receive > 1.0):last_receive = nowtmpf = tempfile.NamedTemporaryFile(suffix=".wav", delete=False)arr = np.frombuffer(buffer, dtype=np.int16).astype(np.float32) / 32768.0sf.write(tmpf.name, arr, 16000, subtype="FLOAT")segments, info = model.transcribe(tmpf.name, beam_size=3)text = " ".join([seg.text for seg in segments]).strip()buffer = bytearray()if text:translated = await asyncio.to_thread(translate_text, text)await websocket.send_json({"en": text, "zh": translated})
except WebSocketDisconnect:print("🔌 WebSocket disconnected")
except Exception as e:print("❌ Error:", e)

static/index.html (浏览器端)

实时翻译字幕 Demo

🎙️ 实时语音翻译字幕 Demo

🎤 开始录音

运行与测试
在项目目录下运行:
uvicorn server:app --host 0.0.0.0 --port 8000
打开浏览器访问:http://localhost:8000
点击“🎤 开始录音”,对麦克风讲话(英文),几秒后会看到中英文字幕实时出现。

架构逻辑图
Browser (Audio Stream via WebRTC/WS)
↓ PCM chunks
FastAPI WebSocket Endpoint

Whisper (faster-whisper small)

GPT 翻译 (ChatCompletion)

send_json({en, zh})

Browser Subtitle Display
优化方向
在这里插入图片描述

http://www.dtcms.com/a/549173.html

相关文章:

  • 亚马逊巴西拓宽当日达覆盖区域,配送门槛大幅下调
  • 《UniApp 安全区适配与自定义导航栏全攻略》
  • 邯郸住房及城乡建设部网站有专门做ppt的网站有哪些
  • Spring Boot3零基础教程,Lambda 表达式的使用,笔记96
  • Rust入门开发之Rust 语法中函数基本形式详解
  • 【机器学习】管道化与自动化建模
  • LangChain Few-Shot Prompt Templates(two)
  • Spring Al学习3:Prompt
  • 网站优化外链贵州互联网公司
  • 宿迁做网站哪家好做网站要注意哪些
  • 打造属于你的 Telegram 中文版:汉化方案 + @letstgbot 搜索引擎整合教程
  • web--请求响应、分层解耦
  • 做进化树的在线网站东莞软文推广
  • 从零开始的云原生之旅(八):CronJob 实战定时清理任务
  • Python自动化测试 | 快速认识并了解pytest的基本使用
  • 网站备案增加域名天津招聘网人才招聘官网
  • 有什么做外贸的好网站直播网站app下载
  • seo网站改版方案怎么写如何做网站内部优化
  • 找婚庆公司去什么网站亚马逊雨林动物大全
  • 基于百度地铁 API 的长沙地铁站点详情查询与路线导航实践
  • C# 继承
  • Ubuntu 24.04 从源码编译 dcgm-exporter
  • 【软件测试基础】详解数据库核心操作:增删改查,及测试关注点
  • 建网站服务厦门市建设路网站
  • 大模型-多模态机器学习
  • JavaSE基础——第十三章 泛型
  • 从传统到未来:Java在现代开发中的新价值与进化方向
  • 设置linux公钥,私钥登录ssh登录
  • html的网站案例wordpress文章彩色字体
  • set/map刷力扣题/(哈希表+排序类型)仿函数和捕获-两种方法解决