AVSpeechSynthesizer 不再在 ios16 下工作

Mic*_*ael 21 avfoundation avspeechsynthesizer swift

我为我的应用程序的 text2speech 函数编写了一个小函数。该代码在 ios16 之前都可以正常工作。现在我看到以下控制台日志:

022-09-13 18:04:02.274692+0200 Blindzeln_Prototyp[47358:164517] [asset] Failed to get sandbox extensions
2022-09-13 18:04:02.314956+0200 Blindzeln_Prototyp[47358:164517] [catalog] Query for com.apple.MobileAsset.VoiceServicesVocalizerVoice failed: 2
2022-09-13 18:04:02.315688+0200 Blindzeln_Prototyp[47358:164517] [catalog] Unable to list voice folder
2022-09-13 18:04:02.333665+0200 Blindzeln_Prototyp[47358:164517] [catalog] Query for com.apple.MobileAsset.VoiceServices.GryphonVoice failed: 2
2022-09-13 18:04:02.334239+0200 Blindzeln_Prototyp[47358:164517] [catalog] Unable to list voice folder
2022-09-13 18:04:02.338622+0200 Blindzeln_Prototyp[47358:164517] [catalog] Unable to list voice folder
2022-09-13 18:04:02.355732+0200 Blindzeln_Prototyp[47358:164583] [AXTTSCommon] File did not exist at content path: (null) (null). Attempting to fallback to default voice for language: (null)
2022-09-13 18:04:02.420342+0200 Blindzeln_Prototyp[47358:164583] [AXTTSCommon] Error: Unable to speak. No speech service: voice: (null) identifier: (null), language: (null), resource: (null)
Run Code Online (Sandbox Code Playgroud)

这是简单的代码:

import Foundation
import AVFoundation

func sayIt(text2speech: String) {
    let utterance = AVSpeechUtterance(string: String(text2speech))
    utterance.voice = AVSpeechSynthesisVoice(language: "de-DE")
    utterance.rate = 0.5
    
    let synthesizer = AVSpeechSynthesizer()
    synthesizer.speak(utterance)
}
Run Code Online (Sandbox Code Playgroud)

有什么提示吗?

Sha*_*DES 26

尝试移动

let synthesizer = AVSpeechSynthesizer()
Run Code Online (Sandbox Code Playgroud)

在函数之外。这对我有用。

  • 我遇到了同样的问题,但使用的是真实设备。我可以确认将 let Synthesizer = AVSpeechSynthesizer() 移到函数之外可以正常工作 (3认同)

小智 12

Rohit 描述的设置在 iOS 16 模拟器上对我有用。显然,iOS 16 模拟器默认情况下没有加载任何声音。模拟设备本身的确切顺序如下:

设置/辅助功能/语音内容 必须打开语音选择。这将列出声音。触摸那个。选择你的语言。选择一个声音。单击下载按钮。等待。完成后,如果需要,您可以退出并关闭“说出所选内容”。必须打开它才能选择和下载语音。


小智 8

我使用过的代码:

let synth = AVSpeechSynthesizer()    
let myUtterance = AVSpeechUtterance(string: message)
myUtterance.rate = 0.4
synth.speak(myUtterance)
Run Code Online (Sandbox Code Playgroud)

可以将let Synth = AVSpeechSynthesizer()移出此方法并在该类的顶部声明并使用。

为 Xcode14 和 iOS 16 启用的设置: 如果您使用 XCode14 和 iOS16,可能会未下载语音内容下的语音,并且您将在控制台上收到错误消息,提示标识符、来源、内容为零。您需要做的就是,转到设置中的辅助功能 -> 语音内容 -> 语音 -> 选择任何语言并下载任何配置文件。运行您的声音后,您将能够听到传递的文本中的语音。


Ale*_*jev 6

你需要指定一名代表

class Speaker: NSObject, AVSpeechSynthesizerDelegate {
    let synthesizer = AVSpeechSynthesizer()
    init() {
       synthesizer.delegate = self
    }

    func speak(msg: String) {
        let utterance = AVSpeechUtterance(string: msg)

        utterance.rate = 0.57
        utterance.pitchMultiplier = 0.8
        utterance.postUtteranceDelay = 0.2
        utterance.volume = 0.8

        let voice = AVSpeechSynthesisVoice(language: "en-US")

        utterance.voice = voice
        synthesizer.speak(utterance)
    }
}
Run Code Online (Sandbox Code Playgroud)

现在是如何使用

let s = Speaker()

s.speak(msg: "The quick brown fox jumped over the lazy dog.")
Run Code Online (Sandbox Code Playgroud)


Yod*_*ama 6

您在上面将 声明AVSpeechSynthesizer为局部变量。一旦 anAVSpeechSynthesizer超出范围并被释放,语音输出就会停止。

\n
\n

系统不会自动保留语音合成器,因此您需要手动保留它直到语音结束。

\n
\n

只要移动let synthesizer = AVSpeechSynthesizer()到一个可以在记忆中存在的地方,至少演讲已经结束了。

\n