Я использую синтезатор речи в AVFoundation, создавая такой экземпляр голоса:
import AVFoundation
class CanSpeak {
let voices = AVSpeechSynthesisVoice.speechVoices()
let voiceSynth = AVSpeechSynthesizer()
var voiceToUse: AVSpeechSynthesisVoice?
init(){
for voice in voices {
if voice.name == "Arthur"
{
voiceToUse = voice
}
}
}
func sayThis(_ phrase: String){
let utterance = AVSpeechUtterance(string: phrase)
utterance.voice = voiceToUse
utterance.rate = 0.5
voiceSynth.speak(utterance)
}
}
У меня две проблемы.
- Что касается №1, вероятно, этого не произойдет. Синтезатор речи - это общий ресурс системы, поэтому то, как система обрабатывает планирование нескольких запросов, находится вне нашего контроля как клиентов API. (Обратите внимание, что если вы повторно используете один и тот же синтезатор, он выстраивает в очередь дополнительные высказывания, но если вы создаете несколько синтезаторов, он не может озвучивать запрошенные высказывания, пока говорит другой синтезатор.)
2 - некоторые странные ошибки, которые я не понимаю при загрузке:
Параллелизма нет. Вызов этой функции несколько раз приводит к очереди строк для выступления. Я не хочу этого. Если есть несколько вызовов этой функции, близко друг к другу, я бы хотел, чтобы голос немедленно начал говорить, даже если это означает, что он говорит через себя. Как мне этого добиться?