【问题标题】:IOS/Swift/AVSpeechSynthesizer: Control Speed of Enqueued UtterancesIOS/Swift/AVSpeechSynthesizer:控制排队话语的速度
【发布时间】:2019-07-24 15:54:34
【问题描述】:

为了本着this tutorial 的精神对有声读物的语音施加更大的控制,尽管我没有完全遵循它,但我尝试发送较小的字符串片段,例如单独的块中的短语。语音合成器将每个话语排入队列并一个接一个地说出它们。从理论上讲,这应该可以让您更好地控制,让语音听起来不那么机械化。

我可以让合成器按顺序说出这些块,但是每个块之间有很长的延迟,所以这听起来比同时发送所有文本要糟糕得多。

有没有办法加快排队速度,让话语一个接一个地说出,没有延迟?

将属性:utt.preUtteranceDelay 和 utt.postUtteranceDelay 设置为零秒似乎没有任何效果

这是我的代码:

phraseCounter = 0
func readParagraph(test: String) {
              let phrases = test.components(separatedBy: " ")
            for phrase in phrases {
              phraseCounter = phraseCounter+1
                let utt = AVSpeechUtterance(string:phrase)
                let preUtteranceDelayInSecond = 0
                let postUtteranceDelayInSecond = 0
                utt.preUtteranceDelay = TimeInterval.init(exactly:preUtteranceDelayInSecond)!
                utt.postUtteranceDelay = TimeInterval.init(exactly:postUtteranceDelayInSecond)!
                 voice.delegate = self
               if (phraseCounter == 2) {
    utt.rate = .8
}
voice.speak(utt)
}        
}

【问题讨论】:

    标签: ios swift avfoundation avspeechsynthesizer


    【解决方案1】:

    有没有办法加快排队速度,让话语一个接一个地说出,没有延迟?

    正如您所做的那样,唯一的方法是将 post 和 pre UtteranceDelay 属性设置为 0,顺便说一下,这是默认值。

    按照here的推荐,我在后面实现了代码sn-p(Xcode 10、Swift 5.0和iOS 12.3.1)来检查不同UtteranceDelay值的影响⟹ 0 是提高排队话语速度的最佳解决方案

    var synthesizer = AVSpeechSynthesizer()
    var playQueue = [AVSpeechUtterance]()
    
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
    
        for i in 1...10 {
    
            let stringNb = "Sentence number " + String(i) + " of the speech synthesizer."
    
            let utterance = AVSpeechUtterance(string: stringNb)
            utterance.rate = AVSpeechUtteranceDefaultSpeechRate
            utterance.pitchMultiplier = 1.0
            utterance.volume = 1.0
    
            utterance.postUtteranceDelay = 0.0
            utterance.preUtteranceDelay = 0.0
    
            playQueue.append(utterance)
        }
    
        synthesizer.delegate = self
    
        for utterance in playQueue {
            synthesizer.speak(utterance)
        }
    }
    

    如果延迟对于代码中的“0”值来说太重要了,那么传入的字符串可能是问题所在? (根据您的需要调整上面的代码 sn-p)

    【讨论】:

    • 我将代码中的 0 更改为 0.0,并像您一样将短语放入数组中,结果相同。所以我想,除了你可以用上述方法之外,没有什么可以加快速度。项目之间的延迟在段落或句子级别是可以接受的,但对于简短的一、二或三个单词短语则不可接受。
    猜你喜欢
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多