swift - 添加新字符串以朗读时 AVSpeechSynthesizer 不起作用 [xcode - swift 4]
问题描述
我使用下面的代码在随机时间阅读随机句子。但是,当 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)
}
}
解决方案
您可以简单地使用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 = ""
在函数外声明。
推荐阅读
- reactjs - 用于部署后设置的 React 配置文件
- fabricjs - FabricJS - 绘制和转换路径时的原点问题
- datatables - 数据表列配置
- maxima - 如何在 Maxima 中替换符号变量
- glsl - 这是在 GLSL 1.0 中使用非常量索引访问数组元素的最佳方式吗?
- laravel - 如何对任何经过身份验证的用户使用 API 速率限制?
- python - 如何使用 Python 添加 XML 元素而不重复
- jquery-ui - 带有 Webpack 4 的 jQuery UI
- python - 释放 VideoCapture(0) 并设置 kivy camera.play = True 后出现 Kivy-Python 错误
- python - 在一个 3D 图像中绘制多个折线图(Python)