Brian Gita / Work / Sauti Yo

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:

  1. Recognise: describe what's happening in ordinary words.
  2. Understand: get the matching verified rights information in plain language.
  3. Act: see practical next steps.
  4. Connect: reach a verified support organisation, with consent.
  5. Be heard: optionally say what made help hard to get. Partner organisations see the answers only in aggregate.

What I built

AreaWhat I did
Voice channelCallers 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 classificationAn 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 everywherePressing 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.
ReferralsTexting SUPPORT starts a consent step, asks for the district and creates a referral to a verified partner, shared with USSD and voice.
Chat APIHardened 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:

RuleWhy
Danger words checked firstEvery message and transcript is checked for danger words before any classification runs.
Crisis wording is fixedCrisis 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 modeWhen a less revealing reply is needed, it never names the person's situation and skips AI rewording entirely.
Fail safeIf 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.