如何将多个.VTT字幕片段合并为单个.VTT字幕文件?
如何将多个.VTT字幕片段合并为单个.VTT字幕文件?
当然有办法!不用一个个手动打开复制粘贴,下面分享几个实用的自动合并方案,适配不同技术背景的需求:
方法一:命令行快速合并(适合熟悉终端的用户)
如果你的系统是Linux/macOS(Windows可以用WSL或Git Bash),可以用curl和awk工具一键完成:
- 先把所有VTT片段的URL整理成一个文本文件,比如命名为
vtt_urls.txt,每行放一个URL。 - 执行以下命令,批量下载并合并片段,自动去掉重复的VTT头部:
curl -s -K vtt_urls.txt | awk '!/^WEBVTT/ || NR==1' > merged_subtitles.vtt
curl -s -K vtt_urls.txt:静默模式下从文件读取所有URL并批量下载内容awk '!/^WEBVTT/ || NR==1':只保留第一个WEBVTT开头行,后续片段的重复头部自动跳过- 最终合并好的字幕会保存到
merged_subtitles.vtt文件中
方法二:Python脚本自定义合并(适合需要灵活调整的用户)
如果需要确保字幕片段按正确顺序排列(比如你的URL可能不是按segment编号排序的),或者要处理特殊格式,用Python脚本更可控:
import urllib.request # 替换成你的VTT片段URL列表,也可以从txt文件读取 vtt_urls = [ "https://drod24s.akamaized.net/all/clear/none/d9/5e625421a95a611504451ed9/00922001400/subtitles/Foreign_HardOfHearing-17241006-627dc540-cc6e-44dc-a003-09ea95deff85/segment_0.vtt", "https://drod24s.akamaized.net/all/clear/none/d9/5e625421a95a611504451ed9/00922001400/subtitles/Foreign_HardOfHearing-17241006-627dc540-cc6e-44dc-a003-09ea95deff85/segment_1.vtt", "https://drod24s.akamaized.net/all/clear/none/d9/5e625421a95a611504451ed9/00922001400/subtitles/Foreign_HardOfHearing-17241006-627dc540-cc6e-44dc-a003-09ea95deff85/segment_2.vtt", "https://drod24s.akamaized.net/all/clear/none/d9/5e625421a95a611504451ed9/00922001400/subtitles/Foreign_HardOfHearing-17241006-627dc540-cc6e-44dc-a003-09ea95deff85/segment_3.vtt" ] # 按segment编号排序,确保字幕顺序正确 vtt_urls.sort(key=lambda x: int(x.split("_")[-1].split(".")[0])) output_file = "merged_subtitles.vtt" with open(output_file, "w", encoding="utf-8") as f: is_first_segment = True for url in vtt_urls: try: with urllib.request.urlopen(url) as response: vtt_content = response.read().decode("utf-8") if is_first_segment: # 保留第一个片段的标准VTT头部 f.write(vtt_content + "\n") is_first_segment = False else: # 跳过后续片段的重复头部,清理空行后追加内容 lines = vtt_content.splitlines() # 过滤掉WEBVTT头部和开头的空行 content_lines = [] skip_header = True for line in lines: if skip_header: if line.startswith("WEBVTT"): continue if line.strip() == "": continue skip_header = False content_lines.append(line) f.write("\n".join(content_lines) + "\n") except Exception as e: print(f"处理URL {url} 时出错: {e}") print(f"合并完成!文件已保存为 {output_file}")
这个脚本的优势:
- 自动按segment的数字编号排序,避免字幕顺序混乱
- 自动清理片段间的空行和重复头部,保证合并后的文件符合VTT标准格式
- 自带错误提示,方便排查下载失败的片段
注意事项
- 确保你的网络可以正常访问这些VTT片段的URL,否则下载会失败
- 合并后的文件可以用普通文本编辑器打开检查,若出现时间轴重叠等问题,可能需要根据实际情况微调过滤规则
- 如果片段包含特殊字符,确保脚本或命令使用
utf-8编码读取和保存
备注:内容来源于stack exchange,提问作者bigboss




