Skip to content

SiVeci/EchoSRT

Repository files navigation

EchoSRT Logo

EchoSRT 字幕工作台

Version Platform Python Version Framework License


目录


项目简介

EchoSRT 是一个音视频字幕自动化提取与翻译工具。提供 WebUI 工作台,支持本地 GPU/CPU 推理以及云端 API 处理,提供一站式、全自动流水线解决方案。

完整文档EchoSRT 文档站 包含安装指南、使用教程、架构说明、API 参考和部署方案。

核心特性

语音识别 (ASR)

  • 本地推理引擎:内置 faster-whisper,自动探测 NVIDIA CUDA 加速或回退 CPU 模式,支持 VAD 静音过滤、Beam Size 等高阶参数。子进程隔离运行,崩溃不影响主服务。
  • 云端 API 引擎:兼容 OpenAI 格式的语音 API,针对超大文件实现突破 25MB 限制的物理切片与时间戳重排机制。额外支持说话人识别(Speaker Diarization)与词级时间戳

大语言模型翻译 (LLM)

  • 在线 API 翻译:基于并发信号量 (asyncio.Semaphore) 实现字幕分块异步翻译。支持 DeepSeek、ChatGPT 等任意兼容 OpenAI 接口的模型,结合上下文自动润色。
  • 本地离线推理:支持 GGUF 量化模型,基于 llama-cpp-python 实现本地推理。将模型文件放入 models/llm/ 目录后,通过 WebUI 配置 GPU 加速层数、上下文长度与闲置释放时间。显存不足时自动下调 max_tokens 防止 OOM。
  • GPU 显存互斥管理:开启后本地识别 (faster-whisper) 与本地翻译 (GGUF) 互不抢占显存,翻译任务自动给识别任务让路,防止因并发加载导致的 OOM 崩溃。

系统与运维

  • API 多方案管理:支持为 ASR 和 LLM 分别预设多套 API 配置(Base URL / Key / Model),一键切换方案池。
  • 自动化非阻塞流水线:后端基于 FastAPI + asyncio.Queue 实现多任务调度,支持批量下发处理。
  • 断点续传与状态持久化:任务中断或服务重启后,自动从断点(提音/识别/翻译)恢复,无需从头开始。
  • 任务中断与取消:支持单个任务中断或一键中断全部任务,优雅中止 FFmpeg/API 请求并清理临时文件。
  • FFmpeg 高级控制:支持多音轨选择、指定时间范围裁剪(-ss / -to),适配多音轨 MKV 等复杂场景。
  • 任务资产清理:支持按类型(视频/音频/原声/翻译字幕)批量清理任务资产,释放磁盘空间。内置 500MB 磁盘安全冗余检查。
  • 可视化 Web 工作台:Vue 3 前端,提供实时 WebSocket 状态同步、滚动日志输出与看板式资产管理。支持拖拽排序任务。
  • 分流代理机制:支持按模块(模型下载 / 云端 ASR / LLM 翻译)独立接管 HTTP/SOCKS5 网络代理,三路互不干扰。
  • 媒体库扫描引擎:自动扫描磁盘目录,基于文件指纹(路径 + 大小 + mtime)去重导入,支持状态自愈与 20+ 种媒体格式。
  • 多平台 Docker 部署:提供 CPU 和 GPU 独立镜像,NAS 友好(PUID/PGID 权限对齐)。

快速部署

方案一:Docker 部署 (推荐)

1. 使用 Docker Compose 启动 (最简单)

已提供云端预编译镜像,在项目根目录下直接使用 docker-compose 启动:

# 启动 CPU 节点(适合绝大多数无显卡的家用 NAS 或服务器)
docker-compose up -d echosrt-cpu

# 或者:启动 GPU 节点(需在宿主机安装 NVIDIA Container Toolkit 及驱动)
docker-compose up -d echosrt-gpu

注意:Docker Compose 中 CPU 默认映射 8000 端口,GPU 默认映射 8001 端口,可同时启动。

2. 使用 Docker CLI 手动启动

使用 docker run 命令启动预编译镜像:

# CPU 版本
docker run -d --name echosrt-cpu \
  -p 8000:8000 \
  -v $(pwd)/workspace:/app/workspace \
  -v $(pwd)/models:/app/models \
  -v $(pwd)/config:/app/config \
  ghcr.io/siveci/echosrt:cpu-latest

# GPU 版本 (需增加 --gpus all 参数,端口改用 8001 避免与 CPU 实例冲突)
docker run -d --name echosrt-gpu \
  --gpus all \
  -p 8001:8000 \
  -v $(pwd)/workspace:/app/workspace \
  -v $(pwd)/models:/app/models \
  -v $(pwd)/config:/app/config \
  ghcr.io/siveci/echosrt:gpu-latest

3. 手动构建镜像 (可选)

# 构建 CPU 镜像
docker build -t echosrt:cpu-local -f Dockerfile .

# 构建 GPU 镜像
docker build -t echosrt:gpu-local -f Dockerfile.gpu .

# 构建完成后,将上述 docker run 命令中的镜像名称替换为构建的镜像名后运行

方案二:本地 Python 运行

# 1. 安装 FFmpeg
# Windows: 下载 FFmpeg 并在项目根目录创建 bin/ffmpeg/bin/ 放入 ffmpeg.exe
# Linux: sudo apt install ffmpeg

# 2. 安装基础 Python 依赖
pip install -r requirements.txt

# [可选] 若需使用本地大模型(GGUF)翻译并开启 CUDA 加速,请安装预编译的 llama-cpp-python
# (注:以下链接以 CUDA 12.2 为例。若为其他 CUDA 版本,请将 cu122 替换为对应版本号如 cu118、cu121 等)
pip install llama-cpp-python --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cu122

# 3. 启动后台服务与 WebUI
python app.py

使用指南

1. 访问 WebUI 工作台

  • 浏览器打开 http://127.0.0.1:8000http://[远程IP]:8000 进入工作台。
  • 访问 /docs 查看 Swagger API 接口文档。

2. 工作区与流水线

  • [任务工作区] 拖拽上传视频或音频文件,系统支持批量排队上传,音频文件将自动经过 FFmpeg 进行标准化 16kHz 单声道重采样。
  • 勾选任务并点击"执行全量工作流",后端会在后台自动串行执行提音、识别、翻译。

3. ASR 识别调优

  • 本地模式:对于含有大量环境噪音的视频,建议在「高级设置 -> 阈值过滤」中开启 VAD 智能静音过滤,减少模型的"幻觉"复读并提升推理速度。
  • 云端模式:长音频切片上传过程全自动完成,如果使用非官方的第三方代理接口,请注意调整大文件网络超时时间。

4. LLM 翻译设置

  • 填入 API Base URL 和 API Key。
  • 自定义 Prompt 强制大模型输出特定风格(例如语气、设定、特定角色人名映射等)。
  • 支持多套 API 方案预设,在 [语音识别][LLM 翻译] 标签页中管理。
  • 本地引擎:将 GGUF 量化模型放入 models/llm/ 目录后,在 LLM 翻译标签页切换至"本地离线引擎",选择模型文件并配置 GPU 加速层数、上下文长度与闲置释放时间。

配置说明

服务首次启动时自动从 config/config.example.json 生成 config/config.json。主要配置项:

配置域 说明
system_settings 全局网络代理开关、代理 URL(HTTP/SOCKS5)、GPU 显存互斥开关 (vram_mutual_exclusion)、最大上传文件限制 (max_upload_size_mb)
secrets Hugging Face 认证令牌 (hf_token),用于访问受限模型
model_settings Whisper 模型大小(tiny / base / small / medium / large-v2 / large-v3 / distil-*)与下载目录
transcribe_settings ASR 引擎选择 (local / api)、语言、Beam Size、VAD 静音过滤、温度采样、幻觉抑制阈值等高阶参数
vad_settings VAD 过滤开关与高级 VAD 参数
ffmpeg_settings 音轨选择 (audio_track)、时间范围裁剪 (start_time / end_time)
llm_settings LLM 引擎选择 (api / local)、API 多方案池(含并发数、批次大小、超时、System Prompt);local_settings 包含 GGUF 模型路径、GPU 加速层数、上下文长度与闲置释放时间;target_language 翻译目标语言
online_asr_settings 云端 ASR API 多方案池、说话人识别 (speaker_labels)、词级时间戳 (word_timestamps)
library 媒体库扫描路径、格式白名单(20+ 种)、自动扫描开关

所有配置均可通过 WebUI 在线修改并即时生效。


支持格式

识别/输入格式

类型 格式
视频 .mp4 .mkv .avi .mov .flv .wmv .webm .ts .m2ts .rmvb .vob .asf
音频 .mp3 .wav .m4a .flac .aac .ogg .wma .opus
字幕 .srt(拖拽或上传已有字幕直接进入翻译阶段)

Whisper 模型

规模 推荐场景
tiny / base 快速测试、低配设备
small / medium 均衡精度与速度
large-v2 / large-v3 最高精度(默认 large-v2
distil-* 蒸馏模型,推理更快、显存占用更低

API 端点参考

访问 /docs 可查看自动生成的 Swagger 交互式文档。

配置与系统

方法 端点 说明
GET /api/system/info 系统信息(GPU 检测)
GET /api/config 获取完整配置
POST /api/config 更新配置
POST /api/config/restore 恢复默认配置
POST /api/proxy/test 代理连通性测试
GET /api/languages 获取支持语言列表
GET /api/models 获取 Whisper 模型列表
DELETE /api/models/{model_id} 删除已下载模型
POST /api/models/{model_id}/download 下载指定模型
GET /api/models/download_status 模型下载进度
POST /api/llm/models 获取远程 LLM 模型列表
GET /api/llm/local_models 获取本地 GGUF 模型列表
POST /api/asr/models 获取云端 ASR 模型列表

任务与资产

方法 端点 说明
POST /api/upload/{asset_type} 上传资产(video / audio / srt
POST /api/task/execute 执行任务流水线
POST /api/task/{task_id}/retry 断点重试任务
GET /api/download/{task_id}?type= 下载产物(original / translated
GET /api/task/{task_id}/assets 获取单个任务资产信息
GET /api/tasks 获取所有任务列表
DELETE /api/task/{task_id} 删除任务及全部资产
DELETE /api/task/{task_id}/asset/{asset_type} 删除单个资产
POST /api/tasks/reorder 任务排序
POST /api/task/{task_id}/cancel 中断单个任务
POST /api/tasks/cancel_all 中断全部任务

媒体库

方法 端点 说明
GET /api/library/paths 获取扫描路径列表
POST /api/library/paths 添加扫描路径
DELETE /api/library/paths 删除扫描路径
POST /api/library/scan 触发媒体库扫描
GET /api/library/discoveries 获取已发现文件
POST /api/library/import 批量导入为任务

WebSocket 与状态

方法 端点 说明
WS /ws/progress/{task_id} 任务实时状态推送
GET /api/task/{task_id}/status HTTP 轮询任务状态
GET /api/pipeline/status 全局流水线状态

项目结构

├── api/                    # FastAPI 后端
│   ├── routers/            # Web API 路由 (config, tasks, library, websocket)
│   ├── services/           # 业务逻辑层 (配置、调度、工作区、媒体库)
│   ├── workers/            # 异步队列消费者 (提音、识别、翻译)
│   ├── state.py            # 全局状态管理
│   └── ws_manager.py       # WebSocket 连接管理器
├── core/                   # 底层算法库 (FFmpeg、Whisper、API转录、翻译、SRT格式化、本地LLM)
│   └── local_llm_manager.py # 本地 LLM 推理管理器 (GGUF / llama-cpp-python)
├── frontend/               # Vue 3 前端 (CDN 模式,免构建)
│   └── js/components/      # UI 组件 (工作区、ASR、翻译、控制台、设置)
├── config/                 # 配置文件 (自动生成 config.json)
├── .github/workflows/      # CI/CD (Docker 发布)
├── models/                 # Faster-Whisper 离线模型 & 本地 LLM 存储
│   └── llm/                # GGUF 量化模型存放目录
├── workspace/              # 音视频及字幕任务产物
├── app.py                  # WebUI & API 后端启动入口
├── requirements.txt        # 生产依赖
├── docker-compose.yml      # Docker Compose 编排
├── Dockerfile              # CPU Docker 镜像
└── Dockerfile.gpu          # GPU (CUDA) Docker 镜像

系统要求

维度 要求
操作系统 Windows 10+ / Linux
Docker 支持 linux/amd64 (GPU 版需具备 NVIDIA Runtime)
Python 3.9 - 3.13(推荐 3.12.x)
硬件(推荐) 至少 8GB 内存;使用本地 GPU 引擎推荐至少 6GB+ 显存的 NVIDIA 显卡

Docker 权限说明:如果在 NAS (如群晖、Unraid 等) 上部署遇到读写权限的问题,增加环境变量 -e PUID=1000-e PGID=1000 (替换为实际的 UID/GID),容器将会自动对齐挂载目录的读写权限。

路线图

  • API 自动轮询与故障自愈:在遇到可恢复错误(如 HTTP 429/401)时,自动切换方案池中的下一个可用方案。
  • 任务插队与优先级调度:后端队列支持紧急任务优先处理。
  • 全局队列进度透明化:流水线看板显示具体进度百分比与子状态(如"正在提音 45%")。
  • 翻译断点续传与语义缓存:引入基于原文 MD5 缓存机制,翻译中断后跳过已完成段落,避免重复消耗 API 额度。
  • SRT 格式对齐算法优化:增强翻译后 SRT 组装逻辑,应对 LLM 输出行数不一致的情况。

完整规划与已完成的特性请见 文档站 - 更新日志


免责声明

  1. 合法使用:本项目仅供技术研究、个人视频剪辑与字幕制作辅助使用。
  2. 接口规范:请用户自行准备合规的 LLM API 及云端识别 API,确保使用不违反当地法律法规及服务商的使用条款。
  3. 开源许可:本项目基于 MIT 协议开源,完全免费,由第三方模型引起的任何输出内容问题概不负责。

About

本地 AI 字幕工作站。集成 faster-whisper 语音识别与 LLM 智能翻译,提供一站式 WebUI 自动化工作流,支持 GPU 加速。

Topics

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors