Fix AI Agent Pronunciation of Australian Names - Zian AI

Fix AI Agent Pronunciation of Australian Names

Zero of the 43 Australian suburb and town names we tested appear in CMUdict, the 126,052-entry pronouncing dictionary English speech tooling falls back to, and only 2 appear in the 61,061-entry Montreal Forced Aligner english_us_mfa v3.1.0 dictionary. Sixteen of sixteen control names scored in both. Fix it in the lexicon layer first.

The question people actually type is how do I stop my agent mispronouncing our company name and Australian place names, and it has four possible answers sitting in four different layers of the stack. Choosing the wrong layer is why a correct phoneme string can be loaded, referenced, and still do nothing on a live call. This page is the output side of the problem — the agent saying a name wrongly to a caller. For the input side, where the recogniser mishears the caller saying it, see our companion page on Australian accent accuracy and word error rate in voice agents.

How do I stop my agent mispronouncing our company name and Australian place names?

There are exactly four places you can intervene, and they are worth naming because vendors document one each and stop:

  1. The lexicon layer. A stored dictionary of graphemes mapped to phonemes, referenced by ID at synthesis time. ElevenLabs and Azure AI Speech both use W3C Pronunciation Lexicon Specification (PLS) 1.0 XML for this. Cartesia and Vapi use their own JSON shapes.
  2. The inline phoneme layer. Phonetics embedded in the text of a single utterance — SSML <phoneme> in Azure and Google Cloud Text-to-Speech, double angle brackets in Cartesia, an escaped JSON object in Deepgram Aura-2.
  3. The text transform layer. Your agent framework rewrites the string before it reaches the TTS at all. This is LiveKit tts_text_transforms and Pipecat replace_text.
  4. The respelling layer. You give up on phonetics and write ca-NOWN-dra into the text, letting the model read it as if it were an ordinary English word.

Climb that ladder in order and stop at the first rung that holds. The reason to start at the top is durability: a lexicon entry is versioned, auditable and shared across every agent, whereas a respelling lives inside one prompt and rots silently the day someone edits that prompt.

Day one: build the name list before you write a single phoneme

The first action is not technical. Open a spreadsheet and put one row per name your agent will have to say out loud: the trading name, every product and plan name, the suburbs in your service area, the street types you use, and any surname that appears in your greeting.

Then record how each one is actually said, from a person, not a dictionary. The Australian Government Style Manual page on Australian place names is the authority on spelling, and it is explicit that official place names “use a standard 26 character alphabet” and “don’t use diacritical marks”. Read 16 September 2026: that page governs spelling, capitalisation, punctuation and shortened forms, and says nothing at all about pronunciation. The official spelling is designed to carry no phonetic information. Local speech is the authority, and there is no national register of it.

Finish state for day one: a list with three columns filled in — the exact string as it will appear in agent output, a plain respelling captured from a local speaker, and the call volume or importance that decides whether it is worth a phoneme string at all.

Step two: check whether the name is in the dictionary at all

Before writing phonetics, run the cheap test that tells you how much work you are in for. The Cartesia custom pronunciations guide, in its Internet Archive capture dated 13 May 2026, documents the standard workflow for building a phoneme string: go to the Montreal Forced Aligner pronunciation dictionary index, download the .dict file, and “look up your word or words that sound similar to your intended pronunciation in the dictionary”. That workflow has a silent precondition, which is that something close to your word is in the file.

The Canowindra 43. We assembled a fixture of 43 Australian suburb, locality and town names spanning all eight states and territories, selected for grapheme-to-phoneme risk — multi-syllable names of Aboriginal-language origin, names whose spelling is shared with a differently-pronounced overseas place, and names where spelling gives no reliable guide to stress. On 16 September 2026 we checked every string against two lexicons: cmudict.dict from the cmusphinx/cmudict repository (126,052 distinct headwords after collapsing variant markers) and english_us_mfa.dict v3.1.0 from the Montreal Corpus Tools release page (61,061 headwords). Case-insensitive exact match on the headword.

Result: 0 of 43 in CMUdict, 2 of 43 in the MFA dictionary. The two hits are Geelong and Launceston. A control set of 16 names run the same way — Boston, Chicago, Worcester, Leicester, Gloucester, Tucson, Arkansas, Manitoba and all eight Australian capitals — scored 16 of 16 in both files. English orthography has plenty of famous traps and the dictionaries cover them; it is Australian suburbs and regional towns that fall off the edge of the tooling.

Name State or territory In CMUdict In english_us_mfa v3.1.0
Canowindra NSW no no
Coonabarabran NSW no no
Woolloomooloo NSW no no
Kirribilli NSW no no
Bulli NSW no no
Bowral NSW no no
Cowra NSW no no
Wauchope NSW no no
Cootamundra NSW no no
Maroubra NSW no no
Prahran VIC no no
Maribyrnong VIC no no
Moorabbin VIC no no
Nunawading VIC no no
Mooroolbark VIC no no
Traralgon VIC no no
Tullamarine VIC no no
Werribee VIC no no
Wangaratta VIC no no
Geelong VIC no yes
Coolangatta QLD no no
Indooroopilly QLD no no
Woolloongabba QLD no no
Currumbin QLD no no
Maroochydore QLD no no
Chermside QLD no no
Yeronga QLD no no
Toowoomba QLD no no
Joondalup WA no no
Karrinyup WA no no
Wanneroo WA no no
Kalamunda WA no no
Cottesloe WA no no
Willunga SA no no
Kapunda SA no no
Coonawarra SA no no
Launceston TAS no yes
Bicheno TAS no no
Yarralumla ACT no no
Manuka ACT no no
Tuggeranong ACT no no
Ngunnawal ACT no no
Nhulunbuy NT no no

Read the number for what it is. Neural TTS models do not look words up in CMUdict at inference time, so this is not a claim about model internals. It is a coverage test of the lexicons the documented workflows point you at, and it says that for 41 of these 43 names the lookup returns nothing and you are building the phoneme string by hand from a similar-sounding word. Launceston is the instructive hit: the MFA file carries three variants for it, two of them two-syllable forms and one three-syllable, with identical probability columns, so the file itself offers no basis for choosing. Whichever one your front end takes first is what your caller hears.

The fixture is a curated adversarial set, not a random sample of the gazetteer. It is published here so you can run it against your own stack.

Lexicon, transform or respelling: which layer to fix it in

This is the decision the vendor docs never make for you, because each vendor documents only its own rung. The crossover points below are the ones that matter in practice.

Condition Fix it here Why, and what defeats it
Under about 10 names, one agent, one TTS vendor Inline phoneme or respelling A lexicon is versioned infrastructure and 10 entries does not justify it. Deepgram Aura-2 caps a request at 500 pronunciations and 2,000 characters of input text, so inline scales further than most people expect.
10 to several hundred names, shared across more than one agent Lexicon or pronunciation dictionary One artefact, referenced by ID, auditable. Azure caps a custom lexicon file at 100 KB and will fail the synthesis request above it; split into multiple lexicons.
Your TTS has no provider-side pronunciation control Text transform in the agent framework Deepgram Flux TTS stated, on its feature overview read 16 September 2026, that inline pause and pronunciation (IPA) controls “are coming soon”, and that recognised SSML tags are stripped with an INPUT_MARKUP_STRIPPED warning. The client-side transform is the only deterministic lever.
The name spans more than one LLM token, and your framework aggregates by token Nothing below the framework will work — fix the aggregation first In token mode each transform sees one token at a time, so no pattern can match a span that straddles a boundary. LiveKit applies its replacement map as a streaming transform that handles terms spanning token boundaries; Pipecat issue 5574, open as at 16 September 2026, requests bounded lookback to do the same.
The name only needs a stress shift, not different sounds Check your model supports stress markers before anything else The Cartesia custom pronunciations guide, in its 13 May 2026 capture, states that MFA-style IPA “does not support stress markers” and labels the Sonic-flavoured IPA that carried them deprecated; the Cartesia pronunciation dictionary page read on 16 September 2026 shows IPA examples that do contain stress marks. Australian place names fail on stress far more often than on phonemes, so confirm it on the model you are actually running.
The change must be live within minutes Inline, not lexicon Azure caches a custom lexicon by URI and will not reload the same URI within 15 minutes, so a lexicon edit can take up to 15 minutes to reach live calls.

What each vendor actually supports, in its own documentation

Every row below was read on the owner page on 16 September 2026. The Cartesia quotations are the exception: they come from an Internet Archive capture of the Cartesia custom pronunciations guide dated 13 May 2026, because that guide now redirects to a documentation login. Cartesia has moved since that capture — its current pronunciation dictionary page, read 16 September 2026, documents a text and pronunciation entry format with a case sensitivity flag and states that case-insensitive matching requires Sonic 3.6 or later — so read the Cartesia row as a snapshot of 13 May 2026 and check the current page before you build against it.

Vendor Mechanism Alphabet The constraint the docs state
ElevenLabs Pronunciation dictionary, W3C PLS 1.0 .pls XML, phoneme and alias rules IPA and CMU Arpabet “Pronunciation dictionary phoneme tags only work with eleven_flash_v2 and eleven_v3 models. Other models skip dictionary phoneme tags and use the default pronunciation.” PLS files are case sensitive.
Cartesia (13 May 2026 capture) Inline double angle brackets, pipe-separated phonemes, plus dashboard dictionaries MFA-style IPA, named on that date for sonic-2 and sonic-turbo “Custom words should be wrapped in double angle brackets << >>, with pipe characters | between phonemes and no whitespace.” That capture also states MFA-style IPA does not support stress markers. The Vapi docs read 16 September 2026 now describe Cartesia dictionaries as sonic-3 only, so verify the model list before you rely on this row.
Deepgram Aura-2 Inline escaped JSON object carrying word and pronounce IPA English and Spanish only. Max 500 pronunciations per request, IPA string max 128 characters, input text max 2,000 characters. Response header dg-pronunciations-applied reports how many fired.
Deepgram Flux TTS None yet n/a “Inline pause and pronunciation (IPA) controls are coming soon.” Recognised SSML tags are stripped with an INPUT_MARKUP_STRIPPED warning and synthesis continues.
Azure AI Speech SSML <phoneme>, <sub> and <lexicon> pointing at a hosted PLS file ipa, sapi, ups, x-sampa Lexicon file capped at 100 KB, cached by URI and not reloaded within 15 minutes, one locale per lexicon, lexeme matching is case sensitive. The lexicon element is not supported by the Long Audio API.
Google Cloud Text-to-Speech SSML <phoneme> plus a custom_pronunciations field in the synthesis request IPA and X-SAMPA “Each application of the phoneme tag directs the pronunciation of a single word.” A custom pronunciation dictionary in the request is rewritten into phoneme tags automatically. Syllable boundaries use /./.
Vapi Pronunciation dictionaries via its own API, routed to the underlying provider Provider-dependent “Rules are applied in the order they appear in the dictionary. The first matching rule is used.” Dictionary searches are case sensitive. Adding a dictionary can change the underlying TTS provider, and Vapi does not translate markup between providers.
LiveKit Agents tts_text_transforms with text_transforms.replace(), or a custom tts_node Plain text substitution Applied as a streaming transform “handling terms that span across token boundaries without requiring a custom node override”. Set on AgentSession; per-Agent scoping is issue 7015, open as at 16 September 2026.

The two traps that make a correct lexicon do nothing

Trap one: the model list. A phoneme rule fires only on a model that supports phoneme rules, and the lists do not agree across the stack. On 16 September 2026 the ElevenLabs pronunciation dictionary documentation states that phoneme tags “only work with eleven_flash_v2 and eleven_v3 models” and that other models skip them and use the default pronunciation. On the same date the Vapi pronunciation dictionaries page states that “ElevenLabs phoneme rules only work with eleven_turbo_v2 and eleven_flash_v2“, and both of its worked configuration examples set "model": "eleven_turbo_v2_5", which appears on neither list.

The intersection of the two published lists is one model: eleven_flash_v2. That gives the rule worth writing down.

The Intersection Rule: a phoneme rule is only safe on a model that appears on both your platform list and your TTS vendor list. Where the two lists disagree, treat the intersection as the supported set and treat everything else as an alias rule. Alias rules are the fallback precisely because they work on every model — they substitute a spelling rather than asserting phonetics, so nothing can skip them. This is the same class of problem as a model reaching end of life underneath you, which we cover in what to do when your voice model is deprecated.

Trap two: the token boundary. If your framework applies transforms in token aggregation mode, each transform sees one token-sized chunk, so a pattern can never match a span that arrives in two pieces. Pipecat issue 5574, opened 1 September 2026 and still open as at 16 September 2026, documents this against DeepgramFluxTTSService and asks for a bounded lookback; a Pipecat maintainer picked it up and assigned it to a Pipecat engineer on 2 September 2026. LiveKit already applies its replacement map as a streaming transform that handles terms spanning token boundaries, which is why the same rule behaves differently on the two frameworks.

Both traps are silent. Nothing errors. The name is simply said the default way, which is why pronunciation defects survive so long in production — they never appear in a log. The only reliable detection is listening to recorded calls, which belongs in the pre-launch routine described in how to test an AI voice agent before go-live. Deepgram is the one vendor here that gives you a machine-readable check: the dg-pronunciations-applied response header counts how many overrides actually fired, so you can assert the number rather than trust it.

What this costs to run, and when to hand it over

The honest version of the DIY answer: the method above is complete and it works. What it costs is ongoing. A 150-name lexicon takes roughly a day to assemble if you already know how the names are said, plus an hour or two per TTS vendor to translate into that vendor format, because PLS XML, Cartesia double angle brackets and Deepgram escaped JSON are three different artefacts carrying the same information. None of them ports. If you change TTS vendor you rebuild all of it, which is one of the items on our list of what actually transfers when you switch AI voice platforms.

Then it decays: every new suburb, product rename and model upgrade is a reason to re-listen. Multiply that by language, because per-language phoneme sets differ, which is the part that surprises teams expanding into multilingual AI sales conversations across 30 languages. Zian AI runs live phone, SMS, email and WhatsApp outreach in 30+ languages with voice cloning supported, so the same name list has to hold in every language a campaign runs in.

Do it yourself when Hand it over when
Under about 50 names, one TTS vendor, one language More than about 150 names, or more than one TTS vendor, or more than one language
Your service area is stable and your product names rarely change Your suburb list grows every quarter
You have someone who can listen to 20 recorded calls a month and act on them Nobody owns the listening, so nothing gets caught
You are on one TTS model and not planning to move You are mid-migration, where every rule has to be rebuilt in a new format

If you are still choosing the underlying voice stack, the latency trade-offs sit in our breakdown of the fastest TTS for voice agents, and the local market view is in the best AI sales voice agents in Australia for 2026.

Frequently asked questions

Why does my agent still say the name wrong after I added it to the pronunciation dictionary?

The most common cause is model compatibility. ElevenLabs documents that pronunciation dictionary phoneme tags only work with eleven_flash_v2 and eleven_v3, and that other models skip the phoneme tags and use the default pronunciation. Nothing errors when that happens. Check the model name first, then check case, because dictionary matching is case sensitive on ElevenLabs, Azure and Vapi.

How long does a lexicon change take to reach live calls?

It depends on the layer. An inline phoneme applies on the next utterance. A hosted lexicon can lag: Microsoft documents that an Azure custom lexicon is cached with the URI as the key and is not reloaded within 15 minutes, so a change can take up to 15 minutes to take effect. Plan a fix window, not an instant rollback.

Can I just spell the name phonetically in the prompt instead?

Yes, and for a handful of names it is the right answer. Two caveats. The respelling is generated text, so the language model can paraphrase it away, and it also lands in your transcripts and CRM notes exactly as written. Keep respellings for names that appear in fixed strings such as the greeting, and use the lexicon for anything the model composes freely.

Is there an official list of how Australian place names are pronounced?

Not a national one. The Australian Government Style Manual page on Australian place names, read on 16 September 2026, covers spelling, capitalisation, punctuation and shortened forms and points to the Australian Place Names dataset for correct spelling. It does not cover pronunciation. Record it from local speakers instead, and validate by ear.

Do pronunciation dictionaries move with me if I change TTS vendor?

No. ElevenLabs and Azure both use W3C PLS XML, so those two are close. Cartesia uses inline double angle brackets with pipe-separated phonemes, Deepgram Aura-2 uses an escaped JSON object inside the text, and Google Cloud Text-to-Speech uses SSML phoneme tags or a custom pronunciations field. The phonetics survive a move; the file format does not.

My agent gets the suburb wrong on the way in, not on the way out. Is this the same fix?

No, and this is the most useful distinction on this page. Mispronouncing a suburb to the caller is a text to speech problem and the layers above fix it. Mishearing a suburb the caller says is a speech recognition problem and needs keyterm prompting or a custom vocabulary on the recogniser instead. They are different subsystems and neither fix helps the other.

Building an AI voice agent that has to say Australian names correctly? Zian AI is currently in partnership-application beta.

Apply For Partnership

Related Blogs

Related from Zian AI