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