From 45584f97b465b7a93e9a6475ddd8454a7f50784c Mon Sep 17 00:00:00 2001 From: Bai Zihan Date: Fri, 21 Feb 2025 01:28:01 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/translation/class/srt-translator.ts | 54 +++++++++++++++---- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/electron/main/translation/class/srt-translator.ts b/electron/main/translation/class/srt-translator.ts index 0050621..f5c76c2 100644 --- a/electron/main/translation/class/srt-translator.ts +++ b/electron/main/translation/class/srt-translator.ts @@ -26,19 +26,53 @@ export class SRTTranslator extends BaseTranslator { const fragments: string[] = []; let currentFragment = ""; - content.split("\n").forEach((line) => { - const potentialFragment = currentFragment - ? `${currentFragment}\n${line}` - : line; - if (this.countTokens(potentialFragment) > maxTokens) { - fragments.push(currentFragment); - currentFragment = line; + // 将内容按 SRT 字幕块分割(两个换行符 \n\n 分隔块) + const subtitleBlocks = content.trim().split(/\n\n+/); + + for (const block of subtitleBlocks) { + if (!block.trim()) continue; // 跳过空块 + + // 确保块以序号开始(简单验证) + if (!/^\d+\n/.test(block)) { + console.warn(`Invalid SRT block detected: ${block}`); + continue; // 跳过不符合格式的块 + } + + // 计算当前块的 token 数 + const blockTokens = this.countTokens(block); + + if (blockTokens > maxTokens) { + // 如果单个块超过 maxTokens,直接作为单独的分片 + if (currentFragment) { + fragments.push(currentFragment); + currentFragment = ""; + } + fragments.push(block); } else { - currentFragment = potentialFragment; + // 检查加入当前块后是否超过 maxTokens + const potentialFragment = currentFragment + ? `${currentFragment}\n\n${block}` + : block; + const potentialTokens = this.countTokens(potentialFragment); + + if (potentialTokens > maxTokens) { + // 如果超过限制,将当前积累的内容作为一个分片,新块放入下一个分片 + if (currentFragment) { + fragments.push(currentFragment); + currentFragment = block; + } + } else { + // 未超过限制,继续积累 + currentFragment = potentialFragment; + } } - }); + } + + // 处理最后一个分片 + if (currentFragment) { + fragments.push(currentFragment); + } - if (currentFragment) fragments.push(currentFragment); return fragments; }