
Proyecto IA Monterroso (XXIII): PINSAPA aprende a hablar (y a callarse)
Después del progreso por dispositivo, tocaba divertirse otra vez — pero esta vez sin ninguna idea de partida. “Piensa una cosa más, extraordinariamente divertida, no se me ocurre nada” fue literalmente el encargo. Así que, en vez de otra variación de los modos de juego ya hechos (repaso, pistas), esta vez el cambio es de otro tipo por completo: no un juego más basado en texto, sino la primera vez que PINSAPA usa otro sentido.
La idea: que PINSAPA hable
Un botón junto a cada respuesta que la lee en voz alta. Con el navegador ya trae de serie una síntesis de voz (speechSynthesis, parte del Web Speech API) no hacía falta ni una librería nueva ni tocar el servidor para nada: todo el cambio vive en el HTML/JS que ya sirve main.py.
La otra mitad de la idea, descartada con motivo
Un asistente que habla pide, por simetría, un asistente al que se le pueda hablar. Antes de añadir nada en esa dirección, tocaba comprobarlo — y ahí salió el motivo real para no hacerlo, no una intuición: el reconocimiento de voz de Chrome (SpeechRecognition), por defecto, manda la grabación de audio a los servidores de Google para transcribirla. Está confirmado en la documentación oficial (MDN lo dice explícitamente) y en varias fuentes técnicas más. Eso es justo lo que este proyecto no da por hecho que se pueda hacer con datos de menores sin decidirlo de forma explícita — una grabación de voz es un dato más sensible que un texto escrito.
Existe una versión más nueva de reconocimiento “en el propio dispositivo” en Chrome (sin mandar nada a ningún servidor), pero no está garantizada en cualquier versión de Chrome o Windows todavía — no es una base fiable hoy, solo probable/experimental. Así que PINSAPA habla, pero (por ahora) no escucha. La síntesis de voz es distinta y de mucho menor riesgo: en el peor caso, si el sistema usa una voz de red en vez de una local, lo único que viaja es el texto de la respuesta — que ya está visible en la pantalla, no una grabación nueva de nadie.
El código
Un botón por respuesta, añadido justo cuando el texto ya está completo (no antes, para no chocar con el efecto de “escritura en directo” que ya tenía el streaming):
function agregarBotonEscuchar(burbuja, texto) {
if (!('speechSynthesis' in window)) return; // navegador sin esta API: no se ofrece el boton
const boton = document.createElement('button');
boton.type = 'button';
boton.className = 'boton_escuchar';
boton.textContent = '🔊';
boton.title = 'Escuchar esta respuesta';
...
burbuja.appendChild(boton);
}
El fallo real, encontrado en el primer uso
La primera versión solo sabía empezar a hablar, no parar — José Luis lo detectó enseguida: “no se puede parar una vez inicia”. El mismo botón ahora hace las dos cosas: mientras PINSAPA está hablando se convierte en ⏹️, y si se pulsa otra vez, para en el sitio.
boton.onclick = () => {
if (hablandoAhoraMismo) {
window.speechSynthesis.cancel();
volverAEstadoInicial();
return;
}
window.speechSynthesis.cancel(); // corta cualquier otra lectura en marcha primero
const voz = new SpeechSynthesisUtterance(texto);
voz.lang = 'es-ES';
voz.onstart = () => { hablandoAhoraMismo = true; boton.textContent = '⏹️'; boton.title = 'Detener'; };
voz.onend = volverAEstadoInicial;
voz.onerror = volverAEstadoInicial; // p.ej. si se cancela desde otra burbuja
window.speechSynthesis.speak(voz);
};
Cómo se comprobó
Esta vez no hay pruebas automatizadas que contar: es JavaScript de interfaz, no lógica de servidor, así que la verificación fue revisar a mano, línea a línea, que ningún otro punto del código sigue tocando el textContent de la burbuja después de añadir el botón (si lo hiciera, lo borraría sin querer — ya pasó con otro detalle parecido en esta misma interfaz). Confirmado por José Luis en ROCKY: funciona perfecto, incluido el botón de parar tras la corrección.
Instalación
Solo cambios en main.py (la parte de interfaz). Sin dependencias nuevas — speechSynthesis viene con el navegador. Reiniciar la API para cargar la página actualizada.
Cómo comprobarlo
Pedir cualquier respuesta, esperar a que termine de escribirse, y pulsar el 🔊 que aparece junto a ella. Debería leerla en voz alta con la voz en español del propio ordenador, y convertirse en ⏹️ mientras habla — pulsarlo otra vez la corta al momento.
Qué queda pendiente
La entrada de voz (hablarle a PINSAPA en vez de escribirle) queda aparcada, no descartada para siempre: si el reconocimiento de voz “en el propio dispositivo” de Chrome se vuelve fiable de forma amplia (no solo en versiones muy recientes), es el momento de retomarlo sin el problema de privacidad de hoy. Tampoco hay todavía forma de elegir voz o velocidad de lectura — se usa la voz en español por defecto del sistema, sin más ajustes.





