AVSpeechSynthesisVoice.speechVoices

It's a little bit unclear to me whether I get a list of available or installed voices on the device.
If an app requests a voice which is available but not installed, what happened?
Is it upon the app to install the missing voice or is this done by iOS automatically?
For some reasons, a male and female gender is not offered for each language. What's the reason for?

Replies

"Available" and "installed" pretty much mean the same thing in this context. Only installed and usable voices will be returned by this API. Additional voices can be downloaded by the user in Settings > Accessibility > Spoken Content > Voices. Developers cannot initiate download requests on behalf of the user. If you request speech using a voice that isn't installed,d then we will do our best to pick a suitable fallback voice that matches the same language code.

The vast majority of languages ship with only one preinstalled voice, the languages that contain multiple are mostly to maintain compatibility with prior versions we have shipped.

Do "available" and "installed" still mean the same in iOS 17? When I use "speechVoices" I get voices such as "grandpa" and "grandma" and others which do not produce any sound. When I check the available voices in Settings > Accessibility > Spoken Content > Voices, these voices are not even listed there or are inside the voice "Eloquence"

I was thinking about letting the user choose the voice for TTS, but it seems unfeasible now, I would have to warn the user to test the voice first to see if it works... Is there something I am missing? Is there another way to know if a voice returned in "speechVoices" is really available for TTS?

It seems that my code was not ready to work with the voices which have a sample rate of 16000. This caused the issue with the sound, it was not related to voices returned by AVSpeechSynthesisVoice.speechVoices not being available. Everything is working fine in iOS 17.