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). Когда я запускаю это прямо на своем устройстве, вслух ничего не произносится.

Есть идеи / предложения? заранее спасибо


person thefragileomen    schedule 02.07.2018    source источник
comment
Я думаю, что это не лучший способ озвучить текст с помощью цикла for. Используйте метод делегирования путем увеличения счетчика.   -  person Sagar Chauhan    schedule 02.07.2018


Ответы (2)


Я реализовал следующий код, чтобы преобразовать весь текст в голос с помощью 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)
            }
        }
    }
}

Этот код работает как в моем симуляторе, так и в устройстве. Я надеюсь, что это будет полезно и вам. Вы должны попробовать делегировать свои данные.

person Sagar Chauhan    schedule 02.07.2018

Проблема может заключаться в жизненном цикле вашего плеера: самое важное, что нужно помнить, - это сохранить свой _ 1_ до полной речи.

Переместите свое творение синтезатора за пределы цикла и сохраните его до конца выступления: этот ответ также может помочь.

person XLE_22    schedule 07.05.2019