视频剪辑(本地)
需要yt-dlp、ffmpeg和python3。使用命令-v检查。
查找插件脚本
ASS歌词生成器随插件捆绑。启动时定位一次(仅搜索插件自己的捆绑文件):
ASS_SCRIPT=$(find ~/.claude/plugins -path '/clip-local//scripts/ass-karaoke.py' 2>/dev/null | head -1)
自动突出显示模式
当用户未指定开始/结束时间(例如,“幫我剪這個影片的精華”或“clip the best parts”):
下载完整的转录(以下步骤1-2)
阅读整个转录并识别3-5个突出段。
对于每个段,记录:
开始和结束时间戳
为什么它有趣的简要描述(关键见解、有趣时刻、戏剧性转折等)
将突出显示的选项以编号形式呈现给用户,并询问哪些要剪辑
仅剪辑用户选择的段,然后继续正常流程(翻译、字幕等)
流程
yt-dlp --print title --print duration_string --print language \
--no-playlist --no-warnings --force-ipv4 ""
第三行是原始语言代码(例如en、en-US、ja、zh-Hant)。
使用基本代码(-之前)进行字幕下载。
yt-dlp --write-auto-sub --sub-lang "
" --sub-format vtt --skip-download \
--no-playlist --no-warnings --force-ipv4 \
--extractor-args 'youtube:player-client=default,mweb' \
-o "subs" ""
将替换为步骤1中的基本语言代码(例如en、ja)。
通配符匹配变体,如en-orig。
不要使用YouTube的自动翻译字幕——它们质量较低。
所有翻译均由您完成。
当剪辑一部分(例如10-130秒)时,筛选VTT以仅包含时间戳在范围内的提示。
保留原始绝对时间戳——不要调整它们。
ass-karaoke.py中的--offset标志处理时间偏移。
筛选时,去除时间戳行的任何额外元数据(例如align:start position:0%)—仅保留HH:MM:SS.mmm --> HH:MM:SS.mmm。
ASS解析器正则表达式需要干净的时间戳行。
编写并执行Python脚本:
解析修剪后的VTT(正则表达式:HH:MM:SS.mmm --> HH:MM:SS.mmm + 文本行)
收集所有文本行到一个列表中
您翻译列表(打印Python翻译字符串列表)
使用相同的时间戳和翻译文本写入新的VTT
示例结构:
import re
# 解析原始VTT
with open("clip.vtt") as f:
content = f.read()
cues = re.findall(r'(\d{2}:\d{2}:\d{2}\.\d{3} --> \d{2}:\d{2}:\d{2}\.\d{3})\n((?:(?!\d{2}:\d{2}).+\n?)*)', content)
# 翻译 —— 用您的翻译填充此列表,每个提示一个
translations = [
"翻译行 1",
"翻译行 2",
# ...
]
# 写入翻译后的VTT
with open("clip_translated.vtt", "w") as f:
f.write("WEBVTT\n\n")
for (timestamp, _), translation in zip(cues, translations):
f.write(f"{timestamp}\n{translation.strip()}\n\n")
生成此脚本并执行它,确保时间戳保持准确,VTT格式正确。
python3 "$ASS_SCRIPT" -o subs.ass -t --offset
第一个参数 = 原始语言VTT(卡拉OK时间在第一行)
-t = 翻译后的VTT(在卡拉OK行下显示)
--offset = 剪辑开始时间(相对于剪辑开始调整时间戳)
处理YouTube滚动字幕去重、CJK字符分割和双语布局。
获取视频和音频URL:
URLS=$(yt-dlp --get-url -f 'bv[height<=720]+ba/b[height<=720]' \
--no-playlist --no-warnings --force-ipv4 \
--extractor-args 'youtube:player-client=default,mweb' "")
VIDEO_URL=$(echo "$URLS" | head -1)
AUDIO_URL=$(echo "$URLS" | tail -1)
然后使用ffmpeg剪辑:
带字幕:-vf "ass=subs.ass" -c:v libx264 -preset fast -crf 23 -c:a aac -b:a 128k -movflags +faststart
无字幕:-c copy -avoid_negative_ts make_zero
输入查找:-ss 在每个-i之前
分离流:-map 0:v:0 -map 1:a:0
Whisper回退(无YouTube字幕)
如果yt-dlp找不到自动字幕且用户设置了GROQ_API_KEY:
下载音频:yt-dlp -f ba -x --audio-format mp3 --postprocessor-args 'ffmpeg:-ac 1 -ar 16000 -b:a 64k'
转录:POST https://api.groq.com/openai/v1/audio/transcriptions,模型=whisper-large-v3,response_format=verbose_json
将段转换为VTT
如果GROQ_API_KEY未设置,通知用户没有字幕可用,并询问如何继续(剪辑无字幕或设置密钥)。
常见问题
YouTube限速:导出cookie到文件并使用--cookies cookies.txt
ASS缺少CJK字体:brew install font-noto-sans-cjk-tc(macOS)
Groq 25MB音频限制:对于超过50分钟的视频拆分音频
流媒体URL过期约6小时:如果剪辑失败则重新解析
字幕烧录重新编码视频(约1-3分钟用于60秒剪辑)