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

@@ -51,12 +51,36 @@ class Base(DeclarativeBase):
def init_db_schema() -> None:
"""建表(幂等)。"""
"""建表(幂等)+ 旧库迁移(给 task 表补新字段)
SQLAlchemy 的 create_all 只建新表不改旧表。对已存在的 task 表,
需手动 ALTER TABLE ADD COLUMN 补 wav_path / segments_jsonnullable
"""
from .models.task import Task # noqa: F401
from .models.upload_session import UploadSession # noqa: F401
get_engine()
Base.metadata.create_all(get_engine())
engine = get_engine()
Base.metadata.create_all(engine)
_migrate_task_columns(engine)
def _migrate_task_columns(engine) -> None:
"""检测 task 表缺失的列并 ALTER TABLE 补上nullable向后兼容"""
from sqlalchemy import inspect, text
insp = inspect(engine)
if "task" not in insp.get_table_names():
return # 新库create_all 已建好完整表
existing = {c["name"] for c in insp.get_columns("task")}
# 新增字段:(列名, 列定义)
additions = [
("wav_path", "VARCHAR(1024)"),
("segments_json", "TEXT"),
]
with engine.begin() as conn:
for col, coltype in additions:
if col not in existing:
conn.execute(text(f"ALTER TABLE task ADD COLUMN {col} {coltype}"))
def get_db() -> Generator[Session, None, None]: