Build voice apps that understand Krio
Send a voice note in Krio. Get back the intent and the values — an amount, a phone number, a medicine and its dose. When it is not sure, it asks in Krio rather than guessing, and hands you the question already spoken.
Live Demo
See voice intent detection in action
Type a Krio phrase and see what the model detects
Input (Krio or English)
Result will appear here →
This demo uses a simulated response. Sign up to call the real API →
What you get
Built for how people actually speak
Not a transcription API with intent bolted on. The parts that decide whether a voice product works — confidence, recovery, and speaking back — are the product.
Intent and values from speech
Declare what your callers can ask for and which values each request needs. A voice note comes back as an intent plus a flat set of values you can prefill a form from.
It knows when it is unsure
A confidence floor per value type. Below it, the turn becomes a question instead of a guess — which matters when the value is a phone number about to receive money.
Recovery in words you chose
Write the Krio for a value that was missed, one that was unclear, and one your own systems refuse. Hear each in the dashboard, then get it back on the response already spoken.
Several things in one breath
“Amoxicillin three times a day, and Paracetamol twice” returns one entry per thing, each judged on its own. Nobody re-dictates a whole prescription over one bad word.
Krio, and the English inside it
Our own Krio model for everyday speech. Switch to multilingual or hybrid transcription when callers say product or drug names that have to be spelled correctly.
Speaks back properly
Bind a Krio template to each outcome. Amounts read as words, phone numbers digit by digit, and phrasing rotates so the assistant does not read like a machine.
Also from kay_x
Your messages, in the language they actually read
Built for money moving across borders. One API call: send English and a destination, get back the message your customer can read — French, Portuguese, Hausa, Krio, and every language across 40+ African markets.
What your code sends
Flot: You received 50.00 SLE From: Diallo Ref: TXN_FCPTSWNNR3
What your customer gets
Flot : Vous avez reçu 50.00 SLE
De : Diallo
Réf : TXN_FCPTSWNNR3
Flot: Yu don gɛt 50.00 SLE
Frɔm: Diallo
Ref: TXN_FCPTSWNNR3
The amount, the name and the reference are never sent to a translation engine — they are lifted out and put back afterwards.
No templates to write
Send the string your code already builds — the one with the amount and the reference already in it. We work out which parts change and which parts are the message, so no call site has to move.
Repeated messages stop costing
A payment notification is the same sentence with different numbers. It is translated once, reviewed once, and every send after that is served from your own approved copy.
You read it before your customers do
Every language is shown to you before it goes live, and you can correct any of it. Machine translation is strong in French and Portuguese and weak in smaller languages — we tell you which is which rather than pretending they are equal.
The whole integration
POST /api/v1/translate/message
{
"message": "Flot: You received 50.00 SLE
From: Diallo",
"country": "SN" // or "locales": ["fr", "wo"]
}Name a country and we pick the language read there. Name languages and we use exactly those.
Integration
Set it up here. Then write very little code.
Getting a Krio voice assistant right is mostly wording and thresholds, not code. That work happens in the dashboard, where you can hear it — so your integration stays small.
01
Describe your business
Name what callers can ask for and the values each request needs. Write the Krio they hear when something is missing, unclear, or refused — and press play to check it sounds right.
02
Tune it in the Playground
Type or speak what a real caller would say and watch the transcript, the confidence on every field, and where it went wrong. Iterate until detection is boring.
03
Bind what it says back
Attach a Krio response template to each outcome, then rehearse a whole conversation — answering in pieces, refusing a value — without writing any code.
04
Then integrate
Only now do you need a key. Your app sends voice and branches on one field: next.action is done, ask, or confirm. Everything above is already configured server-side.
const fd = new FormData();
fd.append('file', voiceNote);
fd.append('business_id', 'flot');
fd.append('session_id', 'whatsapp-23276123456'); // same across turns
fd.append('message_id', waMessageId); // idempotency
const res = await fetch('https://kay.geneline-x.net/api/v1/voice/intent', {
method: 'POST',
headers: { 'X-API-Key': process.env.KAYX_KEY }, // server-side only
body: fd,
});
const { next, final_values } = await res.json();
switch (next.action) {
case 'done': return fillForm(final_values); // safe to act
case 'ask': // a value is missing
case 'confirm': await play(next.audio); // Krio, already spoken
return waitForReply(next.action);
}The voice layer for Sierra Leone's digital economy
Join builders creating the next generation of Krio-first apps.