【发布时间】:2021-10-14 05:02:40
【问题描述】:
我有一个 iOS 应用程序正在生成文本到语音 (TTS) 音频 (AVSpeechSynthesizer)。一位用户说,他的汽车蓝牙扬声器上的音频是以“电话模式”(可能是拨打或接听电话时的音频)而不是“音乐模式”,就像 Youtube 等应用程序以及音乐和地图应用程序那样是。这也会导致车载蓝牙扬声器无法正常处理来电。
不幸的是,我不明白为什么,甚至“电话”和“音乐”模式之间存在区别。使用手机的扬声器时,处理来电没有这样的问题。问题仅在于蓝牙。
AVAudioSession初始化代码如下。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
do {
let session = AVAudioSession.sharedInstance()
try session.setCategory(AVAudioSession.Category.playAndRecord, options: [.defaultToSpeaker, .allowBluetooth, .allowBluetoothA2DP])
try session.overrideOutputAudioPort(AVAudioSession.PortOverride.none)
try session.setActive(true, options: .notifyOthersOnDeactivation)
} catch let error {
print("audioSession properties weren't set. Error: \(error.localizedDescription)")
}
return true
}
另外,AVSpeechSynthesizer 代码如下
let synthesizer = AVSpeechSynthesizer()
let utterance = AVSpeechUtterance(string: newText)
synthesizer.speak(utterance)
这段代码还有什么其他应该做的,或者可能做错了吗?
提前致谢。
【问题讨论】:
-
请注意,
.none是overrideOutputAudioPort的默认值,但与defaultToSpeaker相反,因此不太清楚您通过两者传递的目的是什么。 -
显然我也不清楚,但我认为
session.overrideOutputAudioPort(AVAudioSession.PortOverride.none)应该被删除? -
肯定是那个(因为它是默认设置)。问题是您是否想要 defaultToSpeaker(表示通过手机扬声器而不是手机接收器播放音频)
-
我希望它在连接后通过蓝牙扬声器(哪个是接收器?)播放。
-
我以前读过它,但我对术语有点迷失了。然后我没有立即将“电话模式”(如用户所述)等同于 HFP。我会牢记这一点。再次感谢您的帮助!
标签: ios text-to-speech avaudiosession ios-bluetooth avspeechsynthesizer