From 0f0138e772d619f4c82e93d8c631223eb174ceb6 Mon Sep 17 00:00:00 2001 From: Asger Geel Weirsoee Date: Tue, 20 Oct 2026 21:59:42 +0200 Subject: [PATCH] =?UTF-8?q?tts=5Fwarm:=20fest-replikkerne=20forvarmes=20og?= =?UTF-8?q?s=C3=A5=20uden=20FEST=5FVOICE=5FID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fundet i bot-røgtesten med WPP_TTS_LIVE=off: uden FEST_VOICE_ID taler et fest-spil med standardstemmen, men tts_warm lavede kun de faste fest- replikker (fest-velkomst, fest-reglerne, fest-drillerierne), når der var en fest-stemme. Så var de tavse uden live-kald. Nu laves de altid, med fest-stemmen eller standardstemmen som rummet, og uden at gentage dem, der allerede står i "faste replikker" (56 klip, 2657 tegn uden fest-stemme). Med FEST_VOICE_ID sat er intet ændret. Co-Authored-By: Claude Opus 5.5 --- party/management/commands/tts_warm.py | 14 ++++++++------ party/tests/test_tts_warm.py | 21 ++++++++++++++++----- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/party/management/commands/tts_warm.py b/party/management/commands/tts_warm.py index 1ea2755..89785d4 100644 --- a/party/management/commands/tts_warm.py +++ b/party/management/commands/tts_warm.py @@ -56,12 +56,14 @@ class Command(BaseCommand): static += TEASES static += [r["say"] for r in RULES] groups.append(("faste replikker", static, None)) - if fest: - # fest-speakeren siger "_fest", og den almindelige replik, hvor der ikke er en fest-udgave - keys = [k for k in LINES if k.endswith("_fest") or k + "_fest" not in LINES] - fest_static = [line for k in keys for line in LINES[k] if not re.search(r"\{\w+\}", line)] - fest_static += TEASES_FEST + [r["say"] for r in RULES_FEST] - groups.append(("faste fest-replikker", fest_static, fest)) + # fest-speakeren siger "_fest", og den almindelige replik, hvor der ikke er en fest-udgave; + # uden FEST_VOICE_ID med standardstemmen (som rummet), så fest-spil også har en stemme uden live-kald + keys = [k for k in LINES if k.endswith("_fest") or k + "_fest" not in LINES] + fest_static = [line for k in keys for line in LINES[k] if not re.search(r"\{\w+\}", line)] + fest_static += TEASES_FEST + [r["say"] for r in RULES_FEST] + if fest is None: # de almindelige ligger allerede i "faste replikker" + fest_static = [t for t in fest_static if t not in set(static)] + groups.append(("faste fest-replikker", fest_static, fest)) if dry_run: # i budget-køens rækkefølge: intro, generiske (hver med sin stemme), Tegn og Gæt, Fup og Fakta's faste rows = [(name, [(t, voice) for t in texts]) for name, texts, voice in groups] diff --git a/party/tests/test_tts_warm.py b/party/tests/test_tts_warm.py index f6e1c18..304eab8 100644 --- a/party/tests/test_tts_warm.py +++ b/party/tests/test_tts_warm.py @@ -11,10 +11,10 @@ from unittest import mock from django.core.management import call_command from django.test import SimpleTestCase, override_settings -from fupogfakta.engine import RULES as FOF_RULES +from fupogfakta.engine import RULES as FOF_RULES, RULES_FEST from party import games, tts from tegnoggaet.engine import RULES as TEGN_RULES -from party.narrator import LINES as FOF_LINES, TEASES, Narrator +from party.narrator import LINES as FOF_LINES, TEASES, TEASES_FEST, Narrator from party.tegn import COUNT_LINES, FIXED_LINES, LINES, THEME_LINES, TegnRoom, warm_texts from tegnoggaet.engine import Game from tegnoggaet.themes import load_themes @@ -24,13 +24,22 @@ NAMES = ("Qxa", "Zyb", "Wvc") # spillernavne og -ord, der ikke findes i rep WORDS = ("qqord", "zzgaet") -def fof_static(): +def fof_normal(): """Fup og Fakta's faste replikker, som tts_warm har lavet dem hidtil.""" out = [line for k, variants in FOF_LINES.items() if not k.endswith("_fest") for line in variants if not re.search(r"\{\w+\}", line)] return out + TEASES + [r["say"] for r in FOF_RULES] +def fof_static(): + """... og så fest-replikkerne med standardstemmen (FEST_VOICE_ID er tom her), dem der ikke allerede er med.""" + out = fof_normal() + keys = [k for k in FOF_LINES if k.endswith("_fest") or k + "_fest" not in FOF_LINES] + fest = [line for k in keys for line in FOF_LINES[k] if not re.search(r"\{\w+\}", line)] + fest += TEASES_FEST + [r["say"] for r in RULES_FEST] + return out + [t for t in fest if t not in set(out)] + + class TegnWarmTextTests(SimpleTestCase): def test_variants_are_exactly_what_line_says(self): n = Narrator(lines=LINES, rng=random.Random(1)) @@ -163,7 +172,9 @@ class TtsWarmCommandTests(SimpleTestCase): def test_without_budget_tegn_is_not_made_and_fof_is_as_before(self): calls, voices, out = self.run_cmd() self.assertEqual(calls, fof_static()) - self.assertIn(f"{len(fof_static())} af {len(fof_static())} faste replikker ligger i cachen.", out) + self.assertIn(f"{len(fof_normal())} af {len(fof_normal())} faste replikker ligger i cachen.", out) + fest = len(fof_static()) - len(fof_normal()) + self.assertIn(f"{fest} af {fest} faste fest-replikker ligger i cachen.", out) self.assertIn(f"Tegn og Gæt: {len(warm_texts())} af {len(warm_texts())} replikker mangler; de laves kun med --budget.", out) self.assertIn(f"Menuens intro-replikker: {len(INTROS)} af {len(INTROS)} replikker mangler", out) self.assertIn(f"Generiske replikker: {len(generic())} af {len(generic())} mangler", out) @@ -208,7 +219,7 @@ class TtsWarmCommandTests(SimpleTestCase): self.assertIn(f"generiske replikker: {len(g)} klip, {sum(map(len, g))} tegn", out) calls, _, out = self.run_cmd("--dry-run", "--budget", "500") self.assertEqual(calls, []) - self.assertIn(f"faste replikker: {len(fof_static())} klip", out) + self.assertIn(f"faste replikker: {len(fof_normal())} klip", out) self.assertIn("tælles ikke i --dry-run", out) @override_settings(ELEVENLABS_API_KEY="")