国语批量成片(mandarin-dub-subtitle)
把竖屏素材(口播视频、无声操作视频、音频、多段素材)批量做成国语配音成片+二次加工封面。粤语版的姊妹技能,流水线同构、口径不同。
口径(善思兄 2026-09-28 定,与粤语版的三处关键差别)
- 声音:全部 TTS 国语声线重配——不管素材有没有原声,一律抹掉重配。默认女声
zh-CN-XiaoxiaoNeural,男声zh-CN-YunjianNeural(gender/voice 可覆盖)。 - 稿件:本机离线转写——素材里有说话声的,先用 faster-whisper(本机运行,音频不上传)转写成简体字稿,再交给 TTS 重配;用户单独给音频的,转写该音频当稿件;无声素材走视觉写稿或手写 sentences。
- 字幕:白字+黑色阴影、简体中文、居中——案例里那圈"黑边"其实是阴影效果,不是描边(ASS:Outline=0 + Shadow)。默认字号 屏宽×0.06、距底 0.15(字幕安全区铁规,见下)。
- 封面:二次加工 + 案例版式——不是抽帧压字了事:
- 先挑适合做封面的帧(口播类挑人物形象自然、五官清楚的帧;操作类挑画面干净的主体帧);
- 有条件就用 AI 重绘底图(影棚灯光质感,参考案例:深色影棚背景+金属环形灯),生成后把图路径写进clip.cover_bg;
- AI 生图 prompt 铁规(2026-09-28 善思兄"位置不对"教训):必须写明「人物位于画面下半部,头顶约在画面 42% 高度处,头顶上方留出大面积深色背景空间」——人物占比过大(头顶高于 35%)会让文字压头,案例二的底图头顶就在约 42%;
- 文字版式照案例:白字+软阴影(不是细描边),主标题大字在上、副标题小字紧跟其下,水平居中,文字块默认压画面 28% 高度处;主标题字号≈宽×0.075,副标题≈宽×0.05;
- 压字前必看头顶位置:生成封面后读图复核——文字块(含副标题)必须整体在人物头顶上方、留有明显间隙,不许压头/压脸/压眼镜。底图人物偏大时用cover.top上移(如头顶在 35% 时 top 取 0.18),或重生成合规底图。⚠️ AI 生图对"头顶 42%"不一定照办(实测可偏差到 35%),所以压字前必须读图实测头顶高度再定 top,不能默认 0.28。
- ImageGen 出图自带水印(2026-09-28 实测):右下角有"AI生成 WORKBUDDY"水印,拿去做 cover_bg 前先用 PIL 裁掉底部约 9% 再压字,否则水印会进封面。
- 只出 9:16(1080×1920),不出 1x1(铁规,同粤语版)。 - 封面副标题铁规:必须写跟内容/品牌相关的卖点,绝不可写工具功能名("粤语配音·视频成片"这类被批过)。
- 字幕安全区铁规(2026-09-28 善思兄"字幕位置还是太低"教训):视频号/抖音等平台会把画面最底部一条盖住——进度条、点赞/评论/转发按钮、平台自动字幕都在底部。字幕距底比例不得低于 0.12,默认 0.15(1920 高即离底 288px);案例参考图的"贴底"版式在真实平台上会被吃掉,不能照抄。用户反馈偏低时优先调大
subtitle.position,重烧即可(配音/封面不用动)。 - 美颜 + 美体后期(2026-09-28 善思兄定):config 顶层可开
beauty/body两个工序,都关(默认)时零开销。
- 美颜(ffmpeg,无依赖,稳):磨皮(hqdn3d 皮肤降噪)+提亮/增白/微增饱和+锐化保细节。字段:beauty.enabled / smooth(磨皮强度,默认9.0,≈脸区高频降20%肉眼明显) / brightness(0.10) / contrast(1.06) / saturation(0.90) / sharpen(0.45) / strength(cas 对比度自适应锐化,0=关,0.4~0.9 常用,恢复纹理且不炸噪点)。⚠️ 旧版 gblur+blend 方案在 1080p 上肉眼几乎看不出(2026-09-28 善思兄反馈"没加上"),已换 hqdn3d 方案;强度要给到用户看得出来。清晰度增强用 cas(本机参数名 strength,非 amount):素材本身偏肉/磨皮后发糊时,设strength:0.7即可明显找回毛发、针脚等细纹理,且噪点控制远优于 unsharp(同档噪点少 20%+,过强 cas=0.9 噪点会暴涨须避免);cas 放在提亮之后锐化。
- 美体(OpenCV 几何瘦体,非 AI):针对竖屏半身/口播画面——腰部收窄(body.slim,中部一条带向中轴收拢)+腿部拉长(body.leg,下半部纵向拉伸)。默认 slim=0.15, leg=0.08(0.10 以下肉眼难辨)。⚠️ 这是与内容无关的几何变形,不识别人体;真正的"认人瘦体"需 MediaPipe 人体关键点,后续可升级。
- 实现见scripts/video_beauty.py(beautify()),两个技能共用同一份。⚠️ 本机 ffmpeg 不吃-map "[标签]"和单引号表达式,滤镜链不挂输出标签、不写-map(已实测 hqdn3d+eq+unsharp 无标签链可跑)。
运行
python dub_mandarin.py config.json
依赖:pip install edge-tts imageio-ffmpeg faster-whisper zhconv(faster-whisper 首次跑会下载模型,约 460MB;国内网络需设环境变量 HF_ENDPOINT=https://hf-mirror.com,直连 HuggingFace 会被代理拦成 502)。
config.json 关键字段
{
"src_dir": "素材目录", "out_dir": "输出目录",
"gender": "female", // 女声默认;male=男声
"rate": "+8%",
"asr_model": "small", // base快/small准(默认)/medium
"subtitle": {"color": "white", "shadow": 3, "font_scale": 0.06, "position": 0.15},
"original_audio": "off",
"beauty": {"enabled": true, "smooth": 6.0, "brightness": 0.10,
"contrast": 1.06, "saturation": 0.90, "sharpen": 0.45, "strength": 0.7},
"body": {"enabled": true, "slim": 0.15, "leg": 0.08},
"cover": {"enabled": true, "title_scale": 0.075, "sub_scale": 0.05,
"top": 0.28, "shadow_blur": 6},
"clips": [
{"file": "a.mp4", "title": "01_xxx",
"sentences": ["……。"], // 不写→自动转写(有说话声)
"audio": "narration.mp3", // 单独音频当稿件来源
"files": ["a1.mp4","a2.mp4"], // 多段素材先拼接再成片(组合剪辑)
"cover_title": "SMP后第一天很关键",
"cover_subtitle": "美丽共感 · 纹发加密",
"cover_bg": "C:/path/ai_bg.jpg", // AI 二次加工底图(可选)
"cover_time": 0.35} // 没有 cover_bg 时的抽帧位置
]
}
其余(bgm / compile / auto_scan / vision)与粤语版 cantonese-dub-subtitle 同构,直接参照那份 SKILL.md。
助手工作流
- 收素材:确认口径(本技能口径基本固定,不用每次问);拿到素材路径。
- 写 config:口播类素材不写 sentences(让脚本自动转写);无声素材写稿(简体口语,平实不夸大)或配 vision。
- 跑脚本:
HF_ENDPOINT=https://hf-mirror.com环境变量带上再跑(模型已缓存后可省)。 - 封面二次加工:跑完后逐条看抽出的帧——不合适就调
cover_time重抽;要 AI 重绘底图的,用生图能力(图生图)按案例风格(深色影棚+环形灯+人物居中)生成 9:16 底图,存盘后把路径写进cover_bg,重跑该条或只调 make_cover。 - 复核:抽成片帧核对白字阴影字幕;读封面核对版式与副标题铁规。
产出
{title}.mp4—— 原画 + 国语配音 + 白字阴影简体字幕{title}_国语配音.mp3/{title}_国语字幕.srt{title}_封面_9x16.jpg—— 二次加工封面(仅竖版)