- Bug 1: announcedCalls usaba el ID del turno como clave, silenciando todas
las re-llamadas. Ahora usa key=codigo|destino|llamado_at, igual que
lastSeenKeys, para que cada re-llamada anuncie correctamente.
- Bug 2: anunciarTurno no verificaba sonidoActivo antes de llamar a
speechSynthesis.speak(); agregado guard al inicio de la función.
- Bug 3: Chrome congela speechSynthesis tras ~15 min sin interacción;
agregado keepalive de 14s con pause()+resume() para mantener el motor activo.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>