如何将准确转录文本与API生成的音频时间戳匹配生成SRT文件
解决方案:匹配准确转录文本与SRT时间戳生成精准字幕
实现思路
- 解析原始SRT:提取每条字幕的时间戳和对应(不准确)文本
- 预处理准确转录稿:去除冗余行、合并断句,得到干净的参考文本片段
- 文本相似度匹配:用模糊匹配算法将参考文本片段与原始SRT条目对齐,替换为准确文本
- 生成新SRT:结合原始时间戳与匹配后的准确文本,输出最终字幕文件
依赖库
先安装所需工具库:
pip install fuzzywuzzy python-Levenshtein
完整代码
import re from fuzzywuzzy import fuzz from fuzzywuzzy import process def parse_srt(srt_path): """解析SRT文件,返回字幕列表:[(序号, 开始时间, 结束时间, 文本)]""" srt_pattern = re.compile( r'(\d+)\n' r'(\d{2}:\d{2}:\d{2},\d{3}) --> (\d{2}:\d{2}:\d{2},\d{3})\n' r'(.+?)(?=\n\n|\Z)', re.DOTALL ) with open(srt_path, 'r', encoding='utf-8') as f: content = f.read() matches = srt_pattern.findall(content) return [ (int(m[0]), m[1], m[2], m[3].replace('\n', ' ').strip()) for m in matches ] def clean_transcript(transcript_path): """清理转录稿:去除空行、冗余行,按标点分句得到参考片段""" cleaned_lines = [] with open(transcript_path, 'r', encoding='utf-8') as f: for line in f: line = line.strip() # 可根据实际冗余格式调整过滤规则,比如排除特定前缀的行 if line and not line.startswith(('---', '###', '【注】')): cleaned_lines.append(line) merged_text = ' '.join(cleaned_lines) # 按常见标点分句,可根据需求调整正则 return re.split(r'(?<=[。!?.,!?])\s', merged_text) def match_subtitles(original_subs, reference_segments): """将参考文本片段与原始字幕匹配,替换为准确文本""" matched_subs = [] ref_index = 0 total_ref = len(reference_segments) for sub in original_subs: idx, start, end, original_text = sub if ref_index >= total_ref: matched_subs.append((idx, start, end, original_text)) continue # 匹配当前参考片段 best_match, score = process.extractOne(original_text, [reference_segments[ref_index]]) # 相似度阈值可根据实际情况调整 if score >= 85: matched_text = reference_segments[ref_index] ref_index += 1 else: # 尝试匹配下一个参考片段 if ref_index + 1 < total_ref: next_match, next_score = process.extractOne(original_text, [reference_segments[ref_index + 1]]) if next_score > score: matched_text = reference_segments[ref_index + 1] ref_index += 2 else: matched_text = original_text else: matched_text = original_text matched_subs.append((idx, start, end, matched_text)) # 处理剩余参考片段,简单追加到末尾(可根据需求优化时间戳) while ref_index < total_ref: last_end = matched_subs[-1][2] if matched_subs else '00:00:00,000' new_idx = len(matched_subs) + 1 matched_subs.append((new_idx, last_end, last_end, reference_segments[ref_index])) ref_index += 1 return matched_subs def write_srt(subs, output_path): """将匹配后的字幕写入SRT文件""" with open(output_path, 'w', encoding='utf-8') as f: for sub in subs: idx, start, end, text = sub f.write(f"{idx}\n") f.write(f"{start} --> {end}\n") f.write(f"{text}\n\n") if __name__ == "__main__": # 替换为你的文件路径 ORIGINAL_SRT = "original_ai.srt" ACCURATE_TRANSCRIPT = "accurate_transcript.txt" OUTPUT_SRT = "final_accurate.srt" # 执行流程 original_subs = parse_srt(ORIGINAL_SRT) reference_segments = clean_transcript(ACCURATE_TRANSCRIPT) matched_subs = match_subtitles(original_subs, reference_segments) write_srt(matched_subs, OUTPUT_SRT) print(f"已生成准确字幕文件:{OUTPUT_SRT}")
使用说明
- 调整清理规则:在
clean_transcript函数中,修改冗余行的过滤条件,适配你的转录稿格式 - 调整匹配阈值:修改
match_subtitles中的相似度阈值(score >= 85),匹配效果差时可适当降低,要求严格则提高 - 优化分句逻辑:如果转录稿的分句方式特殊,可修改
clean_transcript中的分句正则表达式 - 人工校验:模糊匹配可能存在少量误差,生成后建议重点检查专业术语、人名等关键内容
内容的提问来源于stack exchange,提问作者Catjfh Dgfh
相关产品推荐
相关产品推荐

