CLEAR(Context-Aware Learning with End-to-End Mask-Free Inference for Adaptive Video Subtitle Removal) 远端部署总结
目标:在远端服务器上尝试复制 CLEAR 仓库并尝试部署测试(暂不进行训练)。
测试步骤:
-
考虑人为给一个视频添加硬字幕,然后测试去除效果。
-
考虑选取一个有字幕的短视频测试去除效果。
一、环境配置:
| 项目 | 最终配置 |
|---|---|
| 系统 | Ubuntu 22.04 |
| GPU | RTX 4090D 24GB |
| Python | 3.12.3 |
| PyTorch | 2.8.0+cu128 |
| CUDA | 12.8 |
| transformers | 4.49.0 |
| diffusers | 0.32.2 |
| huggingface_hub | 0.36.2 |
| DiffSynth | 1.1.8,对应历史 commit ed256ef |
| CLEAR 基座 | Wan2.1-Fun-V1.1-1.3B-Control(CLEAR github项目中README中的基座环境有误) |
| CLEAR LoRA | CLEAR-mask-free-subtitle-removal.pt |
二、部署流程
2.1 租用并登录远端服务器
先评估硬件要求,在 AutoDL 里面找一个实例购买。
注意自带的 pytorch 和 CUDA 版本。

先用无卡模式打开机子(可以省点钱,但是仅可用于轻量文件操作,不建议用于依赖导入/环境验证),然后用VScode去登录。
在 VS Code 里面 ctrl+shift+P 打开 SSH 界面,创建一个新的SSH之后输入密码即可。登录后界面如下。

项目、大模型、数据等全部尽量放:
/root/autodl-tmp/
而不要大量放在:
/root/
原因是 AutoDL 系统盘较小,大模型很容易把系统盘塞满。
2.2 基础环境的获取
机子已经配置了一些环境, 我们需要在文件夹中激活这些环境。
创建一个名为 clear312 的环境,克隆Pytorch并且激活:
conda create -n clear312 --clone base
conda activate clear312
验证环境是否配好代码:
python --version
python - <<'PY'
import torch
print(torch.__version__)
print(torch.version.cuda)
print(torch.cuda.is_available())
print(torch.cuda.get_device_name())
PY
配置好后会得到:
2.8.0+cu128
12.8
True
NVIDIA GeForce RTX 4090 D
2.3 克隆CLEAR仓库
两种方式。
- 第一种:直接把github仓库 git clone下来
git clone https://github.com/silent-commit/CLEAR.git /root/autodl-tmp/CLEAR
cd /root/autodl-tmp/CLEAR
git clone 后面跟着 github 仓库地址
cd 指你要把这个仓库克隆到哪里去
- 第二种:把 github 仓库本地下下来再传上去
比较垃圾比较慢,但是有时候服务器抽风只能这么搞了。
2.4 安装 CLEAR 依赖
在CLEAR文件夹中执行:
pip install -r requirements.txt
这句话指的是根据 requirements.txt 这个文档pip安装所需要的库或者环境。
注意,不要以为所有的环境都是越新越好,因为有些新版本已经不兼容论文代码了,会出错。
*安装正确版本的 DiffSynth
# 2. 下载 DiffSynth-Studio 源码
cd /root/autodl-tmp
git -c http.version=HTTP/1.1 clone \
https://github.com/modelscope/DiffSynth-Studio.git
cd DiffSynth-Studio
# 3. 切换到 CLEAR 所需要的旧版本
git checkout ed256ef
# 4. 安装这个版本 DiffSynth 的依赖
python -m pip install -r requirements.txt
# 5. 强制固定 CLEAR 已验证兼容的关键版本
python -m pip install \
"transformers==4.49.0" \
"diffusers==0.32.2"
# 6. 把当前这个旧版 DiffSynth 安装进 Python 环境
python -m pip install -e . --no-deps
# 7. 验证代码
python - <<'PY'
import transformers
import diffusers
import huggingface_hub
print("transformers:", transformers.__version__)
print("diffusers:", diffusers.__version__)
print("huggingface_hub:", huggingface_hub.__version__)
from transformers.modeling_utils import PretrainedConfig, PreTrainedModel
print("Transformers compatibility OK")
from diffsynth import load_state_dict
from diffsynth.pipelines.wan_video_new import WanVideoPipeline, ModelConfig
print("DiffSynth + wan_video_new import OK")
PY
注意到 CLEAR 对最新版的不兼容,我们需要把这个插件降级到 CLEAR 适用版本。
2.5 修改线程为 \(0\) 的问题
似乎服务器启动后线程会被默认为 \(0\) ,但是 OpenMP 规定线程要正整数,所以顺手最好改成 \(8\) 并持久化。
echo 'export OMP_NUM_THREADS=8' >> ~/.bashrc
2.6 预先部署——下载作者的 checkpoints
为了直接可以使用测试,可以直接下载好作者预先训练的一个小checkpoints,这样子暂时不用重训。
cd /root/autodl-tmp/CLEAR
hf download charlesw09/CLEAR-mask-free-video-subtitle-removal \
CLEAR-mask-free-subtitle-removal.pt \
--local-dir ./checkpoints
*2.7 安装 Wan 基座模型
mkdir -p /root/autodl-tmp/models/Wan2.1-Fun-V1.1-1.3B-Control
cd /root/autodl-tmp/models
先下载三个主要模型文件:
hf download alibaba-pai/Wan2.1-Fun-V1.1-1.3B-Control \
diffusion_pytorch_model.safetensors \
models_t5_umt5-xxl-enc-bf16.pth \
Wan2.1_VAE.pth \
--local-dir /root/autodl-tmp/models/Wan2.1-Fun-V1.1-1.3B-Control
再下载 tokenizer:
hf download alibaba-pai/Wan2.1-Fun-V1.1-1.3B-Control \
--include "google/*" \
--local-dir /root/autodl-tmp/models/Wan2.1-Fun-V1.1-1.3B-Control
最终检查:
ls -lh /root/autodl-tmp/models/Wan2.1-Fun-V1.1-1.3B-Control
应该至少看到:
Wan2.1-Fun-V1.1-1.3B-Control/
├── diffusion_pytorch_model.safetensors
├── models_t5_umt5-xxl-enc-bf16.pth
├── Wan2.1_VAE.pth
└── google/
└── umt5-xxl/
*注意 CLEAR 仓库中 README.md 的下载示例容易产生误解,我一开始就装错了,到后面爆了张量维度 \(-16\) 失败才发现。CLEAR 的文档容易让人把普通 Wan2.1-T2V-1.3B 当成基座,但 CLEAR 实际运行需要 Wan2.1-Fun-V1.1-1.3B-Control。两者的 T5/VAE/tokenizer 可以兼容复用,但核心 DiT 的输入结构不同,因此错误直到推理阶段才以张量维度异常的形式暴露出来。这是昨天复现过程中我踩到的最大的坑。
*2.8 安装视频工具(+人为添加硬字幕)
软字幕:****是视频文件里单独存在的一条字幕轨道,例如播放器可以开关,这种字幕不是完全覆盖视频画面的,不适用 CLEAR 场景。
硬字幕:已经则是字幕已经被画进每一帧图像,更难去除。
下载 ffmpeg
apt-get update
apt-get install -y ffmpeg fonts-dejavu-core
目的:在一个 \(3 \sim 5\) 秒的 \(480p/720p\) 视频(\(>81 frames\))人为添加字幕。
- 截取从 \(8\) 秒开始的 \(5s\)。
ffmpeg \
-ss 00:00:08 \
-i /root/autodl-tmp/test_videos/source.mp4 \
-t 5 \
-an \
-c:v libx264 \
-crf 18 \
/root/autodl-tmp/test_videos/test_clean.mp4
- 测试字体是否存在
ls /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf
- 例:人为添加字幕
ffmpeg \
-i /root/autodl-tmp/test_videos/test_clean.mp4 \
-vf "\
drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf:text='Where are you going?':fontcolor=white:fontsize=28:borderw=2:bordercolor=black:x=(w-text_w)/2:y=h-text_h-25:enable='between(t,0,1.7)',\
drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf:text='I am going outside.':fontcolor=white:fontsize=28:borderw=2:bordercolor=black:x=(w-text_w)/2:y=h-text_h-25:enable='between(t,1.7,3.4)',\
drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf:text='The weather is beautiful today.':fontcolor=white:fontsize=28:borderw=2:bordercolor=black:x=(w-text_w)/2:y=h-text_h-25:enable='between(t,3.4,5.0)'" \
-c:v libx264 \
-crf 18 \
-an \
/root/autodl-tmp/test_videos/test_sub.mp4
2.9 正式启动测试
tmux new -s clearinfer
conda activate clear312
cd /root/autodl-tmp/CLEAR
export OMP_NUM_THREADS=8
export MODEL_BASE_PATH=\
/root/autodl-tmp/models/Wan2.1-Fun-V1.1-1.3B-Control
export LORA_CHECKPOINT=\
/root/autodl-tmp/CLEAR/checkpoints/CLEAR-mask-free-subtitle-removal.pt
bash scripts/inference.sh \
/root/autodl-tmp/test_videos/test_sub.mp4 \
/root/autodl-tmp/results/test14
三、测试结果
-
人为烧入硬字幕 再使用 CLEAR 进行去除效果:
视频参数:$ 640 \times 360 $,\(120\) 帧。用时 24.90 s 完成擦除
当前官方部署已经成功,但这次 120 帧视频的 sliding-window 推理最终仅输出了 81 帧。后续如果需要正式处理长视频,需要进一步检查 sliding-window。

-
直接使用 CLEAR 擦除源文件就有硬字幕的视频:
视频参数:$ 640 \times 360 $,\(81\) 帧。总推理时间:16.90 s。

自我评估:使用默认参数情况下, CLEAR 确实可以做到擦除字幕且大体保留视频的完整性与画面的适配,但是在局部细节方面还是不能做到很好的完美擦除,例如第二次测试中,左侧男士的手还原效果不是非常理想。
第一次人工添加硬字幕且没有黑色底幕背景情况下擦除效果远优于第二次,但是两次擦除都对颜色对比度造成了肉眼可见的影响。
四、常见问题
| 问题 | 原因 | 最终解决 |
|---|---|---|
Python import 时直接 Killed |
AutoDL 无 GPU 模式实际 cgroup 内存只有 2GB | 回到正常 GPU 实例 |
| 自建 Python3.10 环境没有 torch | 新 Conda 环境为空 | conda create -n clear312 --clone base |
pip install diffsynth 找不到 wan_video_new |
PyPI / 新版 DiffSynth API 已变化 | GitHub DiffSynth + commit ed256ef |
| DiffSynth main 没有需要的旧接口 | 上游代码发生变化 | checkout 历史 commit |
缺 sentencepiece |
pip install -e . --no-deps 没装依赖 |
安装 DiffSynth requirements |
PretrainedConfig ImportError |
transformers 5.17 太新 | 固定 transformers 4.49.0 |
| diffusers / hub 依赖冲突 | diffusers 0.40 太新 | 固定 diffusers 0.32.2 |
OMP_NUM_THREADS warning |
环境变量为 0 | 设置为 8 |
| Hugging Face timeout | AutoDL 到 HF 网络不稳定 | network_turbo / hf-mirror |
Xet 401 Unauthorized |
hf-xet 请求 xethub | HF_HUB_DISABLE_XET=1 |
| SSH 断开下载停止 | 程序直接挂在 SSH 前台 | 使用 tmux;hf 下载可续传 |
negative dimension -16 |
错用了普通 Wan2.1-T2V | 改成 Wan2.1-Fun Control DiT |
ffmpeg: command not found |
镜像未安装 ffmpeg | apt 安装 |
tmux: command not found |
镜像未安装 tmux | apt 安装 |
| 120 帧只输出 81 帧 | 尚未定位 | 后续检查 sliding-window 实现 |

浙公网安备 33010602011771号