swift - 如何在 Swift 中说出字符串时在文本到语音中进行 1-5 秒的小停顿?
问题描述
我正在尝试使用 Swift 中的 AVFoundation Text to Speech 功能来说出根据参数更改的自定义字符串。如何实现单词之间的停顿?
假设这是我的字符串:
var spokenSentence = "I like Toast with lots of Butter, but banana is nice"
如何让 TTS 在“Butter”之后暂停 3 秒?
这是我关于 TTS 的代码:
var spokenSentence = "I like Toast with lots of Butter, but banana is nice"
let synth = AVSpeechSynthesizer()
var utterance = AVSpeechUtterance(string: spokenSentence)
然后
synth.speak(utterance)
在 MacOS 上的 swift 之外,我听说您可以使用 [[slnc 1000]] 在 Swift 中是否有类似的功能?
解决方案
似乎AVSpeechUtterance
具有类似preUtteranceDelay
or的属性postUtteranceDelay
。您可以通过编写一些预处理代码来利用这些功能:
extension AVSpeechSynthesizer {
func speekWithDelay(_ text: String) {
let pattern = #"([^{]*)(?:\{([0-9]+(?:\.[0-9]+))\})?"#
let regex = try! NSRegularExpression(pattern: pattern)
let matches = regex.matches(in: text, options: .anchored, range: NSRange(0..<text.utf16.count))
for match in matches {
let utteranceText = text[Range(match.range(at: 1), in: text)!]
let utterance = AVSpeechUtterance(string: String(utteranceText))
if let range = Range(match.range(at: 2), in: text) {
let delay = TimeInterval(text[range])!
utterance.postUtteranceDelay = delay
}
speak(utterance)
}
}
}
将其用作:
let synth = AVSpeechSynthesizer()
@IBAction func speakButtonPressed(_ sender: Any) {
let spokenSentence = "I like Toast with lots of Butter,{3} but banana is nice"
synth.speekWithDelay(spokenSentence)
}
请记住,在AVSpeechSynthesizer
说出最后一句话之前,需要将 的实例保存在强引用中,因此您最好将其保存为实例属性。
推荐阅读
- database - MongoDB - WiredTiger 快照与锁定
- python-3.x - OOP:尝试创建对象实例时出现名称错误
- amazon-web-services - Amazon SES 什么都不做
- grails - Grails springSecurity无需重新登录即可重新加载权限
- python - 如何避免代码中出现如此多的索引 - python
- c# - .NET Core 2.0 MVC 仅在部署到 IIS 时控制器方法上的奇数 404
- reactjs - 带有 promises 和 redux-thunk 的异步操作
- java - 在 Servlet 中管理会话和请求属性
- javascript - TypeError:未定义不是函数(评估“addListener”)
- python - 使用 pandas 将字典列表添加在一起