import json import random import pandas as pd import re from datetime import timedelta from pathlib import Path # === Загрузка шаблонов === def load_templates_json(templates_dir, emotion): path = Path(templates_dir) / f"{emotion}.json" if not path.exists(): raise FileNotFoundError(f"Шаблон для эмоции '{emotion}' не найден: {path}") with open(path, "r", encoding="utf-8") as f: return json.load(f) # === Генерация текстов с учётом seed и антидубликатов === def generate_emotion_batch(n, template_data, seed=None): if seed is not None: random.seed(seed) subjects = template_data["subjects"] verbs = template_data["verbs"] contexts = template_data["contexts"] interjections = template_data.get("interjections", [""]) templates = template_data["templates"] # Допустимые звуковые метки DIA‑TTS dia_tags = { "(laughs)", "(clears throat)", "(sighs)", "(gasps)", "(coughs)", "(singing)", "(sings)", "(mumbles)", "(beep)", "(groans)", "(sniffs)", "(claps)", "(screams)", "(inhales)", "(exhales)", "(applause)", "(burps)", "(humming)", "(sneezes)", "(chuckle)", "(whistles)" } def has_tag(text): return any(tag in text for tag in dia_tags) def remove_tags(text): for tag in dia_tags: text = text.replace(tag, "") return text.strip() phrases, attempts = set(), 0 max_attempts = n * 50 while len(phrases) < n and attempts < max_attempts: s, v = random.choice(subjects), random.choice(verbs) c, i = random.choice(contexts), random.choice(interjections) t = random.choice(templates) # ▸ Разрешаем максимум одну звуковую метку на фразу if has_tag(i) and has_tag(c): if random.random() < .5: c = remove_tags(c) else: i = remove_tags(i) phrase = t.format(s=s, v=v, c=c, i=i) # --- Очистка без разрушения многоточий --------------------------- # 1) убрать пробелы перед знаками пунктуации phrase = re.sub(r"\s+([,.!?])", r"\1", phrase) # 2) превратить двойную точку, КОТОРАЯ не часть троеточия, в одну phrase = re.sub(r"(?