首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与AVSpeechUtterance混合使用AVAudioSession

与AVSpeechUtterance混合使用AVAudioSession
EN

Stack Overflow用户
提问于 2013-12-05 23:01:50
回答 1查看 3.2K关注 0票数 1

我有一个问题,我想让iPod在后台播放音乐,在我的应用程序中,我想让AVSpeechUtterance降低iPod的音量,播放一串文本,然后我想让iPod继续播放。我尝试过几种方法,但从未让AVAudioSession和AVSpeechUtterance很好地协同工作。我可以让iPod停止,暂停片刻,然后重新开始播放。我可以看到我的字符串被传递给AVSpeechUtterance,但它没有优先于扬声器播放。下面是我的代码:

视图did加载:

代码语言:javascript
复制
   - (void)viewDidLoad
   {
            //set the audio session for my app to play from the TTS library
            NSError *error;
            audioSession = [AVAudioSession sharedInstance];
            [audioSession setCategory:AVAudioSessionCategoryAmbient withOptions:1  error:&error];
            [audioSession setActive:YES error:&error];
            if(error){
                NSLog(@"Audio Error %@", error);
            }

            syn = [[AVSpeechSynthesizer alloc] init];
            syn.delegate = self;

            iPodMusicPlayer = [[MPMusicPlayerController alloc] init];

   }

下面是我的语音函数:

代码语言:javascript
复制
   -(void)speech:(NSString *)string
   {
             if(audioSession.isOtherAudioPlaying){
                 wasPlaying = YES;
                 NSLog(@"Other audio is playing");
                 [iPodMusicPlayer pause];
             }

             AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:string];
             utterance.rate = 0.3f;
             utterance.volume = 1.0;
             [syn speakUtterance:utterance];

   }

在语音结束后调用的AVSpeechSynthesizer委托方法

代码语言:javascript
复制
   - (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didFinishSpeechUtterance:(AVSpeechUtterance *)utterance
   {
         if(wasPlaying){
            NSLog(@"Start Playing");
            [iPodMusicPlayer play];
            wasPlaying = NO;
         }
   }

我查看了AVAudioSession here上的苹果文档,看起来我已经正确地实现了所有的东西。有人知道我哪里出错了吗?

EN

回答 1

Stack Overflow用户

发布于 2013-12-08 06:26:08

我只是想让每个人知道,经过一些故障排除后,这就是我能够解决问题的方法。我不确定我是否喜欢这个解决方案,并正在努力改进它。

视图Did加载

代码语言:javascript
复制
    - (void)viewDidLoad
    {
            syn = [[AVSpeechSynthesizer alloc] init];
            syn.delegate = self;

            iPodMusicPlayer = [[MPMusicPlayerController alloc] init];
    }

语音功能

代码语言:javascript
复制
    -(void)speak:(NSString *)string
    {

            audioSession = [AVAudioSession sharedInstance];

            NSError *setCategoryError = nil;
            NSError *activationError = nil;
            BOOL success = [audioSession setCategory:AVAudioSessionCategoryPlayback
                withOptions:AVAudioSessionCategoryOptionMixWithOthers error:&setCategoryError];

            [audioSession setActive:YES error:&activationError];

            if(audioSession.isOtherAudioPlaying){
                wasPlaying = YES;
                NSLog(@"Other audio is playing");
                [iPodMusicPlayer pause];
            }

            NSLog(@"Success %hhd", success);

            AVSpeechUtterance *utterance = [AVSpeechUtterance           speechUtteranceWithString:string];
            utterance.rate = 0.3f;
            utterance.volume = 1.0;
            [syn speakUtterance:utterance];
     }

在语音结束后调用的AVSpeechSynthesizer委托方法

代码语言:javascript
复制
     - (void)speechSynthesizer:(AVSpeechSynthesizer *)synthesizer didFinishSpeechUtterance:(AVSpeechUtterance *)utterance
     {
            if(wasPlaying){
                NSLog(@"Start Playing");
               [iPodMusicPlayer play];
               wasPlaying = NO;
            }
     }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20403331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档