Files
LandPPT/tests/test_narration_service_alignment.py
T
sligter 6153e56441 feat: modularize services and expand platform workflows
Add OAuth, community, credits, startup, export, and narration workflows while splitting oversized route and PPT service modules into dedicated components with broader regression coverage.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-13 21:04:37 +08:00

62 lines
2.1 KiB
Python

import os
import json
import pytest
os.environ["DEBUG"] = "false"
def test_parse_silence_spans_and_speech_window():
from landppt.services.narration_service import _derive_speech_window_ms, _parse_silence_spans_ms
stderr = """
[silencedetect @ 0x1] silence_start: 0
[silencedetect @ 0x1] silence_end: 0.18 | silence_duration: 0.18
[silencedetect @ 0x1] silence_start: 1.30
[silencedetect @ 0x1] silence_end: 1.50 | silence_duration: 0.20
[silencedetect @ 0x1] silence_start: 2.90
[silencedetect @ 0x1] silence_end: 3.20 | silence_duration: 0.30
"""
spans = _parse_silence_spans_ms(stderr)
assert spans == [(0, 180), (1300, 1500), (2900, 3200)]
assert _derive_speech_window_ms(3200, spans) == (180, 2900)
def test_extract_cue_payload_version_defaults_for_legacy_payload():
from landppt.services.narration_service import _extract_cue_payload_version
assert _extract_cue_payload_version(None) == 0
assert _extract_cue_payload_version('[{"start_ms":0,"end_ms":1000,"text":"legacy"}]') == 1
assert _extract_cue_payload_version('[{"__lp_cue_version":2},{"start_ms":10,"end_ms":20,"text":"ok"}]') == 2
@pytest.mark.asyncio
async def test_build_cues_json_for_audio_trims_edge_silence(monkeypatch):
from landppt.services.narration_service import build_cues_json_for_audio
async def fake_detect_silence_spans_ms(_audio_path: str):
return [(0, 180), (1300, 1500), (2900, 3200)]
monkeypatch.setattr(
"landppt.services.narration_service.detect_silence_spans_ms",
fake_detect_silence_spans_ms,
)
raw = await build_cues_json_for_audio(
text="第一句。第二句。",
audio_path="dummy.mp3",
duration_ms=3200,
)
payload = json.loads(raw)
meta = payload[0]
cues = [item for item in payload if item.get("text")]
assert meta["__lp_cue_version"] == 2
assert meta["speech_start_ms"] == 180
assert meta["speech_end_ms"] == 2900
assert len(cues) == 2
assert cues[0]["start_ms"] == 180
assert cues[0]["end_ms"] == 1400
assert cues[1]["start_ms"] == 1400
assert cues[1]["end_ms"] == 2900