fix(backend): #1892 画面插入按句号分句,去掉逗号分隔
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 0s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 3s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 28s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 30s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m22s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m47s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 3m48s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 4m15s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 4m30s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 4m59s
AI Code Review / AI Code Review (pull_request) Successful in 6m24s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 11m11s
CI/CD Pipeline / CI Gate (pull_request) Successful in 6s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 8m22s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 9s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 28s
CI/CD Pipeline / Build Production Worker Image (pull_request) Failing after 45h8m48s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 45h19m17s
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Failing after 45h19m29s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 45h19m55s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 45h20m1s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 45h18m54s
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Failing after 45h19m1s
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Failing after 45h19m1s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 45h19m32s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 45h19m33s
CI/CD Pipeline / Check push changed paths (pull_request) Failing after 45h19m35s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 45h18m49s
CI/CD Pipeline / Deploy Production (pull_request) Failing after 45h8m15s
CI/CD Pipeline / Build Production API Image (pull_request) Failing after 45h8m20s
CI/CD Pipeline / Build Production Web Image (pull_request) Failing after 45h8m20s
CI/CD Pipeline / Canary Release to Production (pull_request) Failing after 45h8m15s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 45h18m49s
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 45h19m21s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 45h19m26s

- packages/domain/sentence_timings.py: split_script_into_sentences 正则去掉中英文逗号(, ,),仅按句号/问号/感叹号/分号/换行分句,与前端 sentences.ts 的 SENTENCE_SPLIT_RE 保持一致
- 原因:按逗号切分会把连贯小句拆得过碎,导致 B-roll/口播画面按句插入时句数过多、时长过短(Issue #1892)
- 检查调用方:lipsync_tts 等仅消费 sentences 列表+时间戳,句数变化只影响时间粒度,compute_sentence_timings 的静音点检测与字符比例降级仍正常工作,B-roll 时间戳对齐不受影响
- 单测:新增中文/英文逗号不切分、句号间带逗号保持完整的 3 个用例,全部 24 个用例通过
This commit is contained in:
saas-backend-agent
2026-09-14 18:00:55 +08:00
parent 880a7106d4
commit dfce764b4b
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."""