CHANGELOG — 0.1.12 系列
约 4996 字大约 17 分钟
此文件已从主 CHANGELOG.md 归档。原始版本详见 Git 历史。
V0.1.12.9 Alpha (2026-07-06)
P0: 删除迁移框架 + 新 Schema 系统 + Worker 租约贯穿 + Web 安全 + 敏感信息脱敏
本质目标: Alpha 阶段停止维护虚构的历史版本迁移代码。采用"当前 Schema 创建、严格校验、不兼容即拒绝启动"策略。加固 Worker 租约验证,所有结果提交路径受租约保护。Web 非本地监听强制认证。
Schema 系统重构 (P0)
- 删除
run_migrations(),_MIGRATIONS列表,MigrationHistory模型,SchemaVersion模型 - 删除
_migrate_add_columns()(20+ ALTER TABLE),_migrate_old_mode_to_switches(),_migrate_v1_old_data(),_migrate_v2_pipeline_keys() - 删除 迁移前备份逻辑, SQL 注释解析 (
_remove_sql_line_comments,_split_sql_statements), 旧数据修复代码 - 新增
app/db/schema.py: 轻量 Schema 元信息表schema_meta, SHA-256 Schema 指纹,create_schema(),validate_schema(),assure_schema() - 新增
CURRENT_SCHEMA_VERSION = 1(重置, 非迁移版本号) - 新数据库流程: 按 SQLModel 完整创建 → 写入 schema_meta → 校验指纹与版本 → 启动
- 不兼容数据库: 拒绝启动, 输出清晰错误信息要求手动重建
app/db/migrate.py精简为reset_db()CLI 命令, 支持安全确认与自动备份- CLI:
bililivecut db-reset命令
Worker 租约强化 (P0)
_still_has_lease(): 新增expected_stage参数, 同时校验 claimed_by + lease_token + stage == expected_stage_run_transcribe(),_run_analyze(),_run_render(),_run_publish(): 成功结果提交前校验租约- 失去租约时丢弃结果 (
stale_result_discarded), 不写数据库 - 心跳 SQL: 增加
AND stage = :expected_stage条件更新 _clear_heartbeat_if_own(): 已使用租约条件清理
Web 安全 (P0)
- 非 loopback 监听 (0.0.0.0 / :: / 其他) 且 ADMIN_PASSWORD 为空时拒绝启动
- 认证比较使用
secrets.compare_digest防止时序攻击
敏感信息脱敏 (P0)
- 新增
app/core/sanitize.py: 统一脱敏器, 识别 Cookie/SESSDATA/API Key/Authorization/Password/Token - 应用于日志、异常、API 响应中的敏感字段
P1: 运行稳定性
FFmpeg 错误分类 (P1)
- 新增
app/core/ffmpeg_errors.py: 结构化异常类型 (TRANSIENT_NETWORK/UPSTREAM_UNAVAILABLE/DISK_FULL/PERMISSION_DENIED/INVALID_ARGUMENT/MISSING_BINARY/UNSUPPORTED_CODEC/CORRUPTED_INPUT/CANCELLED/UNKNOWN) is_retryable(): 瞬时网络/上游不可用 指数退避重试; 磁盘满/权限/参数错误/编码器 永久失败app/clipping/clipper.py:_run_ffmpeg_clip/_render_single_variant/probe_media/_render_text_card/_grab_cover均接入错误分类app/pipeline/task_worker.py:_run_render错误路径使用is_retryable决策重试
Bilibili 风控熔断 (P1)
app/sources/bilibili/client.py: 新增BilibiliRateLimitError/HttpErrorType, HTTP 403/412/Cookie 失效/业务错误码分类- 新增
CircuitBreaker类: 故障计数 + 指数退避backoff_until - 新增
_ROOM_BREAKERS房间级熔断: 403/412 触发后停止高频请求直到冷却期结束 - 解析
Retry-After响应头
全局资源预算 (P1)
- 新增
app/core/resource_budget.py:ResourceBudget类, CPU/GPU/内存/显存四维资源池 - 任务成本估算: ASR(cpu=1/1500MB)、渲染(cpu=1/500MB)、上传(cpu=0/100MB)
acquire()/release(): 资源不足时拒绝, 防止 OOM
两级磁盘保护 (P1)
app/pipeline/storage_lifecycle.py: 新增LOW_DISK_THRESHOLD_GB(20GB)/CRITICAL_DISK_THRESHOLD_GB(5GB)check_disk_level(): 返回 ok/low/critical 三级is_safe_for_new_tasks(): 低磁盘暂停新任务should_stop_recording(): 危险磁盘安全停止录制
SQLite 优化 (P1)
- 新增
app/db/optimize.py:record_lock_wait()/record_transaction_duration()锁等待与事务耗时监控 with_retry_on_lock(): 数据库锁指数退避重试 (max 3 次)monitored_transaction(): 带监控的事务上下文管理器
统一参数校验 (P1)
app/core/config.py: 新增@model_validator(mode="after")跨字段校验- 校验:
upload_max_retries ≥ 0,upload_max_per_hour ≥ 1,disk_alert_threshold_gb ≤ min_free_disk_gb biliup_upload_cmd包含{file}占位符检查- 房间号格式/URL/时间范围/分数范围/并发数上下限校验
登录失败限流 (P1)
app/web/main.py: 新增_LOGIN_FAILURESIP 级追踪, 5 次/5 分钟窗口- 超限返回 HTTP 429 + "登录尝试过于频繁"
P2: 工程收口
CI 增强
pyproject.toml: 新增pip-audit+pytest-cov依赖- 新增
[tool.coverage]配置, 初始门槛 50%
ASR 资源检测
- 新增
app/core/asr_detection.py:detect_resources()检测 GPU 显存 + 系统内存 recommend_preset(): 自动推荐 high/medium/low/minimal 模型预设check_resources_sufficient(): 加载前资源预检
弹幕分级采样
- 新增
app/analysis/danmaku_sampling.py:DanmakuSampler按类型分级 (SC/互动 100%, 普通 30%, 高密度降至 10%) get_sampler(): 房间级采样器隔离
运行指标与监控
- 新增
app/core/metrics.py: 任务计数/Worker 状态/录制时长/ASR/渲染/上传平均耗时/磁盘使用 - 新增
app/web/routers/api.py:GET /api/metrics实时指标端点 + 历史趋势 (60 点)
新增测试
tests/test_v0129_p1p2.py: 29 项测试 (FFmpeg 错误/弹幕采样/脱敏/磁盘保护/Settings repr 防泄露)- 全量: 290 passed (原 261 + 新增 29)
本质目标: 修复 9 项 P0 问题, 消除审批事务割裂、双写不一致、路径遍历漏洞、密钥日志泄漏、ORM Detached 崩溃。
Fix 1-2: 事务边界割裂 + submit_review 双写
approve_event_and_task()接受可选db: Session | None参数 (V0.1.12.8)- 调用方传入外层 session 后所有更新在同一事务中提交, 消除双写风险
_advance_candidate()/_advance_awaiting_review()/submit_review()/approve_candidate()均传入db=dbsubmit_review()正向决断不再单独写 Event/Candidate, 统一走approve_event_and_task
Fix 3: get_review_data NameError
ctx_start/ctx_end/margin移入else分支前已定义danmaku_window字典start is None or end is None时danmaku_window设为{start: None, end: None, margin: 30}
Fix 4: _safe_unlink TOCTOU
Path(disk_path).unlink()→resolved.unlink(), 使用已解析的绝对路径删除- 防止验证-删除窗口内的符号链接替换攻击
Fix 5: Settings 密钥 repr 泄漏
admin_password,bilibili_cookie,llm_api_key,anthropic_api_key,trend_api_key,dingtalk_secret,smtp_password均添加repr=False- 防止
print(settings)或日志中泄露密钥明文
Fix 6: ClipVariant 模型/迁移约束不一致
- 添加 Migration V3: 删除旧 2 列索引, 创建 3 列索引
(event_id, variant_type, render_config_hash) _verify_critical_indexes()更新为检查 3 列索引名variant_config
Fix 7: Transcript 缺少唯一约束
- 添加唯一索引
idx_transcripts_pipeline_key到 Migration V3 _verify_critical_indexes()增加 Transcript.pipeline_key 检查
Fix 8: render_status 裸字符串
- 添加
RenderStatus类 (QUEUED/RENDERING/DONE/FAILED) ClipVariant.render_status默认值改用RenderStatus.QUEUEDclipper.py/collection.py所有裸字符串替换为枚举值
Fix 9: highlight.py Detached ORM
room.auto_approve/room.auto_approve_threshold/room.review_threshold/use_dm_sentiment提取到局部变量- 避免
with get_session() as db:退出后访问 ORM 导致DetachedInstanceError
V0.1.12.7 Alpha (2026-07-02)
稳定性修复与数据一致性收口: 统一审批事务 / UploadTask 结果映射 / ManualUploader 状态 / Worker 租约贯穿 / 迁移修复 / 模型约束
本质目标: 修复 14 项核心问题, 确保 Task 状态与业务对象状态一致, 失败不被伪装为成功, 租约校验贯穿任务生命周期, 迁移安全可靠。
Phase 1: 审批和发布状态
- 统一审批服务 (
app/pipeline/approval.py):approve_event_and_task()在同一事务中更新 Task.stage + Event.review_status + Candidate.status _advance_candidate/_advance_awaiting_review: 不再只更新 Task.stage, 改用统一审批服务_run_publish: 根据 UploadTask 真实状态映射主流水线 (SUCCESS→completed, FAILED→transient_failed, SKIPPED→awaiting_publish_confirmation)- ManualUploader: 不再标记 FinalClip 为 PUBLISHED, 区分"已导出"与"已发布"
_finish_task: 非 manual 上传器成功才标记 PUBLISHED- 发布前 Event 批准校验:
_advance_approved进入渲染队列前检查 Event 真实 review_status
Phase 2: Worker 租约贯穿
_execute_task: 传递 lease_token 到所有执行函数- 条件 heartbeat:
_start_heartbeat_thread使用WHERE id=? AND claimed_by=? AND lease_token=?条件 SQL - 条件 finally:
_clear_heartbeat_if_own()只在租约匹配时清除 heartbeat _still_has_lease(): 统一租约校验函数
Phase 3: 迁移执行器修复
- SQL 注释解析修复:
_remove_sql_line_comments()+_split_sql_statements(), 防止注释导致语句被跳过 - Candidate/Event ID 碰撞修复:
_migrate_v1_old_data先判是否为真实 Event ID 再决定是否转换 - 迁移失败阻止启动:
init_db()检查run_migrations()返回值,RuntimeError中止启动 - 列迁移异常区分:
_migrate_add_columns区分"列已存在"与真正的数据库错误 - 迁移后 Schema 校验:
check_schema()包含_verify_critical_indexes()PRAGMA 校验
Phase 4: 模型约束与幂等
- HighlightEvent:
UniqueConstraint("candidate_id") - HighlightTopic:
UniqueConstraint("event_id", "topic_id") - UploadTask:
UniqueConstraint("clip_id", "uploader") - ClipVariant:
UniqueConstraint("event_id", "variant_type", "render_config_hash")支持多渲染版本 - ReviewStatus.APPROVED: 添加向后兼容别名
Phase 5: 安全与一致性收口
- 版本真源统一:
version_label()动态生成,__version_label__与__version__一致 - Dockerfile: 修正哈希锁定相关注释, 反映实际行为
V0.1.12.6 Alpha (2026-07-02)
安全加固: Dockerfile 非 root / pip 哈希校验 / 路径穿越防御 / TOCTOU / SMTP 证书 / 迁移原子性
本质目标: 修复代码审计发现的 7 个安全与稳定问题 (5 HIGH + 2 MEDIUM)。
修复内容
- Dockerfile: 容器改用非 root
appuser运行, pip install 去掉-e生产模式安装 - build_bundle.py: zip 解压增加绝对路径 + 路径遍历 (
..) 双重过滤, 防御 ZipSlip - storage_lifecycle.py: rmtree 增加
os.lstat+S_ISLNKTOCTOU 防御, 并校验realpath在预期目录内 - webhook.py: SMTP_SSL 连接加入
ssl.create_default_context()证书验证 - webhook.py (已修复): 钉钉 URL query 拼接使用
urlparse+parse_qs, 避免双?问题 - migrate.py: SQL DDL + Python 数据迁移合并到同一事务中执行, 失败时整体回滚, 避免半升级状态
V0.1.12.5 Alpha (2026-07-06)
稳定性修复: 状态机重构 / 发布 Worker / 流水线幂等 / 数据一致性 / Worker 租约 / C 扩展
本质目标: 修正审核→渲染→发布的流水线顺序, 建立独立 Publish Worker, 强化数据库约束与幂等, 修复 C 扩展空白处理和异常规范。
Phase 1: 状态机重构 (P0)
- 修正流水线顺序: CANDIDATE_CREATED → AWAITING_REVIEW/APPROVED → APPROVED_WAITING_RENDER/QUEUED_FOR_RENDER → RENDERING → RENDERED → AWAITING_PUBLISH_CONFIRMATION/QUEUED_FOR_PUBLISH → PUBLISHING → COMPLETED
- 新增 TaskStatus:
APPROVED_WAITING_RENDER,RENDERED,AWAITING_PUBLISH_CONFIRMATION,PUBLISHING _run_render: 固定auto_upload=False, 完成后保存clip_id并进入 RENDERED- 新增
_run_publish: 独立发布执行器, 验证 Event 批准、ClipVariant 存在、文件完整后执行上传, 失败记录failed_stage=publishing - 新增
_advance_rendered: RENDERED → auto_upload 决定 QUEUED_FOR_PUBLISH 或 AWAITING_PUBLISH_CONFIRMATION _advance_candidate: 改为审核优先 (auto_approve + 阈值 → APPROVED, 否则 AWAITING_REVIEW)_advance_approved: 改为渲染决策 (auto_render → QUEUED_FOR_RENDER, 否则 APPROVED_WAITING_RENDER)_loop: 新增_advance_rendered+_dispatch(QUEUED_FOR_PUBLISH)+_publishing并发池- 废弃旧路径:
RENDERING → AWAITING_REVIEW,APPROVED → COMPLETED直接跳转
Phase 2: 流水线幂等
- 新增
pipeline_key: 流程级幂等键 (pipeline:{segment_id}), 创建后永不修改, UNIQUE 约束 - 新增
stage_key: 阶段级幂等键 (stage:{segment_id}:{stage}), 阶段推进时更新 create_task: 先查pipeline_key实现迟到回调幂等, 后向兼容旧idempotency_keySegmentTask.segment_id新增 UNIQUE 约束: 一个 segment 一个流水线任务
Phase 3: Event 数据一致性 + 数据库约束
- 删除
_resolve_event_id危险回退:return candidate_id→raise ValueError - ForeignKey 声明:
HighlightEvent.candidate_id → HighlightCandidate.id,ClipVariant.event_id → HighlightEvent.id,HighlightTopic.event_id → HighlightEvent.id,HighlightTopic.topic_id → Topic.id - ClipVariant 新增
render_config_hash字段, 用于渲染版本唯一性 - 迁移 v2:
ClipVariantUNIQUE(event_id, variant_type) /HighlightTopicUNIQUE(event_id, topic_id) /UploadTaskUNIQUE(clip_id, uploader) /SegmentTaskpipeline_key 数据填充
Phase 4: Worker 租约与优雅关闭
lease_token: 原子领取时生成 UUID, stale 恢复时清除enqueue_next清除lease_token- 优雅关闭超时从硬编码改为
WORKER_SHUTDOWN_TIMEOUT_SECONDS(默认30s) /SUBPROCESS_TERMINATE_TIMEOUT_SECONDS(默认10s)
Phase 5: C 扩展修复
- C/Python bigram 空白一致性: C 版本改为跳过空白后仅拼接字符 (不含空格), 与 Python 回退行为一致
- 异常处理: 6 处
PyList_Append/ 5 处PyList_New返回值检查, 补充error_cleanup标签 - UTF-8 校验: bytes 输入先验证合法 UTF-8, 非法返回
UnicodeDecodeError
测试
- 状态机测试更新: 83 个状态转换 + 非法转换全覆盖
- pipeline_key/segment_id 唯一约束测试
- 旧测试适配新状态流后全部通过
V0.1.12.4b Alpha (2026-07-06)
CI 修复: 代码质量清理 + C 扩展正确性修复
本质目标: 修复 v0.1.12.4 发布后 CI 流水线上发现的 165 个 ruff 违规和 C 扩展崩溃问题。
Ruff 代码质量清理
- 修复 bug 级违规:
F821未定义名称,invalid-syntaxPython 3.11 f-string 反斜杠 - 修复正确性违规:
B007未使用循环变量,E741模糊变量名,E701一行多语句,F841未使用局部变量,B904异常未链式抛出 - 修复风格违规:
D101/D102/D103缺失 docstring,D205docstring 空行,E402延迟导入,B008默认参数函数调用,E501超长行 pyproject.tomlline-length从 100 增加到 120,tests/*额外忽略D102、E501- 全量: 165 个违规全部清零
C 扩展修复
fast_char_bigramsUTF-8 字符边界 bug: 原代码q = p + 1对 CJK 字符指向 continuation byte 而非下一个字符开头, 产生无效 UTF-8 序列导致UnicodeDecodeError+SystemError- MSVC 编译乱码:
setup.py添加/utf-8标志, 消除 C4819 源代码编码警告
测试
- 全量: 236/236 通过 (本地 Python 回退 + CI C 扩展模式均通过)
V0.1.12.4 Alpha (2026-07-06)
稳定性修复: 流水线 / 自动化开关 / 原子领取 / Worker 生命周期 / 幂等 / ASR 追踪
本质目标: 把现有代码修成真实可运行、可恢复、可验证的闭环。
CI 修复
ci.ymlconcurrency 从无效matrix上下文改为github.workflow+github.ref
原子任务领取
_pop_and_claim裸 SQL 改为sa_text()包裹 (SQLAlchemy 2.x 规范)params改为关键字参数, 避免TypeError: exec() takes 2 positional argumentsattempts只在 SQL UPDATE 中 increment 一次, 杜绝 double-increment
五个自动化开关全部接入状态机
- 新增
_advance_awaiting_review(): 检查auto_approve+auto_approve_threshold - 新增
_advance_approved(): 检查auto_upload, 自动发布时内联执行上传 _run_render不再 hardcodeauto_upload=False, 改为从房间配置读取auto_analyze/auto_render/auto_approve/auto_upload全部生效
发布队列
- approved 后根据
auto_upload决定是否执行上传 auto_upload=true→ 内联执行enqueue_and_upload→ completedauto_upload=false→ 直接 completed
Worker 生命周期
- 新增
track_subprocess()/untrack_subprocess()/_cleanup_subprocesses() TaskWorker.stop()后统一 SIGTERM → SIGKILL 清理孤儿子进程
幂等与唯一约束
SegmentTask.idempotency_key改为 UNIQUE 约束Transcript增加__table_args__声明幂等意图- 重复回调不会创建两个任务 (数据库级保证)
ASR fallback 追踪
ASRTranscriptResult新增:primary_status,primary_error_type,primary_error_message,fallback_backend,fallback_trigger_reason- Paraformer 空输出 → Whisper 兜底时保留完整链路信息
_persist_transcript正确写入fallback_backend
final_text_source 优先级修正
- manual_review_needed > review > fallback > primary
manual_review_needed先于review检查, 不再被review覆盖
测试质量
test_stability_fixes.py全部改为真实 SQLite 行为测试, 移除inspect.getsource()式检查- 23 项行为测试: 原子领取 (单Worker/双Worker并发), 自动化开关 × 6, 心跳/stale, 唯一约束, 重试恢复, ASR fallback
- 全量: 236/236 通过
V0.1.12.3 Alpha (2026-07-06)
接线补全 + 分设备配置生效
本次迭代定位: 将 V0.1.12.2 中已定义但未传导到运行时的配置与指标真正接通。
分设备配置接线 (Phase 4 补全)
FunASRBackend._load_primary()→settings.asr_primary_device(原走whisper_device)FunASRBackend._load_sensevoice()→settings.asr_auxiliary_deviceFunASRBackend._load_funasr()→settings.asr_review_deviceFasterWhisperBackend.__init__()→settings.asr_fallback_device兜底- 所有设备配置均保持
or whisper_device二级兜底
ASR 可观测性指标接线 (Phase 4 补全)
transcribe.py引入from app.analysis import asr_metricsFunASRBackend.transcribe()→record_backend_call("paraformer", ...)+record_rtf()FunASRBackend.transcribe_segment()→record_backend_call("funasr-nano", ...)FasterWhisperBackend.transcribe()→record_backend_call("whisper", ...)+record_fallback()+record_rtf()ASRPipeline._review_loop()→record_review()/record_review_success()/record_review_failure()/asr-metrics和/asr-modelsAPI 现在返回实时数据
Phase 3 接线验证通过
_review_loop→_merge_review_text→final_text链路已验证完整- Hotwords
initial_prompt→Paraformer generate(hotword=...)链路已验证完整 final_text→Transcript持久化链路已验证完整
V0.1.12.2 Alpha (2026-07-06)
稳定性修复迭代 (2026-07-06) — P0 修复
本次迭代聚焦修复数据一致性、任务流水线和渲染失败等 P0 问题。不新增任何 Feature。
渲染失败误报成功 (CRITICAL FIX)
_run_render()严格校验:produce_clip()返回 None、文件不存在、文件过小(<1KB)、片长过短(<1s) 全部标记为失败- 无效 Clip 不再进入
AWAITING_REVIEW - 失败任务写入
failed_stage并进入重试队列
原子任务领取 (CRITICAL FIX)
- 改用
UPDATE ... WHERE id=? AND stage=?条件更新 +rowcount校验 - SQLite 下双 Worker 并发争抢保证只有一个成功
- 日志记录 task_id / worker_id / 领取结果
自动化开关独立生效
auto_analyze=false→ 不进入转写队列和分析队列auto_render=false→ 不进入渲染队列auto_approve/auto_upload在阶段转换时重新读取房间配置- 新增
_room_cfg_from_task()统一读取房间开关 - 旧
mode字段不再成为新流程判断依据
Worker 心跳 + 优雅关闭
- 新增
_start_heartbeat_thread()— 长任务期间周期性更新heartbeat_at _execute_task()finally 中自动清理心跳TaskWorker.stop()显式设置_shutting_down标志- 停止时等待进行中任务完成 (最多30s), 超时后取消
_dispatch()检查_shutting_down标志停止领取新任务
版本化数据库迁移
- 新增
schema_version/migration_history表 - 新增
app/db/migrate.py版本化迁移系统 - 迁移前自动备份数据库 (
.bak) - 迁移失败时中止, 不允许半升级
- V1 迁移: 修复旧数据中 Candidate ID 被错误写入 Event ID 的情况
唯一约束
HighlightEvent.candidate_idUNIQUEClipVariant.candidate_id标记为 deprecatedasr_model_revision默认值改为v2.0.4
测试
- 新增
tests/test_stability_fixes.py(16 个测试): 渲染失败/原子领取/自动化开关/心跳/优雅关闭/数据迁移/状态机/唯一约束
多模型 ASR 链路的正确性、稳定性、评测与资源治理 (2026-07-06)
本次迭代是对 V0.1.12 多引擎 ASR 流水线的深度重构, 修复了复核不触发、SenseVoice 无产出、热词未传入等关键问题。
统一 ASR 结果模型 (Phase 1)
- 新增
ASRSegmentResult/ASRTranscriptResult统一结果结构, 消除后端置信度歧义 - Paraformer confidence (0-1) 映射
normalized_confidence, Whisperavg_logprob映射raw_confidence - 不再给无置信度字段伪造 0.0 (改为
None) - 保留
TranscriptionResult向后兼容 (自动从统一结果转换) Transcript新增 14 个追踪字段:base_text/final_text/primary_backend/primary_model_id/primary_model_revision/review_backend/fallback_backend/review_triggered/review_risk_score/review_reasons/final_text_source/inference_duration
复核闭环修复 (Phase 2)
- 重写
_review_low_confidence→_review_loop(基于review_risk_score) - 新增
_compute_review_risk_score: 综合 6 项信号 (置信度/空文本/时长比/重复/乱码/热词冲突) 决策复核 - 新增
_extract_audio_segment: FFmpeg 局部截取 (带上下文1.5s), 不再 fallback 全文识别 - 新增
_merge_review_text: base/review/final 合并策略 (编辑距离/热词命中/人工标记) - 防火墙上线: 窗口不越界/临时文件专用 UUID + 清理/finally 清理
热词与 SenseVoice 修复 (Phase 3)
- Paraformer 热词参数传入:
generate(hotword=...)并在不支持时降级 - SenseVoice 时间范围解析: 按文本分段估算合理时间, 不再全置 0.0
- 新增
_audio_events_score: 笑声/掌声/惊讶/情绪密度评分 - 高光评分新增
audio_events维度 (权重 0.10) - 新增
ASR_SENSEVOICE_ENABLED独立开关 (模型加载 vs 使用分离) - 新配置
ASR_REVIEW_RISK_THRESHOLD(默认 0.65)
依赖拆分与模型治理 (Phase 4)
pyproject.toml拆分:asr-whisper/asr-funasr/asr-all(向后兼容asr→asr-all)- 分设备配置: 8 个环境变量 (
ASR_PRIMARY_DEVICE/ASR_AUXILIARY_DEVICE/ASR_REVIEW_DEVICE/ASR_FALLBACK_DEVICE+ 4 个并发 + 4 个 keep_loaded) - 生命周期配置:
ASR_MODEL_IDLE_UNLOAD_SECONDS/ASR_PRELOAD_ON_START - 新增
ASRModelManager(并发加载锁/状态查询/空闲卸载/预热)
可观测性 (Phase 5)
- 新增
ASRMetrics: 后端调用统计、RTF、复核率、fallback 率、OOM 计数 - 运维 API:
GET /api/monitor/asr-metrics/GET /api/monitor/asr-models
Golden Set 评测与测试 (Phase 6)
- 新增
tests/golden_set/Golden Set 评测体系 (manifest 规范 + CER/RTF/时间戳误差) - 新增 34 个 ASR 单元测试 (
test_asr_result.py/test_asr_review.py/test_asr_integration.py) - DDL 自动迁移 (12 个
transcripts新增列)
新增环境变量
ASR_REVIEW_RISK_THRESHOLD=0.65
ASR_SENSEVOICE_ENABLED=true
ASR_PRIMARY_DEVICE=cpu
ASR_AUXILIARY_DEVICE=cpu
ASR_REVIEW_DEVICE=cpu
ASR_FALLBACK_DEVICE=cpu
ASR_PRIMARY_MAX_CONCURRENCY=1
ASR_AUXILIARY_MAX_CONCURRENCY=1
ASR_REVIEW_MAX_CONCURRENCY=1
ASR_FALLBACK_MAX_CONCURRENCY=1
ASR_PRIMARY_KEEP_LOADED=true
ASR_AUXILIARY_KEEP_LOADED=false
ASR_REVIEW_KEEP_LOADED=false
ASR_FALLBACK_KEEP_LOADED=false
ASR_MODEL_IDLE_UNLOAD_SECONDS=900
ASR_PRELOAD_ON_START=false原则遵守
- v0.1.11 的任务队列/状态机/幂等设计未被破坏
- Whisper fallback 机制正常
- aliases 后处理正常
- room_config 的 hotwords/aliases 结构合理
V0.1.12.1 Alpha (2026-07-06)
安全加固 (CodeAuditTool 审计修复)
HIGH — 修复项:
Dockerfile: 容器以非 root 用户appuser运行,限制权限;增加 pip 哈希校验指引app/analysis/_c_speedups.c:fast_char_bigrams()增加指针边界检查,防止单字符残片越界app/web/login_handler.py: 登录状态接口不再返回完整 Cookie 值,仅返回cookie_available布尔标记
MEDIUM — 修复项:
app/notify/webhook.py: 钉钉 webhook URL 拼接改用urllib.parse,防止原 query 参数被覆盖app/core/logging.py: 数据库 sink 异常写入 stderr,不再完全静默app/clipping/cover.py:out变量提至 try 前初始化,避免mktemp异常时 finally 块访问未定义变量
确认已有防护 (无需操作):
packaging/portable/build_bundle.py: zip-slip 已防护 (L252".." in member) (原 Publish-PnP)app/pipeline/storage_lifecycle.py: 符号链接检测 (L127) + 路径前缀验证 (_safe_unlink) 均已就位
V0.1.12 Alpha (2026-07-06)
多引擎 ASR 流水线重构
默认引擎从 Whisper 单引擎升级为四层流水线:
| 层级 | 引擎 | 功能 |
|---|---|---|
| 主引擎 | Paraformer-zh | 中文文本、词级时间戳、标点 |
| 辅助特征 | SenseVoice-Small | 情感、笑声、音乐、事件检测 |
| 低置信复核 | Fun-ASR-Nano | 低分 / 非中文片段复核 |
| 最终兜底 | Whisper large-v3 / turbo | 保留切换, 主引擎失败时自动回退 |
关键特性:
- 全部模型懒加载, 进程级缓存
ASRPipeline统一编排: Paraformer → SenseVoice → FunASR-Nano → Whisper- 通过
ASR_PRIMARY=whisper可随时切回纯 Whisper 模式 - 新环境变量:
ASR_PRIMARY/ASR_SENSEVOICE/ASR_FUNASR_REVIEW/ASR_FALLBACK_WHISPER/ASR_CONFIDENCE_THRESHOLD/ASR_MODEL_REVISION Transcript新增auxiliary_json字段存储辅助特征 (情感/事件/复核结果)TranscriptionResult扩展:emotions/reviewed_segments/engine
新增环境变量 (.env.example)
ASR_PRIMARY=paraformer # paraformer / whisper
ASR_SENSEVOICE=true # SenseVoice-Small
ASR_FUNASR_REVIEW=true # Fun-ASR-Nano 低置信复核
ASR_FALLBACK_WHISPER=true # Whisper 兜底
ASR_CONFIDENCE_THRESHOLD=-0.6 # 低置信阈值
ASR_MODEL_REVISION=master # 模型版本依赖
funasr(Paraformer / SenseVoice / Fun-ASR-Nano)modelscope(模型下载)faster-whisper(保持, 兜底引擎)
测试
178 项全部通过, 零回归。