Communitygithub.com

LeAnhTuanIT/short-video

Tạo video ngắn dọc 9:16 (TikTok/Reels/Shorts) với giọng đọc tiếng Việt (hoặc ngôn ngữ khác) và phụ đề cứng, từ kịch bản tự viết hoặc do người dùng cung cấp. Hỗ trợ ghép phụ đề cho file voice MP3 có sẵn.

short-video 是什么?

技能 `short-video` 是一个自动化短视频制作工具,专为 TikTok/Reels/Shorts 等竖屏平台设计。它能从用户提供的脚本或自动生成的脚本出发,通过 `make_video.py` 流水线完成文本转语音(TTS)、音频拼接、时间轴校准、动态字幕(ASS 格式)叠加和背景合成,最终输出 1080x1920 的 MP4 文件。支持边缘 TTS(Edge-TTS)、FPT.AI 等多种语音引擎,提供夜间风格(霓虹字幕、城市夜景)和 UI 风格(科技教程、步骤卡)等预设样式。用户也可直接提供 MP3 语音文件,脚本自动对齐字幕时间轴。该工具可在 macOS 和 Ubuntu/Debian(通过 WSL 支持 Windows)上运行,并依赖 ffmpeg 和 edge-tts 库。特别适合内容创作者、营销人员快速生成带本地化语音和字幕的短视频,无需专业视频编辑软件。

兼容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/LeAnhTuanIT/short-video-skill/tree/HEAD

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

短视频制作:语音 + 字幕

流水线:.txt 脚本 → make_video.py(edge-tts 逐句朗读 → 合成音频 → 根据实际时长生成 ASS 字幕 → 背景 + 内嵌字幕 via ffmpeg)→ 1080x1920 MP4。

已确定的模式:已有语音 → 视频(当用户提供 mp3 时默认使用)

用户在 EverAI 上生成语音(网页,速度 0.85),发送 mp3 + 台词。不调用 API,不克隆语音,不运行(VieNeu)语音模型于本机。

  1. 将台词拆分为 .txt 文件,每行一个短句(以逗号/句号/"..." 分割),不能包含 # 行,不能包含 [icon]。
  2. python3 make_video.py kichban.txt ~/Downloads/<ten>.mp4 --audio voice.mp3 --style night --no-wave --bg assets/pho-dem.mp4 --target <dài±5>
  3. 打印每句时间戳:重新运行上述命令并添加 --print-timing(不渲染)。检查:若某行与字数相比过长或过短 → 合并/拆分后重新渲染。
  4. 提取 1–2 帧检查字幕,报告路径和时长。若听不到声音 → 通常是因为 Mac 输出到了 AirPods。 用户指南:HUONG-DAN.md。

在其他机器上安装

将整个目录 ~/.claude/skills/short-video/ 复制到新机器(相同路径),然后运行 bash ~/.claude/skills/short-video/setup.sh。支持 macOS 和 Ubuntu/Debian;Windows 使用 WSL。内置城市夜景背景:assets/pho-dem.mp4(Mixkit 素材,可用于商业用途)。

依赖(本机已安装)

  • ffmpeg-full(需要 subtitles/libass 滤镜):brew install ffmpeg-full
  • edge-tts:pipx install edge-tts(网络错误时自动回退使用 say -v Linh 语音)

步骤 1 — 确定需求

从用户需求中获取;若缺少则使用默认值,仅当主题完全不明时提问:

  • 主题 / 角度 — 若无具体角度,自行选择一个有吸引力、具体的角度。
  • 时长 — 默认 45–60 秒。
  • 语音 — 默认女声 vi-VN-HoaiMyNeural;男声 vi-VN-NamMinhNeural。其他语言:edge-tts --list-voices | grep <代码>(例如 en-US-AriaNeural)。
  • 背景 / 音乐 — 用户提供的图片/视频,若无则默认渐变背景。

步骤 2 — 编写脚本

保存为 .txt 文件,第一行为标题,之后每行一个句子:

# 屏幕顶部显示的短标题(≤ 6 个词)
一个引起好奇的钩子句,≤ 12 个词。
内容句...
结尾句 + 行动呼吁。

规则:

  • 越南语时长:~2.3 词/秒(实际测试:155 词 ≈ 65 秒)。45–60 秒 → 110–140 词;30 秒 → ~65 词;15 秒 → ~30 词。
  • 每行一个句子,8–20 词。前 3 秒为钩子(问题 / 惊人事实)。中间:3–5 个具体、易记的观点。结尾:CTA(保存、关注、评论)。
  • 事实必须准确;健康/金融/法律主题:不诊断,不提供具体专家式建议,必要时建议咨询专家。
  • 数字/符号使用文字书写(当易读错时用“四 - 七 - 八”代替“4-7-8”,“百分比”代替“%”)。避免表情符号、{} \ 字符。

让用户预览脚本后再渲染,除非用户已提供内容或要求直接执行。

步骤 3 — 渲染

python3 ~/.claude/skills/short-video/make_video.py kichban.txt out.mp4 \
  [--voice vi-VN-HoaiMyNeural] [--rate -5%] [--target 45-60] \
  [--bg anh_hoac_video_nen] [--music nhac_nen.mp3] [--gap 0.35] \
  [--pitch -8Hz] [--style default|night]
  • 已有语音: --audio voice.mp3 跳过 TTS。脚本必须与朗读内容匹配,每行一个短句(以逗号/句号分割);时间标记从自然停顿处开始。通过 --print-timing 打印时间戳(通常 ~12–16 字符/秒),若某句过长或过短,则合并/拆分句子后重新渲染。
  • FPT.AI: --engine fpt --voice leminh(北方男声;还有 banmai、thuminh 北方女声,lannhi、linhsan 南方女声,myan 中部女声,giahuy 中部男声)。需要 export FPT_API_KEY=...(密钥在 console.fpt.ai 获取,免费层每月 100,000 字符)。无逐词时间戳,故字词根据长度分拆;--rate 通过 atempo 应用。切勿将密钥写入技能文件。
  • 所有引擎均模拟自然朗读节奏(每句速度/音调略有波动,问句后停顿较长)+ 暖声、压缩、轻微混响处理。按口语风格编写脚本,使用 "..." 和句间句号以创造自然呼吸停顿。
  • 北方低沉、成熟男声(edge):--voice vi-VN-NamMinhNeural --pitch=-8Hz --rate=-10%(NamMinh 是唯一的男性越南语语音)。
  • --style night --no-wave + 脚本中无 # 行、无 [icon] 标签 → 仅保留背景 + 字幕。
  • --style night("城市夜景"风格):标题采用大写字母、字间距拉宽、teal 色加下划线;图标为细线霓虹风格;字幕为逐词卡拉OK(真实时间戳来自 edge-tts);声波为条形图。在句子开头放置 [icon] 可切换该句图标:sun hourglass gift heart leaf book star eye。背景建议使用真实的城市夜景视频:Mixkit 免费素材(https://mixkit.co/free-stock-video/night-city-street/,链接 assets.mixkit.co/videos/<id>/<id>-1080.mp4),拼接几个片段,纵向裁剪,setpts=1.4*PTS 放慢速度。
  • --style ui(科技教程视频):深色网格背景,系列标题(#)+ 步骤 1..n 框,模拟应用窗口,终端键盘敲击,字幕中 *关键词* 橙色高亮。句首标签:[step:步骤名称](进入新步骤),[card:标题|项目1|项目2](窗口,保持至下一场景),[term:命令]。快捷键朗读时写成文字(“Command,Shift,三”),但在卡片内写为“Command + Shift + 3”。示例:语音 vi-VN-NamMinhNeural --pitch=-4Hz --rate=+15% --gap 0.25。
  • 无 --bg → 深蓝紫色渐变背景缓慢移动(适合温和主题;热闹主题应提供图片/视频背景)。图片 → 慢速缩放效果。视频 → 自动循环。
  • --music 音量降至 12%,结尾淡出。
  • 脚本会打印时长,若超出 --target 则给出警告 → 增加/删除句子或调整 --rate 并重新渲染。

步骤 4 — 检查

提取一帧查看字幕是否超出边界或模糊: ffmpeg -v error -y -ss 5 -i out.mp4 -frames:v 1 frame.jpg 然后读取 frame.jpg。向用户报告视频的绝对路径和时长。

脚本示例:技能目录中的 example-sleep.txt。

相关技能