iOS文本语音转换:由什么决定[AVSpeechSynthesisVoice voiceWithLanguage]返回的默认语音?

时间:2018-10-09 18:33:12

标签: ios text-to-speech

iOS SDK 7.0中已引入AVSpeechSynthesisVoice.voiceWithLanguage。那时,每种语言/地区只有一种声音。

自iOS SDK 9.0起,已为每种语言/地区添加了更多声音。因此,Apple引入了新的API voiceWithIdentifier,以便您可以获取所需的特定语音。

我的问题是,如果我们仍在iOS 9或更高版本中使用voiceWithLanguage,该怎么办?该API究竟返回什么?更重要的是,返回的语音是否在iOS版本之间甚至在不同设备之间发生了变化?

我注意到,voiceWithLanguage返回的内容有点依赖于iOS语音设置“设置->常规->辅助功能->语音->语音->英语”。但并不是完全匹配。就是说,例如英语US,如果您将语音设置为“ Fred”,voiceWithLanguage将返回“ Fred”,这很酷。但是,如果将语音设置为“ Nicky”,voiceWithLanguage会返回“ Nicky”以外的其他内容。

我问这是因为我的应用程序正在使用voiceWithLanguage。当用户将iOS升级到iOS 12时,他们报告说他们听到了不同的声音。我相信voiceWithLanguage在升级到iOS 12后会返回不同的声音。虽然我无法在相同类型的设备上重现它。

当然,我可以开始改用voiceWithIdentifier。但是只是对这个voiceWithLanguage感到好奇。

2 个答案:

答案 0 :(得分:1)

[尚无解决方案]我也遇到了同样的问题。

首先,通过设置不同的声音

Accessibility -> Speech -> Voices
or 
Accessibility -> VoiceOver -> Speech -> Voices

然后

AVSpeechSynthesisVoice(language: language)

它不会影响iOS 12.0.1中的 AVSpeechSynthesizer (适用于iOS 11.x和iOS 12.0.0)

我还在iOS 12.0.1上发现了另外两件事

首先,使用

时Siri语音不再可用
AVSpeechSynthesisVoice(identifier: "com.apple.ttsbundle.siri_male_ja-JP_compact")

第二,如果我未设置语音标识符,则该区域设置中的女Siri 会说出文字。它也不受语音设置的影响。顺便说一句,我仍然找不到使男Siri 说话的方法,但是...哈哈

答案 1 :(得分:0)

  

...返回的语音在iOS版本之间甚至在不同设备之间是否发生了变化?

我仅在iOS 12中发现了语音合成功能,因此无法向您提供有关先前版本的任何信息,但我知道默认语音是设备支持的语言的内置语音。

由于在实例化AVSpeechSynthesisVoice类时仅使用BCP 47代码指定语音的语言和语言环境,因此您的代码采用了设备的默认语音,这可能是许多用户自定义的用户。

  

...例如美国英语,如果您设置语音“ Fred”,voiceWithLanguage将返回“ Fred”,这很酷。但是,如果将语音设置为“ Nicky”,voiceWithLanguage会返回“ Nicky”以外的其他内容。

我做了很多测试(包括iOS 12.3.1,Swift 5.0,iPhone X,iPhone 7 Plus),其中包括您提到的测试,并且在测试时,它总是返回设备支持语言的内置语音我改变了。

enter image description here

我无法重现您的问题。

  

...当然,我可以开始改用voiceWithIdentifier

这正是我的建议,并且,如果未安装带有标识符的指定语音,请采用默认值:它将减少许多用户听到的不同语音。

最后,使用BCP 47代码(“ en-US”,“ fr-FR” ...)会引起要考虑的设备内置语音可以根据自定义设置产生不同的听到的声音:决定[AVSpeechSynthesisVoice voiceWithLanguage]返回的默认声音 (ObjC)

如果需要,可以在this WWDC detailed summary上找到选择正确声音的介绍。