Skip to content
Mobile App

TISM

Giving non-verbal children a real voice.

TISM website screenshot

44

Languages

22

Services

59k

Lines of Code

Challenge

Non-verbal children using AAC apps are often poorly served by tools built for English-speaking markets — generic vocabulary, no therapist integration, and no offline voice in their home language.

Solution

We built TISM from scratch in Flutter: a dual-user AAC app with a custom Afrikaans voice model, a usage-based prediction engine, and a full therapist workflow built in from the start.

FlutterFirebaseVITS/ONNXTensorFlow LiteCloud Functions

TISM is an AAC app for non-verbal children — kids with autism, apraxia, cerebral palsy, and related conditions who can't rely on speech to communicate. The app had to serve two very different users simultaneously: the child using it to communicate, and the parent or therapist supporting them. We built it in Flutter so it runs on both Android and iOS from a single codebase, with a Firebase backend handling sync, auth, and remote monitoring. The core speech module is free. It will always be free. A child's communication shouldn't depend on whether their parents can afford a subscription.

Designing for two users at once

Most AAC apps are designed around the communicator. TISM had to work for the facilitator — the parent, therapist, or educator supporting the child — just as well. These two users have completely different needs from the same app: one needs a fast, low-friction way to select vocabulary, the other needs data, lesson tools, and remote visibility.

We separated these concerns at the architecture level. The facilitator connects to a child's account via QR code scan, which scopes their access appropriately — they can monitor sessions remotely, run structured lessons, and adjust settings, but the connection model keeps the child's data protected. Remote session monitoring runs over Firebase Cloud Messaging with Firestore as the state layer, so facilitators see what's happening in close to real time without requiring a persistent socket connection.

Training a voice for Afrikaans

There was no usable off-the-shelf Afrikaans TTS for this use case. The options that existed were either too robotic for a child to respond well to, or required a network call — which ruled them out for users in low-connectivity environments. We recorded 2,731 audio samples and trained a custom voice model using VITS, then converted it to ONNX format for on-device inference.

Running inference on-device was a non-negotiable requirement once we understood the use cases. Children using AAC tools often need them most in situations where connectivity is unreliable — school, travel, clinics. A TTS that needed the internet wasn't a real option. The ONNX model runs on both Android and iOS without modification, which was part of why we chose that format over platform-specific alternatives.

Building a prediction engine that learns without getting in the way

The vocabulary grid has 170+ items organized by Fitzgerald Key color categories. For a child with motor planning challenges, scrolling through that grid to find the right word is real work. We built a bigram prediction engine that learns from usage patterns and surfaces likely next words based on what was just selected.

The design constraint was that predictions had to help without adding cognitive load. We didn't want the child to have to evaluate a long list of suggestions on every tap. The model surfaces a small number of high-confidence predictions, and it improves over time as it accumulates usage data for that specific user — not a shared model trained on other users' patterns.

Guard timing — a configurable press-and-hold delay before a vocabulary item registers — addresses a different part of the motor planning problem. Some children activate items accidentally when reaching for adjacent ones. The guard timing is adjustable per user because the right threshold varies significantly between children.

What the 51-item audit found and why we ran it

Before the app went to users, we ran a structured 51-item stability audit across both platforms. AAC apps are used in high-stakes moments — a child trying to communicate distress, a therapist running a timed lesson — so stability failures have real consequences beyond the usual bad UX.

The audit covered crash scenarios, edge cases in the prediction engine, state persistence failures, and sync issues between the child and facilitator views. Everything flagged was resolved before release. We also had the app reviewed by an autism education specialist, whose feedback shaped several decisions in the lesson structure and the SOS alert flow.

Supporting 44 languages on top of the Afrikaans voice

The app ships with 44 language translations for the interface. This wasn't an afterthought — South Africa's AAC user population speaks a wide range of home languages, and an app that only works in English or Afrikaans would exclude most of the people it was built for.

The translation layer is separate from the TTS system. Interface translation is handled through a standard localization setup; the custom voice model handles Afrikaans speech output specifically. Expanding TTS to other languages would require the same recording and training process we used for Afrikaans — that's a known scope for future development, not something we obscured.

What we shipped

Shipped on Android and iOS from a single Flutter codebase — 27 screens and 22 services across 107 Dart files.

A working Afrikaans TTS model trained from scratch, running fully on-device with no network dependency.

A dual-user architecture that gives facilitators real-time monitoring and lesson tools without compromising the communicator's experience.

51-item pre-release stability audit completed with all issues resolved, and specialist review incorporated before launch.