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

如何基于日文逗号拆分长SRT字幕行适配MPV播放?

解决日文SRT长句在MPV中无法自动换行的脚本方案

问题背景

我将整本书转制为SRT字幕配合有声书在MPV播放,由于日文没有单词空格,MPV不会自动给长句换行,只会缩小字体适配单行。尝试Subtitle Edit工具但对日文无效,自行编写脚本时卡在如何在包含多个日文逗号「、」的长句中选择中间位置的逗号进行拆分。

当前代码片段

with open("test.txt", encoding="utf8") as file:
    for line in file:
       #print(line)
       size = len(line)
       if size > 45:
           #break sentence in half, using Japanese comma 、

测试用SRT文本

10
00:00:55,640 --> 00:01:09,580
クラスで一番、明るくて、優しくて、運動神経がよくて、しかも、頭もよくて、みんなその子と友達になりたがる。

11
00:01:11,090 --> 00:01:24,500
だけどその子は、たくさんいるクラスメートの中に私がいることに気づいて、その顔にお日様みたいな眩しく、優しい微笑みをふわーっと浮かべる。

12
00:01:24,730 --> 00:01:32,250
私に近づき、「こころちゃん、ひさしぶり!」

13
00:01:32,910 --> 00:01:35,180
と挨拶をする。

14
00:01:37,450 --> 00:01:41,730
周りの子がみんな息を吞む中、「前から知ってるの。

15
00:01:42,000 --> 00:01:42,820
ね?」

16
00:01:43,820 --> 00:01:46,550
と私に目配せをする。

解决方案

核心思路

  1. 遍历SRT文件时,区分序号、时间轴、空行和字幕文本行,只处理字幕行
  2. 对长度超标的字幕行,提取所有「、」的索引位置
  3. 计算中间位置的逗号(取总逗号数的一半位置),以此为分割点拆分句子
  4. 拆分后保持SRT原有结构,不破坏序号和时间轴

完整脚本代码

def split_japanese_subtitle(input_path, output_path, max_length=45):
    with open(input_path, 'r', encoding='utf8') as infile, open(output_path, 'w', encoding='utf8') as outfile:
        for line in infile:
            line = line.strip('\n')  # 保留换行外的原始格式
            # 跳过序号、时间轴、空行,直接写入
            if line.isdigit() or '-->' in line or line == '':
                outfile.write(line + '\n')
                continue
            
            # 处理字幕文本行
            if len(line) <= max_length:
                outfile.write(line + '\n')
                continue
            
            # 找到所有日文逗号的位置
            comma_positions = [i for i, char in enumerate(line) if char == '、']
            if not comma_positions:
                # 没有逗号的话,直接在字符中间位置拆分
                split_idx = len(line) // 2
                outfile.write(line[:split_idx] + '\n' + line[split_idx:] + '\n')
                continue
            
            # 找到中间位置的逗号,在逗号后拆分避免逗号单独成行
            middle_idx = len(comma_positions) // 2
            split_pos = comma_positions[middle_idx] + 1
            
            # 拆分并写入文件
            outfile.write(line[:split_pos] + '\n' + line[split_pos:] + '\n')

# 调用示例
split_japanese_subtitle("test.txt", "output.srt")

处理效果

以测试文本中的第10条字幕为例,原句拆分后变为:

クラスで一番、明るくて、優しくて、運動神経がよくて、
しかも、頭もよくて、みんなその子と友達になりたがる。

第11条原句拆分后变为:

だけどその子は、たくさんいるクラスメートの中に私がいることに気づいて、
その顔にお日様みたいな眩しく、優しい微笑みをふわーっと浮かべる。

拆分后的字幕在MPV中会自动换行,无需缩小字体,更适合语言学习观看。

内容的提问来源于stack exchange,提问作者Mrsha Solstice

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:37:42