iOS 15/16切换德语AVSpeechSynthesizer语音时卡顿数秒问题
iOS 15/16中AVSpeechSynthesizer切换德语语音卡顿问题
在iOS 15/16系统中,使用AVSpeechSynthesizer切换至德语语音时,应用会卡顿数秒(时长因设备而异)后才开始语音输出,卡顿发生在调用avSpeechSynth.speak(utterance)与合成器代理回调didStart之间。
语言规则数据对比
查看控制台输出发现,德语语言规则数据的大小是英语或意大利语的5至9倍:
10:55:16.137820+0200 ... #MobileAsset listing ...'[Available: true, Language: de-DE]' ... 10:55:07.636488+0200 ... Loading on disk rule data: 4392529 10:55:10.818661+0200 ... processing rules: 459, NS: 28669 10:55:10.840711+0200 ... Creating playback session rate: 22050, channels 1
此案例中,加载磁盘规则耗时约3.2秒。
而加载英语或意大利语语音时,耗时明显更短:
10:55:16.137820+0200 ... #MobileAsset listing ...'[Available: true, Language: en-US]' ... 10:55:16.148741+0200 ... Loading on disk rule data: 862210 10:55:16.407063+0200 ... processing rules: 12192, NS: 1611 10:55:16.428606+0200 ... Creating playback session rate: 22050, channels 1
仅耗时0.25秒。
10:55:16.137820+0200 ... #MobileAsset listing ...'[Available: true, Language: it-IT]' ... 10:54:50.816431+0200 ... Loading on disk rule data: 536565 10:54:51.493129+0200 ... processing rules: 2567, NS: 4149 10:54:51.514703+0200 ... Creating playback session rate: 22050, channels 1
仅耗时0.7秒。
测试应用差异
有趣的是,使用与主应用完全相同的AVSpeechSynthesizer配置和用法搭建的小型测试应用,无法复现切换德语语音后的长时间加载/卡顿问题。
核心调用代码
调用AVSpeechSynthesizer.speak(_)的代码如下:
func speak(_ textToSpeak: String) { appState.isPrePause = true // Detect language of incoming text to speak. var lang = "" if let dominantLanguage = NLLanguageRecognizer.dominantLanguage(for: textToSpeak) { lang = dominantLanguage.rawValue } else { lang = "en" } // Select a voice based on the detected lanuage. let voice = AVSpeechSynthesisVoice(language: lang) if voice == nil { print("WARNING: no voice for the current language \(lang). Falling back to default voice.") } let utterance = AVSpeechUtterance(string: textToSpeak) utterance.voice = voice utterance.preUtteranceDelay = appState.preUtteranceDelay utterance.postUtteranceDelay = appState.postUtteranceDelay avSpeechSynth.speak(utterance) }
2023年4月更新
在搭载Xcode 14.3的iOS 16.4模拟器上,切换德语语音的操作恢复正常,无3秒以上延迟。但在安装iOS 16.4.1的真机上,该问题依旧存在。重新安装应用、重新下载德语语音均无效。
真机控制台输出(卡顿发生在第一条[AXTTSCommon] Invalid rule:之后)
Speech Synthesizer - Current utterance voice: Optional("Viktor (Enhanced)") | language: Optional("de-DE") 2023-04-09 13:04:06.172618+0200 SpeechApp[914:31631] [AXTTSCommon] Invalid rule: <-- DELAY HAPPENS AFTER THIS LINE 2023-04-09 13:04:10.052499+0200 SpeechApp[914:31631] [AXTTSCommon] Invalid rule: 2023-04-09 13:04:10.053138+0200 SpeechApp[914:31631] [AXTTSCommon] Invalid rule: 2023-04-09 13:04:10.055567+0200 SpeechApp[914:31631] [AXTTSCommon] Invalid rule: 2023-04-09 13:04:10.113567+0200 SpeechApp[914:31164] [audio] --- SpeechSynthesizer Delegate - did START speaking utterance.
模拟器控制台输出(仅一条[AXTTSCommon] Invalid rule:,无延迟)
Speech Synthesizer - Current utterance voice: Optional("Viktor (Enhanced)") | language: Optional("de-DE") 2023-04-09 13:01:59.764986+0200 SpeechApp[7145:111421] [AXTTSCommon] Invalid rule: 2023-04-09 13:01:59.778640+0200 SpeechApp[7145:108690] [audio] --- SpeechSynthesizer Delegate - did START speaking utterance.
疑问
- 是否有人遇到过类似问题?能否给出进一步排查的方向?
- 是否有人能证实模拟器切换德语语音正常,但真机仍存在不可接受的延迟?能否分析模拟器与真机的差异,以定位问题核心?
内容的提问来源于stack exchange,提问作者KlausM
相关产品推荐
相关产品推荐

