添加新的语音字符串时,AVSpeechSynthesizer不起作用[xcode-swift 4]

时间:2019-03-20 06:22:28

标签: swift xcode text-to-speech speech avspeechsynthesizer

我使用下面的代码在随机时间阅读随机句子。 但是,我遇到了一个问题,即在AVSpeechSynthesizer仍在说前一个句子的同时调用一个随机句子来朗读时,第二个句子却没有被说出来。我要问的是,第一句话说完之后,如何才能说第二句话?

任何导入将不胜感激。 干杯

这里是我的代码:

import UIKit
import AVFoundation


class ViewController: UIViewController {

var myTimer = Timer()
   let string = ["what kind of car do you have?", "do you like the beach?","did you bring a towel?","There are big waves today"]
var randomTimer = Int()


@objc func speakToMe(){

    let random = Int.random(in: 0...3)
    randomTimer = Int.random(in: 0...2)
    print(randomTimer)
    print(string[random])


let utterance = AVSpeechUtterance(string: string[random])
utterance.voice = AVSpeechSynthesisVoice(language: "en-GB")
utterance.rate = 0.1
let synthesizer = AVSpeechSynthesizer()
synthesizer.speak(utterance)

}

override func viewDidLoad() {
    super.viewDidLoad()
    speakToMe()
    myTimer = Timer.scheduledTimer(timeInterval: TimeInterval(randomTimer), target: self, selector: #selector(ViewController.speakToMe), userInfo: nil, repeats: true)
}


}   

1 个答案:

答案 0 :(得分:2)

您只需为此使用AVSpeechSynthesizerDelegate,就可以从代码中删除计时器。

要首先使用AVSpeechSynthesizerDelegate,您需要使用AVSpeechSynthesizerDelegate确认视图控制器,如下所示:

class ViewController: UIViewController, AVSpeechSynthesizerDelegate {

接下来的事情是您需要添加

synthesizer.delegate = self

在您的viewDidLoad方法中。您需要声明

let synthesizer = AVSpeechSynthesizer()

方法外和类内。

您可以使用randomElement属性从string数组中查找随机元素。

您的最终代码如下:

import UIKit
import AVFoundation

class ViewController: UIViewController, AVSpeechSynthesizerDelegate {

    let string = ["what kind of car do you have?", "do you like the beach?","did you bring a towel?","There are big waves today"]
    let synthesizer = AVSpeechSynthesizer()

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

    @objc func speakToMe(){

        let utterance = AVSpeechUtterance(string: string.randomElement()!)
        utterance.voice = AVSpeechSynthesisVoice(language: "en-GB")
        utterance.rate = 0.1
        synthesizer.speak(utterance)

    }

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

编辑:

由于您仅使用数组中的4个元素,因此当您为它随机字符串时,有可能多次重复相同的句子,因此您可以在此处添加一个更多的逻辑来防止重复此句子。

如下更新您的speakToMe函数:

@objc func speakToMe(){

    var randomStr = string.randomElement()!
    while previousStr == randomStr {
        randomStr = string.randomElement()!
    }
    previousStr = randomStr
    let utterance = AVSpeechUtterance(string: randomStr)
    utterance.voice = AVSpeechSynthesisVoice(language: "en-GB")
    utterance.rate = 0.1
    synthesizer.speak(utterance)
}

然后在函数外部声明var previousStr = ""