42 lines
6.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 智能剪辑处理环境
从项目根目录运行 `bash services/smart-edit/setup.sh`。准备 Python 3.11、FFmpeg/ffprobe(包含 libx264 与 subtitles/libass)、中文字体(Linux 推荐 Noto Sans CJK)。基础分析依赖按版本固定,虚拟环境独立。
应用环境配置:
- `SMART_EDIT_PYTHON=/绝对路径/.venv-smart-edit/bin/python`
- `SMART_EDIT_CACHE_DIR=/有足够磁盘空间的私有目录/smart-edit-cache`(缺省 `.cache/smart-edit`)
- 运行目录保持项目根目录;Next standalone 打包已包含 analyze.py,Python 与 FFmpeg 单独安装。
语音识别选装:执行 `bash services/smart-edit/setup.sh --with-asr`,会安装 FunASR/PyTorch 并从 ModelScope 下载官方 Paraformer、FSMN-VAD、CT-Transformer 三个模型。把脚本输出的 `SMART_EDIT_ASR_MODEL`、`SMART_EDIT_VAD_MODEL`、`SMART_EDIT_PUNC_MODEL` 路径写入应用环境。模型代码禁止 trust_remote_code,用户请求不能选择任意模型文件。模型权重下载可能较大,应在维护期间完成;请求阶段仅读取已经配置好的本地模型。
诊断:`$SMART_EDIT_PYTHON services/smart-edit/analyze.py --check`。API `/api/canvas/smart-edit/capabilities` 仅对登录用户返回可用功能与模型列表,不返回密钥或本地路径。ASR 未准备好时页面关闭自动转写选项,仍可导入 SRT 和进行画面混剪。
资源:整个智能剪辑作业通过 PostgreSQL advisory lock 限制为同一数据库下同时一个重处理任务,租约心跳沿用画布任务队列。Python/FFmpeg 限制线程数,单素材 ≤180 秒、≤125 MiB、至多12份,总原始素材≤10分钟,成片≤300秒、≤12片段;分析缓存按用户隔离,内容 hash 校验,7天过期、4GiB上限。低清代理仅用于分析,成片使用原素材。数据库锁繁忙时任务保存为可恢复状态,页面轮询或返回画布会继续运行。
算法:PySceneDetect 检测镜头,librosa 检测节拍,FunASR 返回语句时间戳(采用 FunClip 的时间戳剪辑思路)。去静音为独立实现的 RMS 阈值算法,参考 Auto-Editor 的粗剪与余量机制;没有复制 Auto-Editor 或 FunClip 源码,也不依赖它们的 UI。来源与许可证记录在项目 docs/video-canvas-smart-edit-research-2026-09-17.md。PySceneDetect 为 BSD-3-Clause,librosa 为 ISC,FunASR 源码和各权重许可应按所安装版本一并保留。
智能选片直接复用项目内官方千问3.8视觉模型;关闭智能选片后所有镜头/节拍/剪辑流程均为本地运算。供应商受理状态不明的语义请求不会自动重发。素材文本和字幕仅为待分析数据,模型只允许返回实际候选ID,不能生成任意时间区间、文件路径或命令。
预览使用同一 EDL 的时间、裁剪、速度、音量和叠化参数;浏览器流式预览受网络和解码影响。最终导出由 FFmpeg 确定性合成。音乐文件不足时末尾补静音,不默认循环;背景音量由用户调整。字幕样式与浏览器字体可能有差异。广告多版本目前对候选排序作轮换,素材不足时明确提示,不宣称独立生成多个创意脚本。
远程合成:设置 `SMART_EDIT_RENDER_URL` 与 `SMART_EDIT_RENDER_TOKEN` 后,render操作进入独立API,不占用本地主处理锁。独立服务部署见 `../video-render/README.md`,其千问仅提供可选文字能力。分析操作仍使用本机Python/代理文件。
远程合成链路暂时不可用时,可设置 `SMART_EDIT_RENDER_FORCE_LOCAL=1` 让新任务使用本机 FFmpeg;已有远程任务仍保留原服务地址与任务编号,等待原链路恢复后查询,避免重复合成。
## 人声分离、转写和完整字体库(2026-09-18)
`bash services/smart-edit/setup.sh --with-all` 在独立环境安装全部依赖。也可使用 `--with-separation` 或 `--with-asr`。
- **人声分离**:`prepare_separation.py` 下载并校验官方 HTDemucs 权重。将输出的 `SMART_EDIT_SEPARATION_MODEL_DIR` 加入应用环境。请求阶段离线运行,CPU 2线程、7秒分块、每次最多180秒;支持仅保留人声、仅保留背景音、输出两个音轨,保持裁剪、变速、音量、静音及转场包络。视频原声自动关闭,独立音轨可继续分离;失败保留原内容。
- **自动转写**:字幕列表直接提供入口。FunASR 同时开启 `pred_timestamp` 与 `sentence_timestamp`;时间戳限制在素材范围内,再映射至剪辑时间轴。保留手动字幕,重试只替换此前自动生成的字幕。任务存数据库,可退出后再打开;处理完成前锁住当前编辑,避免覆盖并行改动。
- **字体库**:对应参考站2002项的目录见 `lib/video-canvas/smart-edit/font-catalog.json`(1997项)及 `fonts.ts`(原有5项)。已逐一下载、解析和校验,完整新增字体约757MiB。原始与处理后SHA-256均固定;保留字体内版权/许可字段。浏览器和FFmpeg使用同一处理后文件,独立字体族名避免粗细变体串字,变量字体固定为选定默认实例。两款参考字体的OS/2版本声明与实际长度不一致,按已有字段修复为v4,不改变字形轮廓。
- **安装字体**:默认按选择懒加载,需Python的`requirements-fonts.txt`。部署前推荐执行 `$SMART_EDIT_PYTHON services/smart-edit/prepare_fonts.py` 预热全部目录,或者复制已校验的字体缓存。`SMART_EDIT_FONT_CACHE_DIR` 指定共享缓存目录;`SMART_EDIT_FONT_PYTHON` 可单独指定字体Python。原有5款字体仍随应用/合成服务打包。首次下载失败会明确报错,不静默替换成默认字体。
- **远程合成字体**:独立合成服务同样安装字体依赖,设置同一缓存或预热目录;构建时已带上字体转换脚本及固定目录。`SMART_EDIT_FONT_SCRIPT` 可覆盖脚本位置。ASR/分离仍在主应用配置的处理器运行,合成远程执行。
当前限制:视频素材最多12份,每份180秒;成片最长300秒,最多12视频片段、24独立音频片段。含派生分离轨最多36份资源、累计1800秒。实际模型耗时随硬件和素材变化,合成字体的抗锯齿仍受浏览器与libass渲染器影响。
真实模型回归:提供含“智能剪辑”和“人声分离”的中文WAV,运行 `$SMART_EDIT_PYTHON scripts/qa/smart-edit-models.py input.wav .qa/model-check`。验证实际语音识别、逐句时间戳、真实混音分离及两轨重构误差,无付费模型调用。
本地主站全链路:在隔离数据库与存储环境启动真实Next,准备测试账号JSON和中文视频后,执行 `SMART_EDIT_QA_DIR=.qa/isolated-main-chain node scripts/qa/smart-edit-main-chain.cjs`。脚本只允许本地地址,验证登录、上传、方案、分离三个分支、转写、实际字幕字体成片和SRT。完整记录见 `docs/smart-edit-completion-2026-09-18.md`。