A newer version of the Gradio SDK is available: 6.20.0
title: Sofía — Educational Companion (Spanish)
colorFrom: blue
colorTo: pink
sdk: gradio
sdk_version: 6.18.0
python_version: '3.12'
app_file: app.py
pinned: false
license: mit
short_description: Local-first Spanish voice companion for kids
tags:
- gradio
- build-small-hackathon
- backyard ai
- backyard-ai
- off the grid
- off-the-grid
- well tuned
- well-tuned
- off brand
- off-brand
- sharing is caring
- sharing-is-caring
- field notes
- field-notes
- best use of modal
- best-use-of-modal
- modal
- zerogpu
- qwen2.5
- qlora
- conversational
- education
- spanish
- kids
- voice assistant
- voice-assistant
- text-to-speech
- speech-to-text
- track:backyard
- sponsor:modal
- achievement:offgrid
- achievement:welltuned
- achievement:offbrand
- achievement:sharing
- achievement:fieldnotes
models:
- build-small-hackathon/sofia-qwen2.5-7b
Sofía — local-first educational companion for young kids
A voice companion for a ~3-year-old: warm conversation, curated stories and songs with real audio, and learning activities (counting, colors, animals), plus a parent panel. Built for the Build Small Hackathon (track Backyard AI).
The story behind Sofía
Here's why we built this, in our own words:
My baby girl has always been curious about every single thing. From the moment she turned maybe 8 or 9 months, it was amusing how fast a learner she is. Except for walking (because it seems to be more fun rolling than using feet and legs), eating, speaking, imitating moves, jumping, potty training, sleeping — it was all "easy" for her. And imagine being working-from-home parents with a toddler in hyperspeed 24/7 :) — some days were like heaven, and other days felt like Ares was in my living room having the battle of his life. Not because of bad behavior, but because of the constant educational incentives she demanded.
When she turned 2, she started asking these amazing questions about daily life — why is the sun like that? How are forks made? Are cats and dogs siblings? That's when I had this idea of making a companion for her: to chat about this kind of topic, feed her curiosity, and also help my wife complement our homeschool activities. This is basically a tool for parents devoted to their children's learning path — for the days when we're a bit off and don't have 100% of our creativity, but we don't let ourselves give less. This stayed as an idea until Build Small Hackaton appeared.
My wife said: "I would love maths if I had this when I was a child — learning could be so much fun."
The next step is to build 3D printed little "robot" with a Raspberry Pi and a little touch screen so its not on the phone. The long term idea is that she gets an agent/robot companion for life. We would really love to keep building Sofia, give some hearts and feedback please.
Submission Snapshot
| Live Space | build-small-hackathon/sofia-educational-companion |
| Demo video | YouTube |
| Social post | X / Twitter |
| Track | Backyard AI — an educational companion for our ~3-year-old daughter |
| Fine-tuned model | build-small-hackathon/sofia-qwen2.5-7b — QLoRA on top of Qwen2.5-7B-Instruct |
| Training | QLoRA on Modal (A10G), see finetune/ |
| Open trace | trace/ — 12 end-to-end turns of the real pipeline |
| Field Notes | FIELD_NOTES.md |
TL;DR for judges
- Backyard AI: a real, specific problem — our ~3-year-old's nonstop stream of "why?" questions and activities, and the days we (working-from-home parents) can't give her 100% of our creativity. Sofía is a voice companion that chats, tells curated stories/songs, and runs small learning activities (counting, colors, animals) — to complement, never replace, parent time.
- Off the Grid (local-first): the fine-tuned
Qwen2.5-7B-Instructruns inside this Space viatransformerson dynamic ZeroGPU (@spaces.GPU). No external inference APIs at any point. - Well-Tuned (fine-tuned):
build-small-hackathon/sofia-qwen2.5-7b— a QLoRA fine-tune trained end-to-end on Modal (A10G, 72 steps, loss 2.51 → 0.14). It teaches persona, style and safety, never facts: those always come from curatedcontent/. - Off-Brand (custom UI): fully custom, voice-first, kid-friendly frontend
(
frontend/) served viagr.Server— push-to-talk, an animated character with moods, inline story/song playback. - Sharing is Caring (open trace):
trace/— 12 real end-to-end turns (intent router → curated content → safety guard → fine-tuned LLM), including a turn where the model refuses to invent a story and offers a curated one instead. - Best Use of Modal: the entire QLoRA fine-tune (dataset → training →
merge → publish) ran on Modal — see
finetune/. - Field Notes:
FIELD_NOTES.md— what we learned pivoting from llama.cpp to ZeroGPU, why a small fine-tuned model beats a bigger generic one for a 3-year-old, and the per-visitor ZeroGPU quota that nearly looked like a bug but wasn't.
Architecture idea (the most important part)
The LLM is only the conversational glue. Facts and content (stories,
songs, activities) come from content/, curated by the parents — the
model never invents them. This kills almost all hallucination, reduces the
risk of inappropriate content, and is the honest fit with the small model that
the judges reward.
frontend/ (custom kid-friendly UI, voice-first, gr.Server)
│
▼
app.py (gradio.Server / FastAPI)
├─ llm/ fine-tuned (QLoRA) Qwen2.5-7B-Instruct, transformers + ZeroGPU (@spaces.GPU)
├─ content/ source of truth (curated): stories.json, songs.json, learning.json, activities.json
├─ voice/ faster-whisper (STT, push-to-talk) + Kokoro (TTS, CPU)
├─ safety/ blocked-topic filter (input and output)
└─ parental/ activity log + memory (sqlite)
What Sofía does
- Warm conversation in Spanish, short sentences, one question per turn.
- Push-to-talk (no always-on listening yet) with an animated character that changes mood (idle / listening / thinking / playing).
- Stories (10), curated, with pre-rendered audio and inline playback.
- Songs (6), curated, with inline playback.
- Learning activities: numbers, colors and animals (
content/learning.json), plus counting and recognition (content/activities.json). - Sofía changes color on request.
- Memory of recent turns for conversational continuity.
- Parent panel (behind a gate): recent activity and structured session memory.
Merit mapping
| # | Merit | Status in Sofía |
|---|---|---|
| 1 | Off the Grid (local-first) | ✅ Fine-tuned Qwen2.5-7B-Instruct runs inside the Space via transformers + ZeroGPU (zero-a10g), no external APIs. |
| 2 | Well-Tuned (fine-tuned) | ✅ QLoRA published at build-small-hackathon/sofia-qwen2.5-7b; MODEL_ID in llm/engine.py points there. Details: finetune/MODEL_CARD.md. |
| 3 | Off-Brand (custom UI) | ✅ Custom kid-friendly frontend (frontend/), voice-first, served by gr.Server. |
| 4 | Llama Champion (llama.cpp) | |
| 5 | Sharing is Caring (open trace) | ✅ trace/ — 12 end-to-end turns of the real pipeline, with the exact prompt sent to the model at each step. |
| 6 | Field Notes | ✅ FIELD_NOTES.md. |
Bonus — Best Use of Modal: the entire QLoRA fine-tune for merit 2
(dataset, training, merge, and publishing) ran end-to-end on Modal (A10G). See
finetune/.
Running locally
pip install -r requirements.txt
python app.py # http://localhost:7860
Note: locally @spaces.GPU is a no-op, and .to("cuda") needs a real GPU with
enough VRAM for Qwen2.5-7B in bf16 (~15GB). The Space (ZeroGPU) provides 48GB
per call; on smaller local GPUs, loading the model may fail or be very slow on
CPU.
Running locally with Ollama (no large GPU)
ollama serve & # if not already running
ollama pull qwen2.5:7b # once
pip install ollama
LUMI_LLM_BACKEND=ollama python app.py
See CLAUDE.md for the full list of environment variables
(LUMI_LLM_BACKEND, LUMI_OLLAMA_MODEL, LUMI_SHARE).
Model
build-small-hackathon/sofia-qwen2.5-7b
— a QLoRA fine-tune of Qwen/Qwen2.5-7B-Instruct (merged, full weights),
trained to always stay in the "Sofía" persona, present curated content
verbatim (no paraphrasing or inventing), and refuse/redirect unsafe
topics. Runs on the Space's dynamic GPU (ZeroGPU, ~48GB VRAM per call). Full
details: finetune/MODEL_CARD.md.
Honest notes
- STT for a 3-year-old is hard: we use push-to-talk and a limited vocabulary.
- Sofía complements, never replaces, parent time. The parent panel logs activity.