土耳其语字幕通道
输入视频或音频 → 输出带单词时间戳的土耳其语字幕:.srt + 带样式的 .ass + 嵌入字幕的 .mp4,以及修正报告和裁剪建议。一切均在用户电脑本地完成。
规则(不可更改)
- 保持本地。 不发布、不上传、不登录账户、不调用付费API。模型下载(Whisper模型)仅在用户同意时进行。
- 不打开浏览器。 此操作不需要浏览器;不要启动Chrome/Chromium。
- 不覆盖原文件。 输出存放到单独文件夹(默认
altyazi_cikti/);原始视频不受影响。trim --uygula也会写入新文件。 - 字幕仅显示说过的话。 字幕是转写文本;不凭空捏造内容,不以“修正”为由修改句子。仅修正拼写、大写、ASR错误,且所有修正均在报告中列出。
- 土耳其语大写始终使用
tr_upper。 Python 的str.upper()、JS 的toUpperCase()或 CSS 的text-transform: uppercase(未设置 lang="tr")会破坏土耳其语:istanbul → ISTANBUL,ilk → ILK。 - 不使用 drawtext。 字幕嵌入通过 ffmpeg 的
ass滤镜(libass)完成,或者在没有 libass 时使用 PIL 回退方案。
流程
S=~/.claude/skills/turkce-altyazi/scripts,且需要已安装 Pillow 和 numpy 的 Python(PY,参见 README 中的 venv)。
- 检查:
$PY $S/altyazi.py doctor→ 如有缺失,用一行告知用户(ffmpeg、Pillow、转写引擎)。若没有转写引擎,用户可通过--srt提供SRT。 - 一键执行:
$PY $S/altyazi.py run VIDEO.mp4 --stil kalin-vurgu --cikti altyazi_cikti/ # --stil temiz | kalin-vurgu | karaoke | hepsi # --vurgu "İstanbul,%50" 在粗体强调样式中高亮显示的单词(若未指定,则为数字和专有名词) # --oneriler-uygula 同时应用“建议”级别的修正(例如 Şeyh -> Şey) # --srt elimdeki.srt 用已有SRT代替转写 # --kelimeler x.words.json 重用之前的转写结果(快速重新应用样式) # --yakma-yok 仅输出SRT/ASS/JSON # --motor pil|ass 强制使用某字幕嵌入引擎(默认:若libass可用则用ass) # --y 0.67 字幕垂直位置(9:16 时 0.67 约在下巴下方,安全区内) - 读取报告并汇总给用户(
<ad>.rapor.txt):做了多少修正,有哪些 建议 等待确认,裁剪建议(填充词 "şey/yani/ııı"、重复、超过0.6秒的停顿),检查结果(安全区、快速阅读、重叠、土耳其语大写)。 - 视觉检查。 打开
<ad>.<stil>.onizleme.jpg(输出中的3帧)并检查:土耳其语字母是否正确,字幕是否遮挡面部/主体,是否进入下方说明文字行或右侧图标区域。若说话人头像中被字幕遮挡脸部,通过--y向下调整(最大约0.74)。 - 若需要裁剪:
$PY $S/altyazi.py trim VIDEO.mp4 --kelimeler <ad>.words.json --uygula(--guven orta还会剪掉填充词)→ 生成<ad>.kirpilmis.mp4+ 重新对齐的单词时间戳;然后执行run <ad>.kirpilmis.mp4 --kelimeler <ad>.kirpilmis.words.json。
子命令
| 命令 | 功能 |
|---|---|
doctor | 检查安装 + 土耳其语字形 + tr_upper 测试 |
transcribe IN | 生成 words.json(faster-whisper 或 whisper.cpp,修复单词时间戳) |
fix WORDS | 土耳其语大写 + ASR 修正,生成报告 |
trim IN --kelimeler W | 提出填充/停顿建议;--uygula 时执行裁剪 |
build WORDS --stil S | 生成 SRT + ASS + JSON(支持 HyperFrames/Remotion 定位) |
burn IN --kelimeler W | 嵌入字幕的MP4 |
run IN | 一键完成所有操作 |
still --kelimeler W --zaman 3.2 | 生成单帧预览PNG |
demo | 生成示例视频并为其添加字幕 |
土耳其语规则(代码中已实现)
tr_upper / tr_lower / tr_title:i↔İ,ı↔I;标题中 "ve, ile, de/da, ki, mi" 小写;保留TL, YouTube, iPhone等书写形式(data/koru.txt)。- ASR 修复:
Istanbul → İstanbul,ISKELESIYDI → İSKELESİYDİ(遵循元音和谐,不确定时不改动),Işık/Irak/Isparta予以保留(data/noktasiz_i.txt),分离后缀连写(İzmir+'e),50% → %50,句中小词的首字母大写错误(Sabah → sabah),未正确大写的地名/国名(izmir → İzmir),拼写错误(data/asr_duzeltme.tsv:herşey, birşey, tabi ki, malesef, yada...),清除 Whisper 凭空编造的内容("Altyazı M.K.", "İzlediğiniz için teşekkürler", "Abone olmayı unutmayın")。 - 分行:最多2行,宽度在安全区内;"ve/ile/bir/yüzde" 不留在行尾或单元格末尾;"de/da, ki, mi, gibi, kadar, için" 不位于行首;数字与单位不分开;下行不应比上行短。
- 时间标定:字幕块按单词时间戳开启;停顿0.3秒或句尾时开启新块;短于0.35秒的字幕块不闪烁;空音间隙最长0.25秒时字幕保持显示;超过每秒20字符时发出警告。
样式
temiz(句子布局,2行,柔和阴影)· kalin-vurgu(大写,1-3个单词,数字和专有名词黄色,小“pop”动画)· karaoke(行始终显示,正在唱的单词绿色,后续单词暗淡)。字体:Montserrat(OFL许可证,已随包提供)。未来可能会推出包含更多样式的Pro包;这三个样式免费且保持MIT许可。
故障排除
- 如果
doctor报告“libass yok”,不要担心:PIL引擎可绘制相同的布局。 - 如果单词时间戳偏移:whisper.cpp 可能过早地标记句子开头;本工具会根据语音中的说话区域自动修复。如果效果仍不理想,可尝试
--asr faster-whisper --model medium。 - 如果字幕位置不对,使用
--y调整;如果文字太大/太小,修改样式的size值,位于scripts/styles.py。