Africa's Talking Women in Tech Hackathon 2026 · Team project · Open source
Sauti Yo
Helps people in Uganda recognise when an everyday problem involves their rights, understand it in plain language and act on it, over USSD, SMS, voice, web or chat.
- Role
- Lead contributor
- My commits
- 146 of 249
- Channels
- 5
- Tests (team)
- 440
The problem
Someone facing domestic violence, child abuse, an unfair dismissal or a land dispute may not know the law is on their side, or what to do about it. Legal information is hard to find and written in legal language. And in Uganda, a smartphone, mobile data or a reliable connection can't be assumed.
Sauti Yo, built for the Legal & Policy Advocacy track, takes a person from their situation to verified rights information, practical next steps and a trusted organisation, on whatever phone they have.
How it works
One shared engine sits behind every channel, so guidance is the same whether someone dials a USSD code, sends a text, calls or uses the web:
- Recognise: describe what's happening in ordinary words.
- Understand: get the matching verified rights information in plain language.
- Act: see practical next steps.
- Connect: reach a verified support organisation, with consent.
- Be heard: optionally say what made help hard to get. Partner organisations see the answers only in aggregate.
What I built
| Area | What I did |
|---|---|
| Voice channel | Callers describe the problem in their own words. The recording is transcribed with Whisper, routed to a situation and answered in speech, followed by a keypad menu. A small state machine carries each call across the several web requests it takes. Callers can also be connected straight to a support number. |
| AI classification | An AI fallback for texts the keyword matcher can't place, hardened against retries, silent failures and test traffic reaching the real API. |
| Safety check-in | "Are you safe?" for high-risk situations over SMS and voice, with neutral wording and a follow-up window. |
| Exit everywhere | Pressing 0 now ends a USSD session from any screen, not just the main menu, within the screen-length limits of a feature phone. A Quick Exit button on every public web page does the same. |
| Referrals | Texting SUPPORT starts a consent step, asks for the district and creates a referral to a verified partner, shared with USSD and voice. |
| Chat API | Hardened against malformed input and rate limited. |
Keeping AI away from what matters
AI makes replies warmer and handles messages the keyword matcher can't place. But in a crisis, a wrong word or a wrong phone number can put someone at risk. So the rules are strict:
| Rule | Why |
|---|---|
| Danger words checked first | Every message and transcript is checked for danger words before any classification runs. |
| Crisis wording is fixed | Crisis replies come from one reviewed template and are never generated or reworded by AI. |
| Keypad for "are you safe?" | On a call, the answer is a key press, never parsed from speech. It's the one decision where a misheard word is dangerous. |
| Discreet mode | When a less revealing reply is needed, it never names the person's situation and skips AI rewording entirely. |
| Fail safe | If AI is unavailable or slow, the verified original reply is sent instead. |
Rewording that can't change a phone number
When AI rewords a verified reply, the numbers in it must come back exactly as they went in. If one is dropped, changed or invented, the rewording is thrown away:
phone_numbers = re.findall(r"\d{3,}", template_text)
# ... ask the model to reword, with a 5-second timeout ...
if set(re.findall(r"\d{3,}", reworded)) != set(phone_numbers):
logger.warning("Reworded reply altered a phone number, discarding")
return None # caller sends the verified original
Where it stands
USSD and SMS were tested end to end in the Africa's Talking sandbox. Voice is integrated and tested, but it's English-only and not yet validated for production. The verified legal content currently centres on the Constitution of Uganda, stored as structured provisions with their source. Other laws are meant to be added only after they've been checked.