Swift - изменение громкости во время речевого высказывания

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

ОБНОВЛЕНИЕ: я смог получить доступ к делегату, используя следующие изменения в моем viewcontroller:

protocol theSpeechSynth {
    func theSpeechSynthVar() -> AVSpeechSynthesizer
}

class GameViewController: UIViewController, theSpeechSynth, AVSpeechSynthesizerDelegate {

    let theSpeechSynthesizer = AVSpeechSynthesizer()

    func theSpeechSynthVar() -> AVSpeechSynthesizer {
        return theSpeechSynthesizer
    }
    func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer,
                                willSpeakRangeOfSpeechString characterRange: NSRange,
                                utterance: AVSpeechUtterance) {

        print(utterance.volume)
        utterance.volume = 1.0
        print(utterance.volume)
    }

    func viewDidLoad() {
        super.viewDidLoad()
        tts.speechSynthesizer = theSpeechSynthVar()

        ...
    }
}



import AVFoundation
class announceIt {
    let voice = AVSpeechSynthesisVoice(identifier: AVSpeechSynthesisVoiceIdentifierAlex)
    let speechSynthesizer = AVSpeechSynthesizer()
    let voiceToUse = AVSpeechSynthesisVoice(language: "en-GB")
    var speechUtterance: AVSpeechUtterance = AVSpeechUtterance()

    func speak(speakIt: String) {
        speechUtterance = AVSpeechUtterance(string: speakIt)
        speechUtterance.voice = voiceToUse
        // theVolumes.voice is constantly being updated by the fader
        speechUtterance.volume = 0.5
        speechSynthesizer.speak(speechUtterance)
    }

    func volumeChange() {
        speechUtterance.volume = Float( theVolumes.voice )
    }
}

Вызывая это просто:

let tts: AnnounceIt = AnnounceIt()
// I added this for the delegate:
tts.speechSynthesizer = theSpeechSynthesizer  // from the ViewController
tts.speak(speakIt: "I want this volume to go up and down when the volume changes but I can't get it do to that, it will only be the volume when it starts.")

Это печатает:

0.5
1.0
1.0
1.0
1.0
1.0
...

Громкость не увеличивается... это НЕ полная реализация высказывания.

1 ответ

Изменение свойств класса AVSpeechUtterance после включения в AVSpeechSynthesizer не будет иметь никакого эффекта. Пожалуйста, проверьте документацию AVSpeechUtterance.

 /* Setting these values after a speech utterance has been enqueued will have no effect. */

open var rate: Float // Values are pinned between AVSpeechUtteranceMinimumSpeechRate and AVSpeechUtteranceMaximumSpeechRate.

open var pitchMultiplier: Float // [0.5 - 2] Default = 1

open var volume: Float // [0-1] Default = 1
Другие вопросы по тегам