You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将准确转录文本与API生成的音频时间戳匹配生成SRT文件

解决方案:匹配准确转录文本与SRT时间戳生成精准字幕

实现思路

  1. 解析原始SRT:提取每条字幕的时间戳和对应(不准确)文本
  2. 预处理准确转录稿:去除冗余行、合并断句,得到干净的参考文本片段
  3. 文本相似度匹配:用模糊匹配算法将参考文本片段与原始SRT条目对齐,替换为准确文本
  4. 生成新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}")

使用说明

  1. 调整清理规则:在clean_transcript函数中,修改冗余行的过滤条件,适配你的转录稿格式
  2. 调整匹配阈值:修改match_subtitles中的相似度阈值(score >= 85),匹配效果差时可适当降低,要求严格则提高
  3. 优化分句逻辑:如果转录稿的分句方式特殊,可修改clean_transcript中的分句正则表达式
  4. 人工校验:模糊匹配可能存在少量误差,生成后建议重点检查专业术语、人名等关键内容

内容的提问来源于stack exchange,提问作者Catjfh Dgfh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 20:16:04