Skip to content
Wetel
Go back

Voice notes for an AI employee: English, Malay, Chinese, and what we have not measured

Picture a colleague listening to a customer’s voicemail in a busy office. They play it, catch most of it, and write down what they heard. If the customer switched from Malay to English halfway through, a colleague who speaks both copes fine; one who only expected English might write down half a sentence. If a phone number came through muffled, a careful colleague calls back to check it rather than guessing.

That is a fair picture of what an AI employee does with a voice note. It hears the recording, turns it into text, and then answers the text the way it would answer a typed message. How well the first step goes depends on the recording, the languages in it, and the settings someone chose. This post explains each part as it works in Wetel today, for a customer-service lead in Malaysia or the region and for the developer who wires it up. It ends with what we have not measured, which matters as much as what we have built.

What happens to a voice note, step by step

A voice note becomes text first, and from then on it is handled exactly like a typed message. The workflow, the persona and the reply are the same ones you already built for text.

flowchart LR
A["Customer records<br/>a voice note"] --> B["Speech-to-text<br/>turns it into a transcript"]
B --> C["Transcript sent to the agent<br/>as a normal message"]
C --> D["Workflow runs"]
D --> E["Reply as text"]
D -. "if voice replies are on" .-> F["Reply as a voice note"]

There are two documented ways to get there.

The request your bridge sends is small. Voice notes from the common messaging apps are already in the OGG_OPUS format, so they go straight through without conversion:

{
"audioBase64": "T2dnUwACAAAAAAAAAAB...",
"audioEncoding": "OGG_OPUS",
"languageCode": "en-US"
}

The answer carries the transcript, a confidence and the languageCode. One detail trips people up: a confidence of 0 means “not reported”, not “low”. Some correct transcripts, Malay ones in particular, come back with no score. If you throw away low-confidence transcripts, only apply the threshold when confidence is above zero.

To call the speech routes without starting a conversation, use a speech token from speechToken. It belongs to your workspace and works on the speech routes only.

Which languages work today

Wetel does not keep its own list of supported languages; the speech engines’ published lists are the source of truth, and Choosing Languages and Voices links to them. What we can tell you is how English, Malay and Chinese behave, because that is where the settings matter most.

There are two speech engines, and you can pick one per request (/stt reference):

On mixed speech the docs are plain: the second engine picks one dominant language per segment and usually loses the other language’s words, while the default engine copes much better but “is not perfect either”. Hokkien and Hakka are not supported at any setting. Hokkien or Cantonese words dropped into an English or Malay sentence (the way many Malaysians speak) are handled with mixed results, and the speech guide says so.

Setting the languages for each agent

Each agent can carry its own listening languages, and every Wetel voice client reads them, so one agent hears the same languages on every channel. This has been live in production since 2026-10-01.

The documented advice, in short:

Your customersSet this
Speak one languageThat language as the primary, alternatives []
Mix English and MalayLeave the defaults
Speak ChineseA Chinese code such as cmn-Hans-CN as the primary, others as alternatives
You are not sureThe default engine, which detects the language itself

Chinese is left out of the defaults on purpose: with it included, accented English sometimes came back labelled as Mandarin, with an empty or garbled transcript. And the primary matters far more than the alternatives, so never make a secondary language the primary. A Malay-only agent, straight from the docs:

mutation {
updateAgent(
id: 12
input: {
ttsLang: "ms-MY"
sttLanguageCode: "ms-MY"
sttAlternativeLanguageCodes: []
}
) {
id
}
}

Note that these settings steer the second engine. The default engine ignores them and decides the language from the audio.

The documented limits

These limits come straight from the docs; check with us if one matters to your design.

One more rule is about safety, not size: treat a transcript as untrusted text, exactly like typed input. A recording that says “ignore your instructions” can make a speech model answer instead of transcribe, and the docs record seeing this. Whatever the transcript says, your workflow, and the person who owns it, decide what the AI employee may do.

What we have not measured

We have not measured transcription accuracy on real customer recordings, and this post claims no accuracy figure. The speech guide does publish the evaluations we ran, so you can see exactly what they are: synthetic speech (text-to-speech voices reading mixed sentences) and openly licensed public recordings, none of them spontaneous Malaysian speakers mixing Malay, English and Chinese. We could not find such a recording set, which is the gap that matters most.

So the honest position is:

What is not built yet

Phone calls are not built: an AI employee cannot receive or place a real phone call today. That, and these voice items, are on the roadmap as direction, with no dates:

What is live is the voice-note path above: record, transcribe, answer, and optionally reply with a voice note.

If your customers already send voice notes, tell us which work you’d hand over first and we will tell you honestly what works today and what you should test on your own recordings.


Share this post:

Next Post
Triage is sorting under scarcity: what support queues can steal from emergency medicine
Previous Post
What shipped, 1-8 October 2026