Как я могу сделать небольшие 1-5 секундные паузы в тексте к речи, произнося строку в Swift? - PullRequest
0 голосов
/ 14 апреля 2019

Я пытаюсь использовать функцию AVFoundation Text to Speech в Swift, чтобы высказать пользовательскую строку, которая изменяется в зависимости от параметра. Как мне сделать паузы между словами?

Допустим, это моя строка:

var spokenSentence = "I like Toast with lots of Butter, but banana is nice"

Как я могу сделать паузу в TTS, например, через 3 секунды после "Butter"?

Это мой код относительно TTS:

var spokenSentence = "I like Toast with lots of Butter, but banana is nice"
let synth = AVSpeechSynthesizer()
var utterance = AVSpeechUtterance(string: spokenSentence)

и позже

synth.speak(utterance)

Вне Swift на MacOS я слышал, что вы можете использовать [[slnc 1000]] есть ли аналогичная функция в Swift?

1 Ответ

0 голосов
/ 14 апреля 2019

Кажется, AVSpeechUtterance имеет такие свойства, как preUtteranceDelay или postUtteranceDelay. Вы можете использовать такие функциональные возможности при написании некоторого кода предварительной обработки:

extension AVSpeechSynthesizer {
    func speekWithDelay(_ text: String) {
        let pattern = #"([^{]*)(?:\{([0-9]+(?:\.[0-9]+))\})?"#
        let regex = try! NSRegularExpression(pattern: pattern)
        let matches = regex.matches(in: text, options: .anchored, range: NSRange(0..<text.utf16.count))
        for match in matches {
            let utteranceText = text[Range(match.range(at: 1), in: text)!]
            let utterance = AVSpeechUtterance(string: String(utteranceText))
            if let range = Range(match.range(at: 2), in: text) {
                let delay = TimeInterval(text[range])!
                utterance.postUtteranceDelay = delay
            }
            speak(utterance)
        }
    }
}

Используйте это как:

let synth = AVSpeechSynthesizer()

@IBAction func speakButtonPressed(_ sender: Any) {
    let spokenSentence = "I like Toast with lots of Butter,{3} but banana is nice"
    synth.speekWithDelay(spokenSentence)
}

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

...