AVSpeechSynthesizer использует динамик Apple Watch, а не гарнитуру в качестве выходного канала - PullRequest
0 голосов
/ 23 марта 2020

Я использую AVSpeechSynthesizer внутри расширения приложения WatchKit.

Лог c прост и может быть кратко изложен следующим образом:

let utterance = AVSpeechUtterance(string: "Hello, World")
synth.speak(utterance)

Это работает нормально, но речь всегда передается через встроенные динамики Apple Watch.
Мне требуется, чтобы речь проходила через мои аэродромы, которые подключены к моему iPhone.

Ранее я делегировал задачу на iPhone через WatchConnectivity, который работал хорошо, но из-за задержек в WatchConnectivity связи я переместил управляющую логику c прямо на Apple Watch.
Я думал, что watchOS внутренне передаст звук на устройство BLE, но все идет не так, как планировалось.

Может быть, я что-то упустил?
Нужно ли указывать аудиоканал synth.outputChannels?
Нужно ли показывать всплывающее окно AirPlay с просьбой выбрать аудио источник вывода?
Если да, то как мне go узнать об этом?

Я не могу найти много информации по этому вопросу в Интернете, поэтому любая помощь будет принята с благодарностью.

Я просто пытаюсь найти способ передать речь через мои AirPods.

1 Ответ

1 голос
/ 24 марта 2020

Вы можете использовать следующий код для отображения средства выбора аудиоустройства и направления звука на выбранное устройство:

let session = AVAudioSession.sharedInstance()
do {
    try session.setCategory(AVAudioSession.Category.playback,
                                mode: .default,
                                policy: .longFormAudio,
                                options: [])
    session.activate(options: []) { (success, error) in
            // Check for an error and play audio.
        if let err = error) {
            print(err)
        }
    }
} catch {
    print(error)
}
...