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:
@@ -51,12 +51,36 @@ class Base(DeclarativeBase):
|
||||
|
||||
|
||||
def init_db_schema() -> None:
|
||||
"""建表(幂等)。"""
|
||||
"""建表(幂等)+ 旧库迁移(给 task 表补新字段)。
|
||||
|
||||
SQLAlchemy 的 create_all 只建新表不改旧表。对已存在的 task 表,
|
||||
需手动 ALTER TABLE ADD COLUMN 补 wav_path / segments_json(nullable)。
|
||||
"""
|
||||
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]:
|
||||
|
||||
Reference in New Issue
Block a user