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 real song playback, precache stories, improve LLM fallback
- content/songs/: 6 curated mp3s (tracked via Git LFS), content/songs.json
now points to them and is loaded by ContentLibrary (loader.py).
- activities.json: drop the old text-only song_* placeholders, now that
"song" intent plays real audio (mirrors the "story" pattern: the LLM
only announces, never sings/invents lyrics).
- engine.py: dedicated <nota> + no-LLM fallback for the "song" intent;
FALLBACK_REPLY now points users at the real cause (ZeroGPU limit)
instead of a vague "se me trabó la lengua"; log each failed
_generate attempt for easier diagnosis without burning extra quota.
- frontend: songs.js plays/pauses the suggested song (auto-play on
overlay open, tap to pause), wired up in app.js.
- voice/tts.py + app.py: precache all content/stories.json audio at
startup, so "Escuchar cuento" never hits a cold ~25s synthesis wait.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add panel parental, fix app.py docstring, model card, and open trace
- 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.