Fix garbled replies: clear input buffer on mic on/off, guarded cancel, ask to repeat instead of guessing

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
This commit is contained in:
idriz
2026-09-02 20:13:36 +02:00
parent ab638aa690
commit dbe6ee6f28

View File

@@ -30,6 +30,8 @@ Kako odgovaraš na pitanja:
Ako dijete kaže "pojednostavi", "jednostavnije", "ne razumijem", "kao za male", "lakše": sljedeći odgovori su kraći, sa najjednostavnijim riječima, kratkim rečenicama i poređenjima iz svakodnevnog života (kuhinja, igralište, lopta, voda). Svaki sljedeći zahtjev spušta nivo dalje.
Zapamti trenutni nivo i drži ga do kraja razgovora ili dok dijete ne zatraži promjenu. Ako znaš uzrast djeteta, kreni od nivoa koji odgovara tom uzrastu.
- Ako nešto ne znaš ili nisi siguran, reci to iskreno. Ne izmišljaj brojeve ni imena.
- AKO NISI JASNO ČUO ili RAZUMIO pitanje, NE NAGAĐAJ i ne pričaj o nasumičnoj temi. Reci kratko: "Nisam te dobro čuo, možeš li ponoviti?" i sačekaj.
- Odgovaraj SAMO na ono što je dijete stvarno pitalo. Ne otvaraj nove teme koje dijete nije spomenulo i ne nabrajaj zanimljivosti koje niko nije tražio.
- Kad odgovoriš na pitanje o nekoj temi, možeš JEDNOM ponuditi: "Hoćeš da ti odštampam sažetak o tome?" Ne nudi to poslije svakog odgovora.
- Za matematiku i zadaće: ne daj samo rezultat, objasni korak po korak i pusti dijete da samo dođe do odgovora kad je moguće.
- Razgovor ne traži nikakvu potvrdu; potvrda je obavezna samo prije štampanja.
@@ -158,6 +160,14 @@ class Assistant:
ok = False
await self.notify_model(("GOTOVO. " if ok else "GREŠKA. ") + result + " Reci to djetetu kratko, na bosanskom.")
async def clear_input(self) -> None:
"""Odbaci sve što je na serveru u ulaznom baferu (nedovršeni komadići govora)."""
if self.conn:
try:
await self.conn.send({"type": "input_audio_buffer.clear"})
except Exception: # noqa: BLE001
log.exception("input_audio_buffer.clear nije uspio")
async def interrupt_speech(self) -> None:
"""Prekini govor koji je u toku (pozadinski poslovi nastavljaju)."""
speaking = self.speaker.is_playing(0.0) or self.response_active
@@ -166,7 +176,8 @@ class Assistant:
try:
await self.conn.send({"type": "response.cancel"})
except Exception: # noqa: BLE001
log.exception("response.cancel nije uspio")
pass
await self.clear_input()
if speaking:
await self.speaker.clear()
log.info("govor prekinut (mikrofon ugašen)")
@@ -223,6 +234,7 @@ class Assistant:
if not self.mic.running:
await self.mic.start()
log.info("mikrofon uključen, slušam")
await self.clear_input()
await self.speaker.write(audio.tone_on())
chunk = await self.mic.read()
if not chunk: