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

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.

疑问

  1. 是否有人遇到过类似问题?能否给出进一步排查的方向?
  2. 是否有人能证实模拟器切换德语语音正常,但真机仍存在不可接受的延迟?能否分析模拟器与真机的差异,以定位问题核心?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 23:15:39