Files
unios-tts/tests/test_segmentation.py
Shaman 82c306ff69 init
2026-10-01 07:38:01 +03:00

104 lines
3.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from app.segmentation import (
detect_language,
extract_explicit_pauses,
prepare_segments,
split_paragraphs,
)
from app.ssml import DEFAULT_PAUSE_MS, explicit_pause_char
def test_detect_language_pure_ru():
assert detect_language("Привет мир") == "ru"
def test_detect_language_pure_en():
assert detect_language("Hello world") == "en"
def test_detect_language_single_cyrillic_letter():
assert detect_language("tshirt 1") == "en"
assert detect_language("tshirt 1 е") == "ru"
def test_detect_language_latin_with_digits():
assert detect_language("iPhone 15 Pro 24/7") == "en"
def test_ru_request_segments_uniform_and_latin_free():
segments = prepare_segments("Закажи на Ozon через Python-скрипт.")
assert segments
assert all(s.lang == "ru" for s in segments)
assert not any(any(ch.isascii() and ch.isalpha() for ch in s.text) for s in segments)
joined = " ".join(s.text for s in segments)
assert "Озон" in joined or "озон" in joined
assert "Пайтон" in joined or "пайтон" in joined
def test_en_request_not_transliterated():
segments = prepare_segments("Hello world, this is a test.")
assert segments
assert all(s.lang == "en" for s in segments)
assert any("Hello" in s.text for s in segments)
def test_ru_numbers_normalized():
segments = prepare_segments("Купи 5 штук в Shopify.")
joined = " ".join(s.text for s in segments)
assert "пять" in joined.lower()
# --- 5.3: абзацы и явные паузы ---
def test_split_paragraphs_on_blank_lines():
paras = split_paragraphs("Первый абзац.\n\nВторой абзац.\n \nТретий.")
assert paras == ["Первый абзац.", "Второй абзац.", "Третий."]
def test_paragraphs_get_distinct_para_index():
segments = prepare_segments("Первое предложение.\n\nВторой абзац тут.")
assert segments
paras = {s.para for s in segments}
assert len(paras) >= 2
assert min(paras) == 0
def test_sentences_within_paragraph_share_para():
segments = prepare_segments("Раз. Два. Три.")
assert len(segments) >= 2
assert all(s.para == 0 for s in segments)
def test_delimiter_removal_does_not_break_sentence_split():
# Удаление разделителей (без подмены запятыми) не ломает разбиение на предложения.
segments = prepare_segments("Он сказал (тихо) и ушёл. Потом сразу спал.")
assert len(segments) >= 2
joined = " ".join(s.text for s in segments)
for ch in "()":
assert ch not in joined
def test_explicit_pause_default_marker_to_single_char():
out = extract_explicit_pauses("стоп ||| продолжение")
assert "|||" not in out
assert explicit_pause_char(DEFAULT_PAUSE_MS) in out
def test_explicit_pause_timed_marker_encodes_ms():
out = extract_explicit_pauses("а |||1500 б")
assert "1500" not in out
assert explicit_pause_char(1500) in out
def test_explicit_pause_clamped_to_max():
out = extract_explicit_pauses("а |||999999 б")
assert "999999" not in out
assert explicit_pause_char(5000) in out
def test_explicit_pause_survives_prepare_segments():
segments = prepare_segments("первое |||2000 второе")
joined = "".join(s.text for s in segments)
assert "|||" not in joined
assert "2000" not in joined
assert explicit_pause_char(2000) in joined