1

我目前正在使用 XCode 9.4.1 和 Swift 组合我的第一个应用程序。在我的代码中,我正在处理一个列表,我希望列表中的每个值都被大声说出。下面是我的代码

// classificationResults is my list
for returnedValue in self.classificationResults{
                    let utterance = AVSpeechUtterance(string: returnedValue)
                    utterance.voice = AVSpeechSynthesisVoice(language: "en-GB")
                    utterance.rate = 0.5

                    let synthesizer = AVSpeechSynthesizer()
                    synthesizer.speak(utterance)
                    // print(returnedValue)

在模拟器中运行它时,它可以工作,但是它只说允许列表中的第一个或两个值(有 7 个)。然后当我直接在我的设备上运行它时,什么都没有大声说出来。

有什么想法/建议吗?提前致谢

4

2 回答 2

0

问题可能在于您的播放器生命周期:要记住的最重要的事情是保留您的AVSpeechSynthesizer实例,直到完成完整的演讲

将您的合成器创建移到循环之外并使其保持活动状态直到演讲结束:这个答案也可能有所帮助。

于 2019-05-07T20:34:59.300 回答
0

我已经实现了以下代码,通过使用将我的所有文本转换为语音AVSpeechSynthesizer。以此代码为例,您可以通过您的代码进行尝试。

class TextToVoiceVC: UIViewController, AVSpeechSynthesizerDelegate {

    var arrSpeechCount = ["One", "Two", "Three", "Four", "Five", "Six", "Seven"]
    var count : Int = 0
    let speechSynthesizer   = AVSpeechSynthesizer()        

    //----------------------------------------------------------------
    // MARK:- AVSpeechSynthesixerDelegate
    //----------------------------------------------------------------

    func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didStart utterance: AVSpeechUtterance) {

    }

    //----------------------------------------------------------------

    func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance: AVSpeechUtterance) {

        speechSynthesizer.stopSpeaking(at: .word)

        count += 1
        if count < arrSpeechCount.count {
            let speechUtterance = AVSpeechUtterance(string: (arrSpeechCount[count]))
            DispatchQueue.main.async {
                self.speechSynthesizer.speak(speechUtterance)
            }
        }
    }


    //----------------------------------------------------------------
    // MARK:- View Life Cycle Methods
    //----------------------------------------------------------------

    override func viewDidLoad() {
        super.viewDidLoad()
        speechSynthesizer.delegate = self
    }

    //----------------------------------------------------------------

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        // Code to start speech
        if speechSynthesizer.isSpeaking {
            speechSynthesizer.stopSpeaking(at: .immediate)
        } else {
            let speechUtterance = AVSpeechUtterance(string: (arrSpeechCount[count]))

            DispatchQueue.main.async {
                self.speechSynthesizer.speak(speechUtterance)
            }
        }
    }
}

此代码在我的模拟器和设备中都有效。我希望这对你也有用。您应该尝试使用您的数据进行委托。

于 2018-07-02T17:18:49.173 回答