fix(backend): #1892 画面插入按句号分句 #1905

Merged
auto-approve-bot merged 1 commits from fix/1892-sentence-split-period-only into develop 2026-09-14 18:15:38 +08:00
2 changed files with 21 additions and 5 deletions
+6 -5
View File
@@ -1,6 +1,6 @@
"""共享的句子时间戳计算工具 — 供 Celery TTS 任务和 /lipsync/tts-preview 同步接口复用.
- `_split_script_into_sentences`: 按标点分句(中英文逗号/句号/问号/感叹号/分号/换行)
- `split_script_into_sentences`: 按标点分句(中英文句号/问号/感叹号/分号/换行,不含逗号,与前端 sentences.ts 保持一致)
- `_estimate_sentence_timings_by_chars`: 按字数比例估算(静音检测失败时降级)
- `_probe_audio_duration`: ffprobe 读取音频时长
- `compute_sentence_timings`: 基于 ffmpeg silencedetect 精确计算每句起止时间
@@ -19,15 +19,16 @@ logger = logging.getLogger(__name__)
def split_script_into_sentences(script_text: str) -> list[str]:
"""按句号/问号/感叹号/分号/逗号/换行分句(与前端 SENTENCE_SPLIT_RE 一致).
"""按句号/问号/感叹号/分号/换行分句(与前端 sentences.ts 的 SENTENCE_SPLIT_RE 一致).
中文短视频文案习惯用「,」断小句(如"卖花的叫花无缺,卖姜的叫姜子牙"),
必须把逗号也纳入分隔符,否则多句文案会被识别成一整句,导致 B-roll 时间戳错位。
仅在句末标点(。!?!?;;)和换行处分句,**不再用逗号(,,)切分**。
按逗号切分会把连贯句子拆得过碎,导致 B-roll/口播画面按句插入时句数过多、
时长过短,效果不符合预期(Issue #1892)。
"""
text = (script_text or "").strip()
if not text:
return []
parts = re.split(r"[。!?!??!;;,,\n\r]+", text)
parts = re.split(r"[。!?!??!;;\n\r]+", text)
return [p.strip() for p in parts if p.strip()]
+15
View File
@@ -46,6 +46,21 @@ class TestSplitScriptIntoSentences(unittest.TestCase):
result = _split_script_into_sentences("没有标点的句子")
self.assertEqual(result, ["没有标点的句子"])
def test_chinese_comma_not_split(self):
"""Issue #1892:中文逗号「,」不应分句,保持完整小句。"""
result = _split_script_into_sentences("卖花的叫花无缺,卖姜的叫姜子牙。")
self.assertEqual(result, ["卖花的叫花无缺,卖姜的叫姜子牙"])
def test_english_comma_not_split(self):
"""Issue #1892:英文逗号「,」不应分句。"""
result = _split_script_into_sentences("Hello, how are you?")
self.assertEqual(result, ["Hello, how are you"])
def test_comma_between_sentences_kept_in_sentence(self):
"""两个句号间带逗号的长句:逗号不切,只按句号切。"""
result = _split_script_into_sentences("第一句,带逗号。第二句,也带逗号!")
self.assertEqual(result, ["第一句,带逗号", "第二句,也带逗号"])
class TestEstimateSentenceTimingsByChars(unittest.TestCase):
"""Tests for _estimate_sentence_timings_by_chars."""