I am using AVSpeechUtterance
for reading text and trying to implement a change slider thumb according to text read.
I've tried :-
myUtterance = AVSpeechUtterance(string: idFileText)
myUtterance.rate = 0.3
synth.speak(myUtterance)
synth.continueSpeaking()
if let intValue = Int(idFileText) {
self.sliderValue.setValue(Float(intValue),
animated: true)
}
The text reader is doing well but slider value does not change.
Can any one please suggest me the right way to implement slider on text reader.
Use AVSpeechSynthesizer
's delegate speechSynthesizer(_:willSpeakRangeOfSpeechString:utterance:)
.
It provides the current character range being spoken.
You can use it to determine the slider position as you should already know the length of the entire text.
A basic example would be:
func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer,
willSpeakRangeOfSpeechString characterRange: NSRange,
utterance: AVSpeechUtterance) {
let progress = Float(characterRange.location + characterRange.length)
/ Float(utterance.speechString.count)
print(progress)
self.sliderValue.setValue(progress,
animated: true)
}
For the above logic, ensure your slider object min-max range is 0-1.
And ofcourse, you will need to improve on it to obtain a smoother progress.
Don't forget:
synth.delegate = self