美文网首页iOS菜鸟联盟iOS开发资料收集区iOS开发技术分享
unity接入讯飞语音识别iOS SDK的遇到的棘手问题!

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

作者: 走向菜鸟的菜鸟 | 来源:发表于2017-01-04 10:53 被阅读1470次

前言:公司做的幼儿早教的东西,界面都是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的项目,如有更好解决办法还请多赐教。

相关文章

网友评论

  • 千叶林:关闭语音这边,unity中声音是从扬声器中出的,但是开启后,就从听筒中出现了。请问下博主有遇到过吗?
    千叶林:@走向菜鸟的菜鸟 好的,谢了
    走向菜鸟的菜鸟:@千叶林 当时没遇到,现在没再做那一块了,具体不太清楚了,我觉得可以查查音频输出方式的东西。
  • 指尖猿:谢谢..#import "AVAudioSession+AddAction.h"
    这个解决了我的困扰..
    [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.
  • 517fd98861ff:我用了你的方法解决讯飞语音合成完会停止APP内音乐的播放。
    但是出现了一个新的问题,如果我播放的是其他APP的音乐,其他APP的音乐声音变小了不能恢复。
    问题最后的解决方式是把讯飞的语音合成改成了原生的AVSpeechSynthesizer。
    其中提到了你的问题,有空可以看一下:https://www.jianshu.com/p/264b8cd150bd
    走向菜鸟的菜鸟:@开心王 非常感谢。
  • 过客_4043:您好,我说一下我的问题,请您帮我分析一下可能的原因:unity中需要播放声音片段的功能,当我使用过讯飞语音合成的功能后,unity中播放语音片段的功能就失效了。我猜想是讯飞语音合成中的某些东西的修改,限制了ios中声音播放的开关。
    请您帮我看一下,我是做unity的第一次接触ios,有点懵逼。
    过客_4043:@走向菜鸟的菜鸟 哦😯,感谢大佬的解答,谢谢
    走向菜鸟的菜鸟:@过客_4043 很长时间了,有点模糊了,我也说不清了,可能只是配置方面起了冲突吧。
    过客_4043:感谢大佬,用了您的方法成功解决了我的问题。
    不过我还是想知道,这是讯飞修改了ios的那些部分(可能我不懂,不过想有个印象)?:stuck_out_tongue_closed_eyes:
  • d7e561f21396:楼主,能发个demo,学习学习吗
    这个unity接入讯飞语音识别iOS SDK的搞几天都没搞定,唉
    所以能否发个demo学习,谢谢
    走向菜鸟的菜鸟:@仙魁澔燃 没有demo诶,这也是很久之前做的了
  • Silenceapple:unity 和 swift 怎么交互呢?
    Silenceapple:这个肯定是没有的。
    走向菜鸟的菜鸟:@Silenceapple 不知道unity导出的xcode工程有没有选择swift语言的方式。
  • Silenceapple:大神能给个demo么?171856863@qq.com 感激不尽
    走向菜鸟的菜鸟:@Rumbles 我当时是一个周没找到解决办法。:smile:
    Rumbles:厉害啊,一下午不知道为什么
    走向菜鸟的菜鸟:没有写demo诶,那个分类很简单的,没有几行代码。
  • BossaNova_fb99:大哥牛逼~
  • a0b6e2a49203:大神威武!我也遇到同样问题,猜想应该是这样做,少走弯路😄

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

本文链接:https://www.haomeiwen.com/subject/ohjnvttx.html