AVSpeechUtterance и нет речи / отсутствует речь в Swift
В настоящее время я собираю свое первое приложение, используя XCode 9.4.1 и Swift. В моем коде я работаю по списку, и мне бы хотелось, чтобы каждое значение в списке произносилось вслух. Ниже мой код для этого
// classificationResults is my list
for returnedValue in self.classificationResults{
let utterance = AVSpeechUtterance(string: returnedValue)
utterance.voice = AVSpeechSynthesisVoice(language: "en-GB")
utterance.rate = 0.5
let synthesizer = AVSpeechSynthesizer()
synthesizer.speak(utterance)
// print(returnedValue)
При запуске этого в симуляторе, он работает, однако он говорит только о том, что разрешены первые одно или два значения из списка (их 7). Когда я запускаю это прямо на моем устройстве, ничего не говорится вслух.
Есть идеи / предложения? заранее спасибо
1 ответ
Я реализовал следующий код, чтобы преобразовать весь текст в голос с помощью AVSpeechSynthesizer
, Этот код в качестве примера вы можете попробовать по своему коду.
class TextToVoiceVC: UIViewController, AVSpeechSynthesizerDelegate {
var arrSpeechCount = ["One", "Two", "Three", "Four", "Five", "Six", "Seven"]
var count : Int = 0
let speechSynthesizer = AVSpeechSynthesizer()
//----------------------------------------------------------------
// MARK:- AVSpeechSynthesixerDelegate
//----------------------------------------------------------------
func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didStart utterance: AVSpeechUtterance) {
}
//----------------------------------------------------------------
func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance: AVSpeechUtterance) {
speechSynthesizer.stopSpeaking(at: .word)
count += 1
if count < arrSpeechCount.count {
let speechUtterance = AVSpeechUtterance(string: (arrSpeechCount[count]))
DispatchQueue.main.async {
self.speechSynthesizer.speak(speechUtterance)
}
}
}
//----------------------------------------------------------------
// MARK:- View Life Cycle Methods
//----------------------------------------------------------------
override func viewDidLoad() {
super.viewDidLoad()
speechSynthesizer.delegate = self
}
//----------------------------------------------------------------
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// Code to start speech
if speechSynthesizer.isSpeaking {
speechSynthesizer.stopSpeaking(at: .immediate)
} else {
let speechUtterance = AVSpeechUtterance(string: (arrSpeechCount[count]))
DispatchQueue.main.async {
self.speechSynthesizer.speak(speechUtterance)
}
}
}
}
Этот код работает в моем симуляторе, а также на устройстве. Я надеюсь, что это будет полезно и вам. Вы должны попробовать делегировать свои данные.
Проблема может заключаться в жизненном цикле вашего плеера: самое важное, что нужно помнить, - сохранить AVSpeechSynthesizer
до тех пор, пока не будет произнесена полная речь.
Переместите свое творение синтезатора за пределы цикла и сохраните его до конца выступления: этот ответ тоже может помочь.