鱼C论坛

 找回密码
 立即注册
查看: 112|回复: 3

能否用python合并或者拆分使srt字幕里的每句话都变得完整,以句号,问号,叹号等结束?

[复制链接]
发表于 2024-4-11 11:23:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
能否用python合并或者拆分使srt字幕里的每句话都变得完整,以句号,问号,叹号等结束?

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-4-11 11:23:29 | 显示全部楼层
当合并或拆分SRT字幕文件时,我们需要注意一些细节。首先,我们需要识别每个句子的结束标点符号(句号、问号、叹号等)。其次,我们需要根据这些标点符号来合并或拆分字幕。

我们可以使用Python中的正则表达式模块(re)来完成这个任务。下面是一个实现这个功能的示例代码:

合并字幕:
  1. import re

  2. def merge_subtitles(filename):
  3.     with open(filename, 'r') as file:
  4.         subtitles = file.read()

  5.     # 使用正则表达式匹配字幕中的每个句子,并在结束标点符号处加上换行符
  6.     merged_subtitles = re.sub(r'([\.\?\!])\s', r'\1\n', subtitles)

  7.     with open('merged_subtitles.srt', 'w') as file:
  8.         file.write(merged_subtitles)

  9. merge_subtitles('original_subtitles.srt')
复制代码


拆分字幕:
  1. import re

  2. def split_subtitles(filename):
  3.     with open(filename, 'r') as file:
  4.         subtitles = file.read()

  5.     # 使用正则表达式匹配字幕中的每个句子,并在结束标点符号处加上特定的字符(例如#)
  6.     splited_subtitles = re.sub(r'([\.\?\!])', r'\1#', subtitles)

  7.     with open('splited_subtitles.srt', 'w') as file:
  8.         file.write(splited_subtitles)

  9. split_subtitles('original_subtitles.srt')
复制代码


请注意,上述代码中的`filename`参数需要替换为您的原始字幕文件的路径。合并的字幕将保存在`merged_subtitles.srt`文件中,拆分的字幕将保存在`splited_subtitles.srt`文件中。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-11 11:26:00 | 显示全部楼层
srt 字幕是带时间轴的这种字幕,不能单纯当文本行对待
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-11 11:26:20 | 显示全部楼层
blackantt 发表于 2024-04-11 11:26
srt 字幕是带时间轴的这种字幕,不能单纯当文本行对待


非常抱歉,我之前的回答确实没有考虑到SRT字幕文件带有时间轴的问题。如果您需要在保留时间轴的情况下合并或拆分SRT字幕文件,代码会稍微复杂一些。以下是一个能够合并字幕的示例代码:

  1. import re

  2. def merge_subtitles(filename):
  3.     with open(filename, 'r') as file:
  4.         subtitles = file.readlines()

  5.     merged_subtitles = []
  6.     current_subtitle = ""
  7.    
  8.     for subtitle in subtitles:
  9.         # 如果这是一个时间轴行,则直接加入到合并后的字幕中
  10.         if re.match(r'\d+:\d+:\d+,\d+ --> \d+:\d+:\d+,\d+', subtitle):
  11.             merged_subtitles.append(subtitle)
  12.         else:
  13.             # 否则将文字内容添加到当前字幕中
  14.             current_subtitle += subtitle.strip()
  15.             # 如果当前字幕以句号、问号或叹号结尾,则表示一个完整的句子,将其加入到合并后的字幕中并清空当前字幕
  16.             if re.search(r'[。?!]$', current_subtitle):
  17.                 merged_subtitles.append(current_subtitle)
  18.                 current_subtitle = ""
  19.    
  20.     with open('merged_subtitles.srt', 'w') as file:
  21.         file.writelines(merged_subtitles)

  22. merge_subtitles('original_subtitles.srt')
复制代码


请注意,上述代码中的`filename`参数仍然需要替换为您的原始字幕文件的路径。合并的字幕将保存在`merged_subtitles.srt`文件中,并保留原始的时间轴信息。

对于拆分字幕,因为涉及到时间轴的调整,所以稍显复杂。您可以考虑使用第三方库来处理这个任务,例如`pysrt`库。您可以使用`pip`来安装它:

  1. pip install pysrt
复制代码


然后,可以使用以下示例代码来拆分字幕:

  1. import pysrt

  2. def split_subtitles(filename):
  3.     subs = pysrt.open(filename)
  4.    
  5.     splited_subs = []
  6.    
  7.     for sub in subs:
  8.         # 拆分每个字幕的文本内容
  9.         sentences = re.split(r'[。?!]', sub.text)
  10.         
  11.         # 对于每个拆分出来的句子,重新创建一个字幕对象,并复制时间轴信息
  12.         start_time = sub.start.to_time()
  13.         end_time = sub.end.to_time()
  14.         for sentence in sentences:
  15.             new_sub = pysrt.SubRipItem()
  16.             new_sub.text = sentence.strip() + '.'
  17.             new_sub.start.seconds = start_time.total_seconds()
  18.             new_sub.end.seconds = end_time.total_seconds()
  19.             splited_subs.append(new_sub)
  20.    
  21.     # 保存拆分后的字幕
  22.     pysrt.save('splited_subtitles.srt', splited_subs)

  23. split_subtitles('original_subtitles.srt')
复制代码


同样,上述代码中的`filename`参数需要替换为您的原始字幕文件的路径。拆分的字幕将保存在`splited_subtitles.srt`文件中,并保留原始的时间轴信息。请确保安装了`pysrt`库才能运行上述代码。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-30 23:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表