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
相关产品推荐
相关产品推荐

