我使用下面的代码在随机时间阅读随机句子。 但是,我遇到了一个问题,即在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)
}
}
答案 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 = ""
。