feat: 调度器+并发管线+GPU优化+日志分级+前端修复

- scheduler: ffmpeg 异步线程 + GPU 串行调度 + 模型复用(2N→2 次加载)
- pipeline: 阶段拆分(extract/asr/translate),中间数据存 Task 字段
- translate_service: 长度排序批处理,padding 浪费减少 91%
- model_manager: ASR/翻译不共驻,BatchedInferencePipeline 批量解码
- 日志分级: INFO=任务流转里程碑,DEBUG=进度详情;默认 INFO
- 前端: 日志最新在上+滚动感知+退避轮询;24h 时间;上传中状态显示
- /health: 返回完整 Whisper/NLLB 配置
- upload_service: 单事务 complete + 扩展名白名单
- task_router: 合并 UploadSession 虚拟任务到列表
- Dockerfile: CPU/GPU 独立构建链,deps 缓存稳定
- prefetch_models: 安装时预下载模型权重
This commit is contained in:
audio2text dev
2026-07-06 21:59:59 +08:00
parent 00e2a95fb7
commit 73110848f4
30 changed files with 1238 additions and 259 deletions

View File

@@ -1,5 +1,9 @@
# audio2text 运行时配置。复制为 config.yaml 后填值。所有路径相对容器内 /app
# CPU dev / GPU prod 仅靠 device + model + compute_type 三项切换,代码不变
# audio2text 运行时配置模板
# 复制为 config.yaml 后填值。所有路径相对容器内 /app
#
# CPU dev / GPU prod 仅靠 asr + translation 两段的 device/model/compute_type/batch_size 切换。
# 下方注释标注了 CPU开发与 GPU生产的推荐值对照。
# 完整对照CPU 用 ./setup.sh默认GPU 用 AUDIO2TEXT_VARIANT=gpu ./setup.sh。
server:
host: 0.0.0.0 # 容器内对外监听(由 docker -p 映射到宿主)
@@ -10,9 +14,9 @@ storage:
upload_dir: /data/uploads # 上传视频落盘根目录
work_dir: /data/.work # 分片会话暂存 + 中间音频
output_dir: /data/outputs # 生成的 SRT 字幕输出
chunk_bytes: 1048576 # 1 MiB 流式分片
chunk_bytes: 1048576 # 1 MiB 服务端流式读缓冲(前端分片大小由前端定)
chunk_session_ttl_seconds: 300 # 被放弃会话的存活秒数(后台 reaper 据此清理)
cache_retention_days: 7 # 任务产物保留天数,超期清理(字幕/中间音频/保留的原始视频+DB记录
cache_retention_days: 7 # 任务产物保留天数,超期清理(0=禁用
cache_cleanup_interval_hours: 24 # 定时清理间隔(启动时跑一次,之后循环)
processing:
@@ -20,36 +24,40 @@ processing:
keep_audio: false # 完成后是否保留中间 wav默认删只留字幕
asr:
# CPU devtiny.en + int8Whisper 同系列最小,英文专用)
# GPU prodlarge-v3-turbo + float163090 上几 GB 视频几分钟出字幕
model: tiny.en
device: cpu # cpu | cuda
compute_type: int8 # cpu: int8gpu: float16
language: en # 仅英语
word_timestamps: true # 词级时间戳:让断句精确而非纯匀速估算
vad_filter: true # 过滤静音段,提升质量与速度
# CPU devtiny.en + int8Whisper 同系列最小,英文专用~39M
# GPU prodlarge-v3-turbo + float168x 速度,质量接近 large-v3~3GB 显存)
model: tiny.en # CPU: tiny.en | GPU: large-v3-turbo
device: cpu # cpu | cuda
compute_type: int8 # CPU: int8 | GPU: float16
language: en # 仅英语
word_timestamps: true # 词级时间戳:让断句精确而非纯匀速估算
vad_filter: true # 过滤静音段,提升质量与速度
batch_size: 8 # CPU: 8 | GPU: 16BatchedInferencePipeline 批量解码音频块)
translation:
model: facebook/nllb-200-distilled-1.3B
device: cpu # cpu | cuda
src_lang: eng_Latn # NLLB 语言码:英语
tgt_lang: zho_Hans # NLLB 语言码:简体中文
batch_size: 16 # 不与 ASR 共驻:翻译时显存独占,可用大 batch
max_length: 256 # 单条翻译最大 token
# CPU devHelsinki-NLP/opus-mt-en-zh~300MB2GB 内存可跑)
# GPU prodfacebook/nllb-200-distilled-1.3B(质量最好,~2.5GB 显存)
# 注意model 与 device 必须配套——GPU 模型配 CPU device 会 OOM反之浪费硬件。
model: Helsinki-NLP/opus-mt-en-zh # CPU: opus-mt-en-zh | GPU: facebook/nllb-200-distilled-1.3B
device: cpu # cpu | cuda
src_lang: eng_Latn # NLLB 语言码:英语
tgt_lang: zho_Hans # NLLB 语言码:简体中文
batch_size: 8 # CPU: 8 | GPU: 32(不共驻时显存独占可用大 batch
max_length: 256 # 单条翻译最大 token
sort_by_length: true # 按长度排序后分批,减少 padding 浪费GPU 收益大)
segmentation:
max_words_per_line: 14 # 单行最多词数,超出按逗号拆
max_duration_seconds: 7.0 # 单条字幕最长 7 秒
min_duration_seconds: 1.0 # 单条字幕最短 1 秒(太短则合并)
max_chars_per_line: 42 # SRT 规范:每行 ≤42 字符
max_words_per_line: 14 # 单行最多词数,超出按逗号拆
max_duration_seconds: 7.0 # 单条字幕最长 7 秒
min_duration_seconds: 1.0 # 单条字幕最短 1 秒(太短则合并)
max_chars_per_line: 42 # SRT 规范:每行 ≤42 字符
logging:
level: info # debug | info | warning | error控制台 + 内存缓冲最低级别)
buffer_size: 2000 # /logs 页面内存缓冲条数
level: info # debug | info | warning | error控制台最低级别
buffer_size: 2000 # /logs 页面内存缓冲条数
docs:
enabled: true
username: admin
password: "CHANGE_ME" # /docs Basic Auth明文root 持有,常量时间比较)
password: "CHANGE_ME" # 部署前务必修改;留空则禁用 /docs
realm: "audio2text docs"