如何在iOS 9上获取所有语音列表?

16

获取“所有”AVSpeechSynthesisVoice对象的标准方法是询问:

[AVSpeechSynthesisVoice speechVoices]

然而,这仅显示每个语言区域对应的唯一默认语音。例如,对于en-US:

"Language: en-US, Name: Samantha, Quality: Default",

如果我在设置应用程序下的 通用→辅助功能→语音→声音→英语 中查看,我会发现我选择了“Siri女性(增强版)”,但是这个声音无法从代码中选择。

完整列表如下所示:

1

那么大问题来了:我该如何从代码中选择Alex或 Siri女性等声音?

4个回答

19

背景

  • AVSpeechSynthesisVoice 文档 页面。

  • 语音的语言应该使用BCP-47格式进行指定。下面是可用的语音以及它们对应的BCP-47语言代码。

支持的语音

截至2020年5月7日,print(AVSpeechSynthesisVoice.speechVoices()) 报告了以下支持的语音(iOS 13.3.1;iPhone而不是模拟器):

[AVSpeechSynthesisVoice 0x28266f9c0] Language: ar-SA, Name: Maged, Quality: Default [com.apple.ttsbundle.Maged-compact]
[AVSpeechSynthesisVoice 0x28266dd10] Language: cs-CZ, Name: Zuzana, Quality: Default [com.apple.ttsbundle.Zuzana-compact]
[AVSpeechSynthesisVoice 0x28266f050] Language: da-DK, Name: Sara, Quality: Default [com.apple.ttsbundle.Sara-compact]
[AVSpeechSynthesisVoice 0x28266ef90] Language: de-DE, Name: Anna, Quality: Default [com.apple.ttsbundle.Anna-compact]
[AVSpeechSynthesisVoice 0x28266f710] Language: de-DE, Name: Helena, Quality: Default [com.apple.ttsbundle.siri_female_de-DE_compact]
[AVSpeechSynthesisVoice 0x28266d8f0] Language: de-DE, Name: Martin, Quality: Default [com.apple.ttsbundle.siri_male_de-DE_compact]
[AVSpeechSynthesisVoice 0x28266fbf0] Language: el-GR, Name: Melina, Quality: Default [com.apple.ttsbundle.Melina-compact]
[AVSpeechSynthesisVoice 0x28266f9b0] Language: en-AU, Name: Catherine, Quality: Default [com.apple.ttsbundle.siri_female_en-AU_compact]
[AVSpeechSynthesisVoice 0x28266ea00] Language: en-AU, Name: Gordon, Quality: Default [com.apple.ttsbundle.siri_male_en-AU_compact]
[AVSpeechSynthesisVoice 0x28266f5e0] Language: en-AU, Name: Karen, Quality: Default [com.apple.ttsbundle.Karen-compact]
[AVSpeechSynthesisVoice 0x28266e9a0] Language: en-GB, Name: Arthur, Quality: Default [com.apple.ttsbundle.siri_male_en-GB_compact]
[AVSpeechSynthesisVoice 0x28266fba0] Language: en-GB, Name: Daniel, Quality: Default [com.apple.ttsbundle.Daniel-compact]
[AVSpeechSynthesisVoice 0x28266f880] Language: en-GB, Name: Martha, Quality: Default [com.apple.ttsbundle.siri_female_en-GB_compact]
[AVSpeechSynthesisVoice 0x28266d0e0] Language: en-IE, Name: Moira, Quality: Default [com.apple.ttsbundle.Moira-compact]
[AVSpeechSynthesisVoice 0x28266efe0] Language: en-IN, Name: Rishi, Quality: Default [com.apple.ttsbundle.Rishi-compact]
[AVSpeechSynthesisVoice 0x2826327e0] Language: en-US, Name: Aaron, Quality: Default [com.apple.ttsbundle.siri_male_en-US_compact]
[AVSpeechSynthesisVoice 0x28266fb40] Language: en-US, Name: Fred, Quality: Default [com.apple.speech.synthesis.voice.Fred]
[AVSpeechSynthesisVoice 0x28266ce30] Language: en-US, Name: Nicky, Quality: Default [com.apple.ttsbundle.siri_female_en-US_compact]
[AVSpeechSynthesisVoice 0x28266ed60] Language: en-US, Name: Samantha, Quality: Default [com.apple.ttsbundle.Samantha-compact]
[AVSpeechSynthesisVoice 0x28266f170] Language: en-ZA, Name: Tessa, Quality: Default [com.apple.ttsbundle.Tessa-compact]
[AVSpeechSynthesisVoice 0x28266ef60] Language: es-ES, Name: Mónica, Quality: Default [com.apple.ttsbundle.Monica-compact]
[AVSpeechSynthesisVoice 0x28266ed30] Language: es-MX, Name: Paulina, Quality: Default [com.apple.ttsbundle.Paulina-compact]
[AVSpeechSynthesisVoice 0x28266d2d0] Language: fi-FI, Name: Satu, Quality: Default [com.apple.ttsbundle.Satu-compact]
[AVSpeechSynthesisVoice 0x28266fe40] Language: fr-CA, Name: Amélie, Quality: Default [com.apple.ttsbundle.Amelie-compact]
[AVSpeechSynthesisVoice 0x28266f620] Language: fr-FR, Name: Daniel, Quality: Default [com.apple.ttsbundle.siri_male_fr-FR_compact]
[AVSpeechSynthesisVoice 0x28266fbc0] Language: fr-FR, Name: Marie, Quality: Default [com.apple.ttsbundle.siri_female_fr-FR_compact]
[AVSpeechSynthesisVoice 0x28266fb20] Language: fr-FR, Name: Thomas, Quality: Default [com.apple.ttsbundle.Thomas-compact]
[AVSpeechSynthesisVoice 0x28266fd30] Language: he-IL, Name: Carmit, Quality: Default [com.apple.ttsbundle.Carmit-compact]
[AVSpeechSynthesisVoice 0x28266d820] Language: hi-IN, Name: Lekha, Quality: Default [com.apple.ttsbundle.Lekha-compact]
[AVSpeechSynthesisVoice 0x28266f070] Language: hu-HU, Name: Mariska, Quality: Default [com.apple.ttsbundle.Mariska-compact]
[AVSpeechSynthesisVoice 0x28266ed70] Language: id-ID, Name: Damayanti, Quality: Default [com.apple.ttsbundle.Damayanti-compact]
[AVSpeechSynthesisVoice 0x282631210] Language: it-IT, Name: Alice, Quality: Default [com.apple.ttsbundle.Alice-compact]
[AVSpeechSynthesisVoice 0x28266ef30] Language: ja-JP, Name: Hattori, Quality: Default [com.apple.ttsbundle.siri_male_ja-JP_compact]
[AVSpeechSynthesisVoice 0x28266d510] Language: ja-JP, Name: Kyoko, Quality: Default [com.apple.ttsbundle.Kyoko-compact]
[AVSpeechSynthesisVoice 0x28266e840] Language: ja-JP, Name: O-ren, Quality: Default [com.apple.ttsbundle.siri_female_ja-JP_compact]
[AVSpeechSynthesisVoice 0x28266ea90] Language: ko-KR, Name: Yuna, Quality: Default [com.apple.ttsbundle.Yuna-compact]
[AVSpeechSynthesisVoice 0x28266f6e0] Language: nl-BE, Name: Ellen, Quality: Default [com.apple.ttsbundle.Ellen-compact]
[AVSpeechSynthesisVoice 0x28266f6a0] Language: nl-NL, Name: Xander, Quality: Default [com.apple.ttsbundle.Xander-compact]
[AVSpeechSynthesisVoice 0x28266dc80] Language: no-NO, Name: Nora, Quality: Default [com.apple.ttsbundle.Nora-compact]
[AVSpeechSynthesisVoice 0x28266d020] Language: pl-PL, Name: Zosia, Quality: Default [com.apple.ttsbundle.Zosia-compact]
[AVSpeechSynthesisVoice 0x28266e930] Language: pt-BR, Name: Luciana, Quality: Default [com.apple.ttsbundle.Luciana-compact]
[AVSpeechSynthesisVoice 0x28266e1b0] Language: pt-PT, Name: Joana, Quality: Default [com.apple.ttsbundle.Joana-compact]
[AVSpeechSynthesisVoice 0x28266cfb0] Language: ro-RO, Name: Ioana, Quality: Default [com.apple.ttsbundle.Ioana-compact]
[AVSpeechSynthesisVoice 0x28266ee50] Language: ru-RU, Name: Milena, Quality: Default [com.apple.ttsbundle.Milena-compact]
[AVSpeechSynthesisVoice 0x28266eee0] Language: sk-SK, Name: Laura, Quality: Default [com.apple.ttsbundle.Laura-compact]
[AVSpeechSynthesisVoice 0x28266e070] Language: sv-SE, Name: Alva, Quality: Default [com.apple.ttsbundle.Alva-compact]
[AVSpeechSynthesisVoice 0x28266d470] Language: th-TH, Name: Kanya, Quality: Default [com.apple.ttsbundle.Kanya-compact]
[AVSpeechSynthesisVoice 0x28266f1d0] Language: tr-TR, Name: Yelda, Quality: Default [com.apple.ttsbundle.Yelda-compact]
[AVSpeechSynthesisVoice 0x28266db10] Language: zh-CN, Name: Tian-Tian (Enhanced), Quality: Enhanced [com.apple.ttsbundle.Ting-Ting-premium]
[AVSpeechSynthesisVoice 0x28266d890] Language: zh-CN, Name: Li-mu, Quality: Default [com.apple.ttsbundle.siri_male_zh-CN_compact]
[AVSpeechSynthesisVoice 0x28266d4c0] Language: zh-CN, Name: Tian-Tian, Quality: Default [com.apple.ttsbundle.Ting-Ting-compact]
[AVSpeechSynthesisVoice 0x28266ea60] Language: zh-CN, Name: Yu-shu, Quality: Default [com.apple.ttsbundle.siri_female_zh-CN_compact]
[AVSpeechSynthesisVoice 0x28266f140] Language: zh-HK, Name: Sin-Ji, Quality: Default [com.apple.ttsbundle.Sin-Ji-compact]
[AVSpeechSynthesisVoice 0x28266ef10] Language: zh-TW, Name: Mei-Jia, Quality: Default [com.apple.ttsbundle.Mei-Jia-compact]
[AVAlexSpeechSynthesisVoice 0x282630950] Language: en-US, Name: Alex, Quality: Enhanced [com.apple.speech.voice.Alex]

如下评论所述,这显然不包括在iPhone偏好设置中可用的en-AU男声“Lee”。看起来他目前不可通过此API使用。也许他将来会被添加进来,但考虑到可用的语音似乎自2015年12月30日以来并没有改变,我不会抱太大希望。

设置

import AVFoundation

let utterance : AVSpeechUtterance = AVSpeechUtterance(string: "String to be read out.")
let voiceToUse: AVSpeechSynthesisVoice? = AVSpeechSynthesisVoice(language: "en-US")
utterance.voice = voiceToUse! // Set voice by BCP-47 language code.
AVSpeechSynthesizer().speak(utterance) // Note: Won't be heard in Swift Playground.

答案

我们可以直接选择Alex的声音,使用AVSpeechSynthesisVoice(identifier: AVSpeechSynthesisVoiceIdentifierAlex),但奇怪的是,到目前为止Apple提供的唯一标识符是Alex。

对于任何其他语音(请参阅上面的语音名称列表),请使用以下代码:

// From https://www.ikiapps.com/tips/2015/12/30/setting-voice-for-tts-in-ios
var voiceToUse: AVSpeechSynthesisVoice?
for voice in AVSpeechSynthesisVoice.speechVoices() {
    if #available(iOS 9.0, *) {
        if voice.name == "Karen" {
            voiceToUse = voice
        }
    } 
}

(使用filter()比循环更优雅地完成此操作,但我不熟悉Swift中的语法,因此如果您感兴趣,请参考这里,或者如果您知道如何编写它,请留下评论)。

至于标记为“Siri”的声音,我不知道。也许它们与AVSpeechSynthesisVoice无关?如果您知道这些背后的原因,请留下评论。


我认为我也尝试了类似的方法,但AVSpeechSynthesisVoice.speechVoices根本没有给你任何关于这是哪个Karen,或者它是否增强等方面的指示。也许现在在iOS 10中可以工作,但我并不抱有希望。 - axello
@axello 我只看到一个 Karen - 就是 en-AU 的那个 - 在 speechVoices 和 iPhone 偏好设置中都只有这一个。就我所听到的(普通话语音非常明显),只要已经下载了增强语音,就会自动使用增强语音而不是普通语音。 - Jamie Birch
有趣。在iPhone的偏好设置中,我还看到了一个“Lee”(404MB)的英语(澳大利亚)下载。我不知道它会自动选择增强语音,因为您可以在设置应用中选择任何一种语音。 - axello
@axello 我已经更新了我的答案,并对Lee进行了调查。是的,看起来你不能使用他。我想再次确认一下是否自动选择增强语音,并在稍后的帖子中进行确认 - 现在似乎无法在Swift Playground中快速检查。 - Jamie Birch
我想我应该为此提交一个雷达反馈。 - axello

6

针对Jamie的回答(现在iOS 11.3版本也适用于早期版本):

对于其他的声音,标识符的结构为“com.apple.ttsbundle.Kanya-compact”

您可以通过以下方式获取可用的语音:

let voices = AVSpeechSynthesisVoice.speechVoices()
for voice in voices {
    print (voice.identifier + " " + s.language + " " + s.name)
}

并通过标识符或语言设置语音。

//set utterance first!
speechUtter = AVSpeechUtterance(string:"أتمنى لك نهارا سعيد")

speechUtter.voice = AVSpeechSynthesisVoice(identifier: "com.apple.ttsbundle.Maged-compact") 

或者

speechUtter.voice = AVSpeechSynthesisVoice(language: "ar-SA")

2
你可以使用这个简单的命令 print(AVSpeechSynthesisVoice.speechVoices())

2
虽然这是一个老问题,但在我的观察中,AVSpeechSynthesisVoice.speechVoices() 列出了所有可用设备上的语音。
如果您进入 iPhone 的语音首选项
(至少在 iOS 14.5 中) 设置 -> 辅助功能 -> 口头内容 -> 声音

enter image description here

在屏幕上,您可以选择一种语言,然后可以下载其他的语音。我个人下载了英国英语 Daniel (Enhanced) 语音,它与iOS默认的语音非常相似,但是更加增强。顺便说一下,在语音列表中,它被列为 Daniel (Enhanced),其标识符为 com.apple.ttsbundle.Daniel-premium
欢迎任何人纠正我,但据我所知,没有办法列出未下载的任何语音,也没有办法呈现可供下载的语音列表。
希望这对于以后关于iOS上的语音有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接