iOS 应用程序蓝牙音频即将推出 "Phone Mode."

iOS App Bluetooth Audio Coming out in "Phone Mode."

我有一个 iOS 应用程序可以生成文本到语音 (TTS) 音频 (AVSpeechSynthesizer)。一位用户说他的汽车蓝牙扬声器的音频以“phone 模式”(大概是拨打或接听 phone 电话时的音频)输出,而不是应用程序的“音乐模式”就像 Youtube 以及音乐和地图应用程序一样。这也会导致 phone 来电的处理无法与车载蓝牙扬声器一起正常工作。

不幸的是,我无法理解为什么,甚至无法理解“phone”和“音乐”模式之间的区别。当使用 phone 的扬声器时,处理 phone 来电就没有这样的问题。问题仅与蓝牙有关。

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)

这段代码还有什么应该做的,或者可能做错了吗?

提前致谢。

您所说的“phone 模式”是 HFP(免提模式)。您包含了 .allowBluetooth,这意味着“更喜欢使用 HFP”。 (这是一个非常令人困惑的枚举名称。)

您所说的“音乐模式”是 A2DP,您通过 .allowBluetoothA2DP 允许使用它。

但是,A2DP 不是双向的,您使用 .playAndRecord 请求。所以会话使用HFP。

HFP 的音频质量明显比 A2DP 差。

对于 TTS,应该不需要 microphone,因此您可以将 .playAndRecord 替换为 .play(我可能会删除 .allowBluetooth).如果您需要 microphone 用于其他目的,您应该放弃 .allowBluetoothA2DP,并且没有(标准)方法可以避免使用 HFP 通过蓝牙进行通信。

如果您是汽车和应用程序的制造商,则有非标准的方法可以解决此问题。您可以打开到 phone 的第二个 A2DP 通道,或者您可以通过 BLE 或 iAP2 实现专有的 microphone 协议。但是在与 iPhone 交谈时,无法使用标准设备执行此操作。 (如果两个设备都支持 aptX,还有一些其他选项,但 iPhone 不支持,而且我还没有听到任何提示。)

请注意,您可以随时更改类别和选项,以及激活或停用会话。所以如果你有时候需要microphone,你可以只在需要的时候切换到.playAndRecord,尽量减少用户不需要microphone.[=18时的影响=]