You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中如何仅获取支持TTS语音合成的可用语音列表?

过滤可输出音频的TTS语音列表

要筛选出真正能输出音频的TTS语音,你可以通过以下两种方式实现:

方法一:利用系统属性直接过滤(iOS 14+)

从iOS 14开始,AVSpeechSynthesisVoice新增了isInstalled属性,可直接判断语音是否已安装——未安装的语音通常是需要下载的占位项,无法直接输出音频。修改你的代码如下:

func getList() -> Array<CustomTtsData> {
    var arr = Array<CustomTtsData>()
    
    for voice in AVSpeechSynthesisVoice.speechVoices() {
        // 只保留已安装的语音
        if voice.isInstalled {
            arr.append(CustomTtsData(voice.name, voice.language))
        }
    }
    
    return arr
}

方法二:兼容旧版本的验证方式(iOS <14)

如果需要支持iOS 14以下的版本,可以通过尝试创建语音实例并验证合成可用性来判断:

func getList() -> Array<CustomTtsData> {
    var arr = Array<CustomTtsData>()
    let synthesizer = AVSpeechSynthesizer()
    
    for voice in AVSpeechSynthesisVoice.speechVoices() {
        // 用当前语音创建测试 utterance
        let testUtterance = AVSpeechUtterance(string: "test")
        testUtterance.voice = voice
        
        // 检查合成器是否能处理该语音
        if synthesizer.canSpeak(testUtterance) {
            arr.append(CustomTtsData(voice.name, voice.language))
        }
    }
    
    return arr
}

补充说明

  • 部分语音会显示在系统列表中,但实际需要用户手动下载(比如某些方言或小众语言),这类未安装的语音无法生成音频,上述方法可有效过滤。
  • 若需提示用户下载缺失语音,可结合iOS 13+提供的AVSpeechSynthesisVoice.downloaded属性和AVSpeechSynthesisVoice.downloadVoice(_:completionHandler:)方法实现。

内容的提问来源于stack exchange,提问作者bomdong2230

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 01:49:54