gpt4 book ai didi

ios - 有没有办法将 AVSpeechBoundary 设置为某个值或者在句子完成之后?

转载 作者:搜寻专家 更新时间:2023-11-01 06:34:07 27 4
gpt4 key购买 nike

我想暂停语音,它必须完成它正在说出的当前句子然后它必须暂停,但 API 只提供两种暂停类型立即和单词不是当前句子。我试过了,

 myutterance = AVSpeechUtterance(string:readTextView.text)

synth .speak(myutterance)

synth .pauseSpeaking(at: AVSpeechBoundary.immediate)

但它在文本完成后立即暂停。

最佳答案

我只是尝试了你所做的一切,它读完了整个句子,没有足够的停顿,

let someText = "Some Sample text. That will read and pause after every sentence"

let speechSynthesizer = AVSpeechSynthesizer()

let myutterance = AVSpeechUtterance(string:someText)

speechSynthesizer .speak(myutterance)

//Normal reading without pause
speechSynthesizer .pauseSpeaking(at: AVSpeechBoundary.immediate)

要在每个句子后暂停,您可以将整个文本分解为简单的组件,并使用 postUtteranceDelay 属性在如下循环中单独阅读它们。

//To pause after every sentence
let components = someText.components(separatedBy: ".")

for str in components{

let myutterance = AVSpeechUtterance(string:str)

speechSynthesizer .speak(myutterance)

myutterance.postUtteranceDelay = 1 //Set it to whatever value you would want.
}

要在完成当前所说的句子后暂停,我们需要做一个小改动,

var isPaused:Bool = false
let someText = "Some Sample text. That will read and pause after every sentence. The next sentence should'nt be heard if you had pressed the pause button. Let us try this."
let speechSynthesizer = AVSpeechSynthesizer()
var currentUtterance:AVSpeechUtterance?

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

@IBAction func startSpeaking(_ sender: Any) {

//Pause after every sentence
let components = someText.components(separatedBy: ".")

for str in components{

let myutterance = AVSpeechUtterance(string:str)

speechSynthesizer .speak(myutterance)

myutterance.postUtteranceDelay = 1
}
}

@IBAction func pauseSpeaking(_ sender: Any) {
isPaused = !isPaused
}

func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, willSpeakRangeOfSpeechString characterRange: NSRange, utterance: AVSpeechUtterance){
print("location\(characterRange.location)")
print("Range + Length\(characterRange.location + characterRange.length)")
print("currentUtterance!.speechString\(currentUtterance!.speechString)")
print("currentUtterance!.count\(currentUtterance!.speechString.characters.count)")

if isPaused && (characterRange.location + characterRange.length) == currentUtterance!.speechString.characters.count{
speechSynthesizer.stopSpeaking(at:.word)
}

}

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

关于ios - 有没有办法将 AVSpeechBoundary 设置为某个值或者在句子完成之后?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43602383/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com