unity接入讯飞语音识别iOS SDK的遇到的棘手问题!

C#

浏览数:80

2019-8-30

AD:资源代下载服务

前言:公司做的幼儿早教的东西,界面都是unity 3D的,iOS这边只负责给他们提供iOS端的接口,项目期间出现了这个问题让我苦苦不能解决,自己也是百般查资料,百般测试,最终得到一些成果。
问题描述:unity的界面展示需要背景音乐和语音识别的功能,我iOS写好的接入讯飞语音识别的文件嵌入到unity导出的Xcode工程中,当开始录音进行识别的时候,背景音乐和识别错误提示音都正常,当结束语音识别的时候,背景音乐就没有声音了,是一直都不会再有声音。控制台打印的信息中觉得最可疑的就是:

错误信息: [avas] AVAudioSession.mm:1074:-[AVAudioSession setActive:withOptions:error:]: Deactivating an audio session that has running I/O. All I/O should be stopped or paused prior to deactivating the audio session.

然后就以这个问题为出发点在网上搜啊搜,又类似该问题的方法都试了,但是没有得到解决。
但是发现,引起上述错误信息的方法是将下面这个单例方法中的Action参数设置为NO:

[[AVAudioSession sharedInstance] setActive:<#(BOOL)#> withOptions:<#(AVAudioSessionSetActiveOptions)#> error:<#(NSError * _Nullable __autoreleasing * _Nullable)#>]

然后我在我的工程文件中重新写这个方法,将Action参数设置为YES,但是无济于事,也就是说,只要将Action设置为NO了,就已经出现上述错误了,再设置为YES也只是徒劳无功。
确定问题方向:其实这个问题在我自己创建Xcode工程接入讯飞语音sdk,测试讯飞语音的时候是没有问题的,也就是说这个问题是unity导出的Xcode工程中,接入讯飞语音才会出现的问题。确定讯飞语音中或者unity的音乐播放转化成iOS时,在某个地方调用了上面这个单例方法,将Action设置为NO了,所以就要讲设置为NO的地方找到并修改,但是讯飞不是开源的,unity也看不到代码,感觉又到了问题的尽头。
但是我发现setAction:这个方法是有返回值的,返回值类型是BOOL,那这个返回值是不是就是和setAction:的值一样的呢?于是抱着试一试的心理(万一成功了呢)做了一下操作:
首先:写一个AVAudioSession的分类,在这个分类的.m中重写这个类的setAction:方法,将该方法的返回值强制返回YES。

#import "AVAudioSession+AddAction.h"

@implementation AVAudioSession (AddAction)

- (BOOL)setActive:(BOOL)active withOptions:(AVAudioSessionSetActiveOptions)options error:(NSError * _Nullable __autoreleasing *)outError {
    return YES;
}

@end

但是发现这个分类是继承自AVFAudio的,会报错,但是我们知道这个框架是继承自AVFoundation的,于是我讲.h中的#import <AVFAudio/AVFAudio.h>换成#import <AVFoundation/AVFoundation.h>,错误就消失了。

#import <AVFoundation/AVFoundation.h>

@interface AVAudioSession (AddAction)

@end

最后就运行程序,哇哦,背景音乐竟然没有停止播放,好像是找到了问题的解决办法了。
本人也是初次接触unity交互,这个解决办法暂时还不清楚会不会引起其他的问题,应该是不适用于必须将Action设置为NO的项目,如有更好解决办法还请多赐教。

作者:走向菜鸟的菜鸟