La nena se confundía con la pantalla overlay de canciones/cuentos y
terminaba cerrando la app para salir. Ahora Sofía reproduce la canción
o el cuento directo en su pantalla apenas termina de hablar, y el botón
de micrófono se transforma en un control de "terminar" (mood "playing":
ícono de stop, halo dorado pulsante) — un solo toque corta el audio y
vuelve a la charla.
- Elimina overlay-canciones/overlay-cuentos y songs.js/stories.js (la
grilla de exploración queda para una sección de padres más adelante)
- sofia.js: nuevas playSong()/playStory()/stopMedia() y mood "playing"
- engine.py: Sofía anuncia la canción/cuento sin pedir que toquen nada
- app.py: LUMI_SHARE=1 habilita link público temporal (*.gradio.live)
Add Sofia color-change, Cuentos frontend section, Ollama local backend
- content/colors.json + content/loader.py: paleta curada para "Sofía,
cambiate a <color>"; llm/engine.py detecta la intención sofia_color y
presenta el <contenido> curado, frontend/static/sofia.js aplica la
paleta a las variables CSS de Sofía.
- frontend: nueva sección "Cuentos" (frontend/static/stories.js,
content/stories.json, index.html, style.css) junto con ajustes en
activities.js, app.js, songs.js.
- llm/engine.py: bloques <nota> para saludo y presentación de cuentos,
backend alternativo vía Ollama (LUMI_LLM_BACKEND=ollama) para correr
local sin GPU grande, documentado en CLAUDE.md/requirements.txt.
- voice/tts.py: silencio inicial en el audio para que parlantes
Bluetooth no se coman las primeras sílabas.
- parental/store.py: quita líneas de fase/nombre de memory_block.
Rework frontend UI, add Actividades and Canciones sections
- Rebuild frontend (Sofia design): 3-tab app (Hablar/Actividades/Canciones)
with mood-based character animation, served via new /static and /content
static mounts.
- Actividades: "¿Qué forma es esta?" shape-recognition game, answerable by
touch or voice, content sourced from content/shapes.json.
- Canciones: song grid driven by content/songs.json, gracefully marks
tracks "Próximamente" until their mp3s are added to content/songs/.
- Tighten safety/guard.py to use word-boundary matching against
safety/blocklist.txt (avoids false positives like "arma" in "farmacia"),
and expand blocklist with plural/feminine variants.