feat: 片段时长自动对齐配音时长 #1693
Reference in New Issue
Block a user
Delete Branch "feature/clip-duration-voice-alignment"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
需求
后端生成视频时,片段总时长自动对齐配音时长,最终视频时长 = 配音时长。
实现
核心逻辑(在渲染前执行)
探测配音音频时长 (
_get_voice_audio_duration)probe_duration获取配音文件时长调整片段时长 (
_align_clips_to_voice_duration)ratio = voice_duration / total_clips_durationabs(ratio - 1.0) <= 0.05(±5% 以内)→ 不调整ratio < 1.0(片段比配音长)→ 按比例裁剪每段末尾ratio > 1.0(片段比配音短)→ 按比例慢放每段(下限 0.25x)调用时机
render()中,clips 分组为 layers 后、计算视频总时长前调用video_duration_final用于后续渲染调整范围
main、broll、background视频图层audio、overlay、pip等非视频图层边界处理
测试
新增
tests/unit/test_voice_duration_alignment.py(11 个测试):test_no_voice_audio_no_adjustment- 无配音不调整test_ratio_within_5_percent_no_adjustment- ±5% 内不调整test_ratio_less_than_1_trim_clips- ratio < 1 裁剪test_ratio_greater_than_1_slowdown_clips- ratio > 1 减速test_speed_lower_bound_025- 速度下限 0.25xtest_only_video_layers_adjusted- 只调整视频图层test_multiple_video_layers_all_adjusted- 多图层全部调整test_trim_config_also_adjusted- trim_config 同步调整test_no_voiceover_path_returns_zero- 无路径返回 0test_nonexistent_file_returns_zero- 文件不存在返回 0test_probes_duration_from_file- 正确探测时长153 个相关测试全通过
未实现的边界场景
以下场景本次未实现,后续如有需要可补充:
ratio > 1.1时最后一段末尾冻结定格(需要 FFmpegtpad滤镜)ratio > 1.5时最后一段循环播放(需要复制 clip 或 FFmpegloop滤镜)🚀 预览环境已部署
LGTM ✅ CI 全绿
🗑️ 预览环境已清理
PR #1693 已关闭或合并,对应的预览环境已被清理。