创建人员:dev.developer.project
文件职责:冻结长视频有界分块、时间轴合并、资源验收和失败清理的最小实现方案。
管理规范/模板:../../../dev-doc/编码规范.md;../../../dev-doc/开发审计规范.md;../../../../common/dev-doc/编码规范.md。
引用文件:../../../ai-media-processor/draft/本地视频语音转写_4小时长视频性能与资源优化需求_v0.1.md;../../../dev/project-dev/transcribe_media.py;../../../dev/project-dev/test/test_transcribe_media.py;../本地视频语音转写工具.md。
记录方式:重型性能优化编码方案;方案审核通过后按本版本实现,变化另建后继版本。
DEV-PROJECT-INFO-LOCAL-MEDIA-TRANSCRIBE-LONG-VIDEO-OPT-20260801-001。dev/project-dev/transcribe_media.py、对应测试和使用说明;不新增模型、CPU 降级、批处理、断点续跑、服务或数据库。现有公开 CLI 与 transcribe_video(video_path, output_dir, language, ...) 不变,只增加内部函数:
_probe_audio_duration:对已生成的完整 FLAC 获取有限、正数时长。_plan_audio_chunks:当时长大于 1200 s 时生成顺序核心区间;核心长度 1200 s,两侧重叠 5 s,首尾裁到 [0,duration]。_extract_audio_chunk:从完整 FLAC 生成唯一临时块;固定 16 kHz、单声道 FLAC、-n,失败显式停止。_collect_chunked_transcript:复用同一模型逐块转写;每块结束后在 finally 删除临时块。_project_chunk_segments:块内时间加音频块全局起点;按分段中点落入对应核心 [core_start, core_end),仅末块允许中点等于总时长;排序后输出全局分段。短视频 duration <= 1200 s 继续调用现有 _collect_transcript(model, full_flac, language),不创建音频块。
large-v3、device=cuda、compute_type=float16、vad_filter=True 不变。对第 i 块:
core_start = i * 1200core_end = min(duration, core_start + 1200)audio_start = max(0, core_start - 5)audio_end = min(duration, core_end + 5)global_start/end = audio_start + local_start/endmidpoint = (global_start + global_end) / 2只保留中点属于本块核心区间的分段;这是一条唯一归属规则,不增加模糊文本去重或重写识别结果。最终分段按 (start,end,text) 升序,TXT/SRT/JSON 继续由同一个结果对象生成。
正在转写分块 i/n 并立即刷新,便于资源采样关联块号。finally 清理整个暂存目录;块函数另有局部 finally,确保当前块先删除。1193.64 s 视频走未分块路径,核对 705 段、四文件对应、源哈希不变。14400 s 测试副本。0、耗时 <=100 min、RAM <=12 GB、GPU <10 GB、临时块 <500 MB、前后三块峰值差、FLAC 时长、文本非空、SRT/JSON 可解析和全部 20 分钟边界。case_analysis.media_processor 只读复核。dev/project-dev/tmp/DEV-PROJECT-INFO-LOCAL-MEDIA-TRANSCRIBE-LONG-VIDEO-OPT-20260801-001/。finally 删除临时块,会违反 500 MB 和单块上限。language=None,会造成语言漂移;测试必须检查调用参数。PENDING_INDEPENDENT_DESIGN_REVIEW