What’s Up with Teams Auto Attendants Suddenly Using a Male Voice for TTS?

If you’re reading this article; it probably means that you’re wondering why suddenly some of your auto attendants are using male voices in…

If you’re reading this article; it probably means that you’re wondering why suddenly some of your auto attendants are using male voices in greetings. Just as I was. You might also have noticed, that Microsoft introduced a few new supported languages for Teams auto attendant and call queue text-to-speech (TTS) greetings a couple of months ago.

Which is very nice — in theory. But in reality, they messed up, at least to some exent. All newly created or any existing auto attendant where you change the language will now default to a male voice in TTS greetings for many languages. Before that it was female for at least all the languages I had worked with in the past.

Why Is That a Problem?

There’s no option to change the VoiceId (female/male) from Teams Admin Center for either auto attendants or call queues. Call Queues still default to a female VoiceId while auto attendants now default to a male voice for most major languages. This means that if your call flow uses both, attendants and queues (like most call flows do), you will face a rather unpleasant inconsistency. In one part of the call flow, your callers will hear male voices and in other parts they will hear female voices in greetings and announcements. This is not a good user experience.

What About PowerShell?

While it’s possible to change the voice (female/male) on an auto attendant with PowerShell, it’s not possible to do the same for call queues.

This means that greetings of call queues will always be synthesized by a female voice. There’s not even a VoiceId property returned by PowerShell, only LanguageId. The only way to verify this is to actually call the queue and listen to the announcements.

I did just that. I created a new call queue with en-US set as it’s language and configured a TTS welcome greeting. Once I called the number, I was indeed greeted by a female voice, like it’s always been.

Welcome greetings are not the only greetings a caller can hear when interacting with a call queue though. Other scenarios are shared voicemail on timeout or overflow. The funny thing with the welcome TTS greeting is that as of the time of drafting this article, there’s still no option to set or even view this property in PowerShell. Not even in Teams PowerShell 4.9.1.

If you’re using TTS welcome greetings on your call queues in production, please read the following section very carefully. Because there’s no PowerShell support for TTS welcome greetings on call queues yet, any configured TTS welcome greeting will be deleted from your queues, every time you save a queue using PowerShell!

Don’t believe me? I’m going to show you. Notice how I only changed the overflow threshold. This doesn’t even remotely have anything to do with greetings or language settings.

After the queue has been updated by PowerShell, the TTS welcome greeting is gone. For Teams Voice Admins, this means that we either can’t use TTS welcome greetings, if we frequently use PS to update our queues, we can only use TAC to update queues or that we have to think about setting the greeting in TAC again, every time a change was made via PowerShell. None of them are good options and the last of them certainly defeats the purpose of PowerShell entirely. The only real option here is to use an audio file as welcome greeting until Microsoft has fixed this.

What About Auto Attendants?

So far, we’ve established that call queues always use a female voice for TTS greetings. On auto attendants it’s actually possible to change the VoiceId by PowerShell.

Here’s a newly created auto attendant with en-US language.

$aa = Get-CsAutoAttendant -Identity 77b1706a-59a8-4832-9f49-f7ff80e0da97
$aa

Identity : 77b1706a-59a8-4832-9f49-f7ff80e0da97
TenantId : 4bffbf87-53a0-4fce-b58b-4179cb3a3b7d
Name : Test Voice
LanguageId : en-US
VoiceId : Male
DefaultCallFlow : Test Voice Default call flow
Operator :
TimeZoneId : W. Europe Standard Time
VoiceResponseEnabled : False
CallFlows : Test Voice After hours call flow
Schedules : After hours Test Voice
CallHandlingAssociations : AfterHours(1)
Status :
DialByNameResourceId :
DirectoryLookupScope :
ApplicationInstances : {}
AuthorizedUsers : {}

To change the VoiceId we can use the following code.

$aa.VoiceId = “Female”
Set-CsAutoAttendant -Instance $aa

This will return the following output. Notice how the VoiceId changed to Female.

Identity : 77b1706a-59a8-4832-9f49-f7ff80e0da97
TenantId : 4bffbf87-53a0-4fce-b58b-4179cb3a3b7d
Name : Test Voice
LanguageId : en-US
VoiceId : Female
DefaultCallFlow : Test Voice Default call flow
Operator :
TimeZoneId : W. Europe Standard Time
VoiceResponseEnabled : False
CallFlows : Test Voice After hours call flow
Schedules : After hours Test Voice
CallHandlingAssociations : AfterHours(1)
Status :
DialByNameResourceId :
DirectoryLookupScope :
ApplicationInstances : {}
AuthorizedUsers : {}

When I initially discovered this a couple of months ago, I could have sworn that every time I changed something in TAC, that the VoiceId was reset to male. While writing this article I did some further tests, and I was not able to reproduce this 100% or recognize a pattern anymore. Sometimes, it defaulted back to male, sometimes it stayed on female, no matter which setting I changed in TAC. Therefore, I’m going to leave it like that and just tell you to be extra careful, when updating auto attendants through TAC, if you want to keep a female voice. You definitely shouldn’t count on TAC preserving your configured VoiceId.

One thing is for sure though, every time you change the language of an auto attendant through TAC, it will default to male for all the affected languages. We’re going to see which they are in a bit.

Again, this is very bad news for Teams Voice Admins as this basically restricts us to either using TAC only (if we’re fine with male voices even though call queues use female voices) or using PowerShell only, if we want to make sure that we’re always using a female voice.

Why Has This Happened?

Auto attendants and call queues use the Azure Cognitive Services TTS API, which is actually available to all Azure customers. You can try the different voices here. Many of them are also used by Teams. Over time, some of these voices get imporved or some languages even get entirely new voices. I don’t know when it happend exactly, but Microsoft added support for new voices a couple of months ago. For example, there’s an option for my native language, Swiss German available now.

Available voices on Teams auto attendants are not particularly easy to find. There’s this Learn article which has some info on it though.

By using this code, we can get all the available voices for e.g., en-US.

PS C:\Temp> (Get-CsAutoAttendantSupportedLanguage -Identity “en-US”).Voices

Name : GuyNeural
Id : Male

Name : JessaNeural
Id : Female

Name : AriaNeural
Id : Female

Name : JennyNeural
Id : Female

Let’s do the same for Swiss German, which is a newly supported language.

PS C:\Temp> (Get-CsAutoAttendantSupportedLanguage -Identity “de-CH”).Voices

Name : JanNeural
Id : Male

Name : LeniNeural
Id : Female

The docs say that we can retrieve the default voice used for any language by using this code.

PS C:\Temp> (Get-CsAutoAttendantSupportedLanguage -Identity “en-US”).Voices.Id[0]
Male

I can’t say for sure, but I’m fairly confident that TAC just reads the array of supported languages and uses whichever comes first as the default voice. That’s why en-US or de-CH now have male voices by default now.

Here’s a little script I wrote to extract the default VoiceId for all the supported languages and export them to CSV.

Connect-MicrosoftTeams

$allLanguages = Get-CsAutoAttendantSupportedLanguage

$languageVoiceTable = @()

foreach ($language in $allLanguages) {

$currentLanguageVoice = New-Object -TypeName psobject  

$currentLanguageVoice | Add-Member -MemberType NoteProperty -Name "LanguageId" -Value $language.Id  
$currentLanguageVoice | Add-Member -MemberType NoteProperty -Name "LanguageName" -Value $language.DisplayName  
$currentLanguageVoice | Add-Member -MemberType NoteProperty -Name "VoiceId" -Value $language.Voices\[0\].Id  

$languageVoiceTable += $currentLanguageVoice  

}

$languageVoiceTable | Export-Csv -Path C:\Temp\autoAttendantLanguageVoiceTable.csv -Delimiter “;” -NoTypeInformation -Encoding UTF8 -Force

Here’s the full list which should help you identify if you’re using any affected languages.

LanguageId LanguageName VoiceId
ar-EG Arabic (Egypt) Female
ar-SA Arabic (Saudi Arabia) Female
bg-BG Bulgarian (Bulgaria) Female
ca-ES Catalan (Spain) Female
cs-CZ Czech (Czech) Male
cy-GB Welsh (United Kingdom) Female
da-DK Danish (Denmark) Female
de-AT German (Austria) Female
de-CH German (Switzerland) Male
de-DE German (Germany) Female
el-GR Greek (Greek) Female
en-AU English (Australia) Male
en-CA English (Canada) Male
en-GB English (United Kingdom) Male
en-IE English (Ireland) Male
en-IN English (India) Male
en-PH English (Philippines) Male
en-US English (United States) Male
en-ZA English (South Africa) Female
es-ES Spanish (Spain) Female
es-MX Spanish (Mexico) Female
et-EE Estonian (Estonia) Female
fi-FI Finnish (Finland) Female
fr-BE French (Belgium) Female
fr-CA French (Canada) Female
fr-CH French (Switzerland) Female
fr-FR French (France) Female
he-IL Hebrew (Israel) Male
hi-IN Hindi (India) Female
hr-HR Croatian (Croatia) Female
hu-HU Hungarian (Hungary) Female
id-ID Indonesian (Indonesia) Female
it-IT Italian (Italy) Female
lt-LT Lithuanian (Lithuania) Male
lv-LV Latvian (Latvia) Female
ja-JP Japanese (Japan) Female
ko-KR Korean (Korea) Female
nb-NO Norwegian, Bokmål (Norway) Female
nl-BE Dutch (Belgium) Female
nl-NL Dutch (Netherlands) Female
pl-PL Polish (Poland) Female
pt-BR Portuguese (Brazil) Female
pt-PT Portuguese (Portugal) Female
ro-RO Romanian (Romania) Female
ru-RU Russian (Russia) Female
sk-SK Slovak (Slovakia) Male
sl-SI Slovenian (Slovenia) Female
sv-SE Swedish (Sweden) Female
th-TH Thai (Thai) Female
tr-TR Turkish (Turkey) Female
vi-VN Vietnamese (Vietnam) Female
zh-CN Chinese (Simplified, PRC) Female
zh-HK Chinese (Traditional, Hong Kong S.A.R.) Female
zh-TW Chinese (Traditional, Taiwan) Female

You can use this one-liner to check if any of your existing auto attendants are currently using a male voice.

Get-CsAutoAttendant -First 1000 | ft Name, LanguageId, VoiceId

I really hope that Microsofts recognizes that this is a major annoyance and that they fix it rather sooner than later. In the meantime, I hope that I was able to provide you with some useful insight and hope that it helps you keeping the problem in check.

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Hosted on GitHub Pages
Built with Hugo
Theme Stack designed by Jimmy