我有一个 iOS 应用程序,可以生成文本转语音 (TTS) 音频(AVSpeechSynthesizer
)。一位用户表示,他的汽车蓝牙扬声器上的音频以“电话模式”(大概是拨打或接听电话时的音频)发出,而不是像 Youtube 以及音乐和地图应用程序那样的“音乐模式”是。这也会导致车载蓝牙扬声器无法正常处理来电。
不幸的是,我不明白为什么,甚至不知道“电话”和“音乐”模式之间有区别。使用手机扬声器时,处理来电不存在此类问题。问题仅在于蓝牙。
The 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)
这段代码还有什么应该做的,或者可能做错了什么?
提前致谢。
您所说的“电话模式”是 HFP(免提模式)。你已经包括了.allowBluetooth
意思是“更喜欢使用 HFP”。 (这是一个非常令人困惑的枚举名称。)
您所说的“音乐模式”是 A2DP,您可以通过.allowBluetoothA2DP
.
但是,A2DP 不是双向的,您需要使用.playAndRecord
。因此会话使用 HFP。
HFP 的音频质量明显比 A2DP 差。
对于 TTS,不需要麦克风,因此您可以替换.playAndRecord
with .play
(我可能会放弃.allowBluetooth
)。如果您需要麦克风用于其他目的,则应该放弃.allowBluetoothA2DP
,并且没有(标准)方法可以避免使用 HFP 通过蓝牙进行通信。
如果您是汽车和应用程序的制造商,则可以使用非标准方法来解决此问题。您可以打开到手机的第二个 A2DP 通道,也可以通过 BLE 或 iAP2 实施专有的麦克风协议。但在与 iPhone 通话时,标准设备无法做到这一点。 (如果两台设备都支持 aptX,还有一些其他选项,但 iPhone 不支持,而且我也没有听到任何暗示它们会支持。)
请注意,您可以随时更改类别和选项,以及激活或停用会话。所以如果你有时需要麦克风,你可以切换到.playAndRecord
仅在需要时才使用,并在用户不需要麦克风时最大程度地减少对用户的影响。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)