Python应用:邪恶力量字幕线性增量偏移的修正

      
     就是用昨天写的模块作为辅助,通过影片最后的一句话的时间位置和对应的字幕位置,计算偏移比例。然后对每一个时间按这个比例因子修正。开始部分也许显得快那么一点点,不过整体效果很理想


[color="#808080"]# adjust-subtitles.py
[color="#808080"]# encoding:gb2312
[color="#808080"]# 开始基本一致.延迟时间逐渐增长
[color="#808080"]# 假设为线性增长.
[color="#808080"]# 时间偏移起始位置(基准时刻)
[color="#808080"]# 取得采样时间戳(采样目标时间40:20~采样字幕时间41:55),采样时间离基准时间越长越精确
[color="#808080"]# 修正比例因子: (采样x字幕时间-基准时刻)/(采样x目标时间-基准时刻) 取平均值
[color="#0000ff"]import [color="#000080"]re[color="#000000"],[color="#000080"]os[color="#000000"],[color="#000080"]sys
[color="#0000ff"]import [color="#000000"]timeItv
[color="#808080"]# 取得调整因子
[color="#0000ff"]def [color="#000000"]getAdjustFactor ((t,s),b):
    [color="#000000"]mt[color="#008000"]=[color="#000080"]re[color="#008000"].[color="#000000"]match(p,t)
    [color="#000000"]mr[color="#008000"]=[color="#000080"]re[color="#008000"].[color="#000000"]match(p,s)
   
    [color="#0000ff"]if [color="#000000"]mt [color="#0000ff"]and [color="#000000"]mr:
            [color="#0000ff"]return [color="#000000"](timeItv[color="#008000"].[color="#000000"]time2itv(s)[color="#008000"]-[color="#000000"]b)[color="#008000"]*[color="#000000"]1[color="#008000"].[color="#000000"]0[color="#008000"]/[color="#000000"](timeItv[color="#008000"].[color="#000000"]time2itv(t)[color="#008000"]-[color="#000000"]b)
    [color="#0000ff"]else[color="#000000"]:
                [color="#0000ff"]print [color="#64a2e6"]"check the sample time format"
                [color="#000080"]sys[color="#008000"].exit[color="#000000"]()
[color="#808080"]# 对时刻的调整
[color="#0000ff"]def [color="#000000"]adjustTime(_t,_b,_f):
        [color="#000000"]a[color="#008000"]=[color="#000000"]([color="#64a2e6"]"%2.3f" [color="#008000"]%[color="#000000"](_b[color="#008000"]+[color="#000000"](timeItv[color="#008000"].[color="#000000"]time2itv(_t)[color="#008000"]-[color="#000000"]_b)[color="#008000"]/[color="#000000"]_f))[color="#008000"].[color="#000000"]split([color="#78ade9"]'.'[color="#000000"])
        [color="#0000ff"]return [color="#000000"]timeItv[color="#008000"].[color="#000000"]itv2time([color="#808000"]int[color="#000000"](a[0]))[color="#008000"]+[color="#78ade9"]','[color="#008000"]+[color="#000000"]a[1]
[color="#0000ff"]if [color="#008000"]__name__==[color="#64a2e6"]"__main__"[color="#000000"]:
        [color="#808080"]# 输入参数设定及格式检查
        [color="#000000"]sBaseTime[color="#008000"]=[color="#64a2e6"]"00:00:00"
        [color="#000000"]aOffsetSample[color="#008000"]=[color="#000000"][([color="#64a2e6"]"00:40:19"[color="#000000"],[color="#64a2e6"]"00:41:55"[color="#000000"])]
        [color="#000000"]p[color="#008000"]=[color="#000000"]r[color="#64a2e6"]"^([0-9]+):([0-5][0-9]):([0-5][0-9])$"
        [color="#000000"]pc[color="#008000"]=[color="#000080"]re[color="#008000"].[color="#808000"]compile[color="#000000"](p)
       
        [color="#0000ff"]if not [color="#000000"]pc[color="#008000"].[color="#000000"]match(sBaseTime):
                [color="#0000ff"]print [color="#64a2e6"]"sBaseTime should have format hh:mm:ss"
                [color="#000080"]sys[color="#008000"].exit[color="#000000"]()
        [color="#0000ff"]else[color="#000000"]:
                [color="#000000"]iBaseTime[color="#008000"]=[color="#000000"]timeItv[color="#008000"].[color="#000000"]time2itv(sBaseTime)
        [color="#808080"]# 计算偏差因子
        [color="#000000"]iAdjustFactor[color="#008000"]=[color="#000000"]sum([color="#808000"]map[color="#000000"](getAdjustFactor,aOffsetSample,[iBaseTime][color="#008000"]*[color="#808000"]len[color="#000000"](aOffsetSample)))[color="#008000"]/[color="#808000"]len[color="#000000"](aOffsetSample)
        [color="#808080"]# 读入源字幕文件
        [color="#000000"]fo[color="#008000"]=[color="#808000"]file[color="#000000"](r[color="#64a2e6"]"F:\字幕\邪恶力量\supernatural.103.hdtv-lol.chs.srt"[color="#000000"],[color="#64a2e6"]"r"[color="#000000"])
        [color="#000000"]aContent[color="#008000"]=[color="#000000"]fo[color="#008000"].[color="#000000"]readlines()
        [color="#000000"]fo[color="#008000"].[color="#000000"]close()
        [color="#808080"]# 分行分析,处理字幕行,保留非字幕行
        [color="#000000"]p[color="#008000"]=[color="#000000"]r[color="#78ade9"]'(\d\d:\d\d:\d\d),\d{3}( --> )(\d\d:\d\d:\d\d),\d{3}'
        [color="#000000"]pc[color="#008000"]=[color="#000080"]re[color="#008000"].[color="#808000"]compile[color="#000000"](p)
        [color="#000000"]aContentTgt[color="#008000"]=[color="#000000"][]
        [color="#0000ff"]for [color="#000000"]ln [color="#0000ff"]in [color="#000000"]aContent:
                [color="#000000"]m[color="#008000"]=[color="#000080"]re[color="#008000"].[color="#000000"]search(p,ln)
                [color="#0000ff"]if [color="#000000"]m:
                        [color="#000000"]t1,middle,t2[color="#008000"]=[color="#000000"]m[color="#008000"].[color="#000000"]group(1,2,3)
                        [color="#0000ff"]if [color="#000000"]t1[color="#008000"]