Анализ строки для преобразования текста в речь в iOS - PullRequest
0 голосов
/ 06 марта 2019

Я хочу проанализировать String и проверить, содержит ли оно определенные ключевые слова, такие как "1 минута" во время произнесения текста системой.

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

Мой код для преобразования текста в речь:

func Speech()  {
    do {
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, with: .mixWithOthers)
        try AVAudioSession.sharedInstance().setActive(true)
        print("Session is Active")
    } catch {
        print(error)
    }

    if !speechSynthesizer.isSpeaking {
        self.VoiceString = self.VoiceString+self.DirectionsString
        let speechUtterance = AVSpeechUtterance(string: self.VoiceString)
        var voiceToUse: AVSpeechSynthesisVoice?
        speechUtterance.voice = voiceToUse
        speechUtterance.rate = Float(self.RangeSlider.selectedMinValue/2)
        speechSynthesizer.speak(speechUtterance)
    }
    else {
        speechSynthesizer.continueSpeaking()
    }
    animateActionButtonAppearance(shouldHideSpeakButton: true)
}

Можно ли обнаружить определенную строку с помощью AVSpeechSynthesizer или у вас есть другой подход?

1 Ответ

3 голосов
/ 06 марта 2019

Вы должны реализовать делегат AVSpeechSynthesizer и добавить следующий код:

var myText = "This is my text, which will be detect on text-to-speech operation"

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

Реализовано willSpeakRangeOfSpeechString, которое будет называть каждое произнесенное слово системой в текстовой строке. Вы можете реализовать contains() метод String type для определения конкретной строки в вашем тексте.

extension TextToSpeechVC: AVSpeechSynthesizerDelegate {

    func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, willSpeakRangeOfSpeechString characterRange: NSRange, utterance: AVSpeechUtterance) {

        let string = self.myText[characterRange.lowerBound..<characterRange.upperBound]

        if string.trim == "operation" {
            print("string = \(string)")
        }
    }
}

Добавить String расширение для индекса диапазона.

extension String {

    var trim: String {
        return self.trimmingCharacters(in: .whitespacesAndNewlines)
    }


    subscript (bounds: CountableClosedRange<Int>) -> String {
        let start = index(startIndex, offsetBy: bounds.lowerBound)
        let end = index(startIndex, offsetBy: bounds.upperBound)
        return String(self[start...end])
    }

    subscript (bounds: CountableRange<Int>) -> String {
        let start = index(startIndex, offsetBy: bounds.lowerBound)
        let end = index(startIndex, offsetBy: bounds.upperBound)
        return String(self[start..<end])
    }
}

Надеюсь, это поможет вам.

...