关于ios:在Swift中使用@IBAction按钮进行非即时更改

Making a non-instantaneous change with an @IBAction button in Swift

我试图通过单击应用程序中的按钮来更改AVSpeechUtterance的语速属性值。然后,当我按下"讲话"按钮时,我希望此值继续使用。

如果该解释不够清楚,请想象一下:

共有三个按钮:一个,两个和三个。
当用户按下一个时,发声率的值发生变化(第二个和第三个相同)。

然后,在按下前三个按钮之一后,用户按下另一个按钮以激活语音。这种话语将保留速率值并将其应用于语音。

这是我尝试过但无法使用的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import UIKit
import AVFoundation

class SecondViewController: UIViewController {

@IBOutlet var minutesLabel: UITextField!

@IBOutlet var secondsField: UITextField!

func speak(sender: AnyObject) {

    let speechUtterance = AVSpeechUtterance(string:exampleSpeech)

    speechSynthesizer.speakUtterance(speechUtterance)
}

@IBOutlet var result: UILabel!

@IBAction func verySlow(sender: UIButton) {

    let verySlowButtonPressed = true

    let talkingSpeed = 90

    let minutesValue : Double = (minutesLabel.text as NSString!).doubleValue
    let secondsValue = (secondsField.text as NSString!).doubleValue
    let secondsToMinutes = secondsValue / 60
    let compiledTime = Double(minutesValue) + Double(secondsToMinutes)
    let resultingWords = Double(compiledTime) * Double(talkingSpeed)
    let resultCeiling = ceil(resultingWords)

    result.text ="\\(String(format:"%.0f", resultCeiling)) words"

    if verySlowButtonPressed {

        speechUtterance.rate = 0.25
        speechUtterance.pitchMultiplier = 0.25
        speechUtterance.volume = 0.75
    }

}


@IBAction func speakButton(sender: AnyObject) {

    speak(exampleSpeech)
}

speak函数中,每次调用时都会创建一个新的AVSpeechUtterance实例。调用verySlow函数时,它将在我假定的名为speechUtterance的类属性上设置ratepitchMultipliervolume。由于您每次在speak中创建一个新的AVSpeechUtterance时,将不会在同一实例上设置您在verySlow中设置的那些属性。

解决此问题的一种方法是在类中创建ratepitchMultipliervolume属性,在verySlow函数中进行设置,然后在创建后在speechUtterance上进行设置在speak函数中。

类似的东西:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
var rate: Float?
var pitchMultiplier: Float?
var volume: Float?

func speak(sender: AnyObject) {

    let speechUtterance = AVSpeechUtterance(string:exampleSpeech)

    if let rate = self.rate {
        speechUtterance.rate = rate
    }
    if let pitchMultiplier = self.pitchMultiplier {
        speechUtterance.pitchMultiplier = pitchMultiplier
    }
    if let volume = self.volume {
        speechUtterance.volume = volume
    }

    speechSynthesizer.speakUtterance(speechUtterance)
}

@IBAction func verySlow(sender: UIButton) {

    // ... whatever other code you need here ...

    self.rate = 0.25
    self.pitchMultiplier = 0.25
    self.volume = 0.75

}


不确定,但是这些是语音速率的值,请尝试使用它们。希望对您有所帮助。

iOS 9
非常慢-0.42
较慢-0.5
我的正常-0.53
更快-0.56

iOS早期版本的值有所不同,请在实施解决方案时记住这一点。