如何通过呼叫接收扬声器播放 AVSpeechSynthesizer?

Posted

技术标签:

【中文标题】如何通过呼叫接收扬声器播放 AVSpeechSynthesizer?【英文标题】:How to play AVSpeechSynthesizer through call receiver speaker? 【发布时间】:2016-07-27 07:44:53 【问题描述】:

我喜欢通过呼叫接收器扬声器播放音频,目前我正在使用它来播放一些文本作为音频。

AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:_strTextCheck];
    AVSpeechSynthesizer *syn = [[AVSpeechSynthesizer alloc] init];
    [syn speakUtterance:utterance];

我知道了,但这不适用于 AVSpeechSynthesizer:

[AVAudiosession  overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];

它在普通扬声器上正常工作,但我想通过呼叫接收器扬声器播放,可以这样做吗?

【问题讨论】:

【参考方案1】:

默认行为是通过呼叫接收者播放。因此,如果您取消设置覆盖 - 或者首先不设置它 - 您应该得到您所追求的行为:

[[AVAudioSession sharedInstance] 
     overrideOutputAudioPort:AVAudioSessionPortOverrideNone
                       error:nil];

这是一个完整的例子。您还需要设置 audioSession 类别。

- (void)playVoice 
    [[AVAudioSession sharedInstance] 
             setCategory:AVAudioSessionCategoryPlayAndRecord
                  error:nil];

    //try one or the other but not both...

    //[self playVoiceOnSpeaker:@"test test test"];

    [self playVoiceOnReceiver:@"test test test"];



-(void)playVoiceOnSpeaker:(NSString*)str

    [[AVAudioSession sharedInstance]  
         overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker
                           error:nil];
    [self playVoiceByComputer:str];


-(void)playVoiceOnReceiver:(NSString*)str

    [[AVAudioSession sharedInstance]
         overrideOutputAudioPort:AVAudioSessionPortOverrideNone
                           error:nil];
    [self playVoiceByComputer:str];


-(void)playVoiceByComputer:(NSString*)str

    AVSpeechUtterance *utterance = 
          [AVSpeechUtterance speechUtteranceWithString:str];
    AVSpeechSynthesizer *syn = [[AVSpeechSynthesizer alloc] init];
    [syn speakUtterance:utterance];

【讨论】:

但它仍然在扬声器上运行 bro paste.ofcode.org/uEi8M5FjcGhB97NurcEEsM 通过接收器扬声器它没有运行 @KishoreKumar - 查看我的更新 - 您需要检查您的 audioSession 类别是否正确【参考方案2】:

这对我有用:

try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, with: [.defaultToSpeaker])

【讨论】:

以上是关于如何通过呼叫接收扬声器播放 AVSpeechSynthesizer?的主要内容,如果未能解决你的问题,请参考以下文章

在电话呼叫 iOS sdk 期间播放音乐文件的问题

Android:通过电话线播放音频文件

如何让音乐从接收器而不是扬声器播放?

在 iOS 上从前置扬声器播放音乐?

有没有办法给某人打电话并在android中播放音频文件?

如何检测音频当前是不是正在 Android 手机扬声器上播放?