tts_warm: fest-replikkerne forvarmes også uden FEST_VOICE_ID

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 <noreply@anthropic.com>
This commit is contained in:
agw
2026-10-20 21:59:42 +02:00
co-authored by Claude Opus 5.5
parent 33849186ba
commit 0f0138e772
2 changed files with 24 additions and 11 deletions
+8 -6
View File
@@ -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 "<begivenhed>_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 "<begivenhed>_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]
+16 -5
View File
@@ -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="")