【问题标题】:iOS App Bluetooth Audio Coming out in "Phone Mode."iOS 应用蓝牙音频以“电话模式”出现。
【发布时间】: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)

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

提前致谢。

【问题讨论】:

  • 请注意,.noneoverrideOutputAudioPort 的默认值,但与 defaultToSpeaker 相反,因此不太清楚您通过两者传递的目的是什么。
  • 显然我也不清楚,但我认为 session.overrideOutputAudioPort(AVAudioSession.PortOverride.none) 应该被删除?
  • 肯定是那个(因为它是默认设置)。问题是您是否想要 defaultToSpeaker(表示通过手机扬声器而不是手机接收器播放音频)
  • 我希望它在连接后通过蓝牙扬声器(哪个是接收器?)播放。
  • 我以前读过它,但我对术语有点迷失了。然后我没有立即将“电话模式”(如用户所述)等同于 HFP。我会牢记这一点。再次感谢您的帮助!

标签: ios text-to-speech avaudiosession ios-bluetooth avspeechsynthesizer


【解决方案1】:

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

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

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

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

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

如果您是汽车和应用的制造商,则可以通过非标准方法解决此问题。您可以为手机打开第二个 A2DP 通道,或者您可以通过 BLE 或 iAP2 实现专有的麦克风协议。但是在与 iPhone 通话时,使用标准设备无法做到这一点。 (如果两台设备都支持 aptX,还有其他一些选项,但 iPhone 不支持,而且我没有听到任何暗示它们会支持。)

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

【讨论】:

  • 您好 Rob,非常感谢您的回答。是的,该应用确实需要麦克风,因为它在询问用户各种问题时也使用语音识别。在我实际激活和停用会话并分别在进行 TTS 和语音识别时调用setCategory 以在.play.playAndRecord 之间切换之前,但这会产生断开蓝牙连接或在任何时候引起恼人的哔哔声的副作用会话已停用并重新激活。
  • 是的,如果您正在收听蓝牙麦克风并想在同一设备上播放蓝牙音频,您将不得不使用 HFP。没有其他标准协议可以做到这一点并且 iPhone 支持。这意味着它会干扰用户的电话。一种可能的解决方案是使用汽车的扬声器,但使用手机的麦克风(只需取出allowBluetooth 即可)。但如果用户没有意识到正在使用哪个麦克风,他们可能会感到困惑。
  • 亚马逊 Alexa 应用程序之类的东西通过将自定义固件整合到蓝牙设备中来实现您所描述的功能。耳塞制造商做了大量工作以使 Alexa 无缝工作;亚马逊的应用程序无法自行完成。根据您的工作,您可能会探索他们的语音互操作性计划;你也许可以驾驭他们的燕尾服。我还没有深究。 developer.amazon.com/en-US/alexa/voice-interoperability
  • 我认为使用汽车扬声器和 iPhone 麦克风可能是可以接受的。这绝对比干扰用户的电话要好。此外,似乎不使用 HFP 的音频质量要好得多。
  • 现在效果很好,用户很高兴。非常感谢,罗伯。
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 2013-01-14
  • 1970-01-01
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多