SUSI iOS app now enables the user to change the text-to-speech voice language within the app. Now, the user can select any language of their choice from the list of 37 languages list. To change the text-to-speech voice language, go to, Settings > Change SUSI’s Voice, choose the language of your choice. Let see here how this feature implemented.
Apple’s AVFoundation API is used to implement the text-to-speech feature in SUSI iOS. AVFoundation API offers 37 voice languages which can be used for text-to-speech voice accent. AVFoundation’s AVSpeechSynthesisVoice API can be used to select a voice appropriate to the language of the text to be spoken or to select a voice exhibiting a particular local variant of that language (such as Australian or South African English).
To print the list of all languages offered by AVFoundation:
import AVFoundation
print(AVSpeechSynthesisVoice.speechVoices())
Or the complete list of supported languages can be found at Languages Supported by VoiceOver.
When the user clicks Change SUSI’s voice in settings, a screen is presented with the list of available languages with the language code.
Dictionary holds the list of available languages with language name and language code and used as Data Source for tableView.
var voiceLanguagesList: [Dictionary<String, String>] = []
When user choose the language and click on done, we store language chosen by user in UserDefaults:
UserDefaults.standard.set(voiceLanguagesList[selectedVoiceLanguage][ControllerConstants.ChooseLanguage.languageCode], forKey: ControllerConstants.UserDefaultsKeys.languageCode) UserDefaults.standard.set(voiceLanguagesList[selectedVoiceLanguage][ControllerConstants.ChooseLanguage.languageName], forKey: ControllerConstants.UserDefaultsKeys.languageName)
Language name with language code chosen by user displayed in settings so the user can know which language is currently being used for text-to-speech voice.
To select a voice for use in speech, we obtain an AVSpeechSynthesisVoice instance using one of the methods in Finding Voices and then set it as the value of the voice property on an AVSpeechUtterance instance containing text to be spoken.
Earlier stored language code in UserDefaults shared instance used for setting the text-to-speech language for AVSpeechSynthesisVoice.
if let selectedLanguage = UserDefaults.standard.object(forKey: ControllerConstants.UserDefaultsKeys.languageCode) as? String { speechUtterance.voice = AVSpeechSynthesisVoice(language: selectedLanguage) }
AVSpeechUtterance is responsible for a chunk of text to be spoken, along with parameters that affect its speech.
Resources –
- UserDefaults: https://developer.apple.com/documentation/foundation/userdefaults
- AVSpeechSynthesisVoice: https://developer.apple.com/documentation/avfoundation/avspeechsynthesisvoice
- AVFoundation: https://developer.apple.com/av-foundation/
- SUSI iOS Link: https://github.com/fossasia/susi_iOS