郑州iOS點 - 點哥教你巧用讯飞语音

来源:互联网 发布:unity3d ui框架 编辑:程序博客网 时间:2024/04/29 23:47

        最近新的项目上莫名其妙出现了很多闪退,我就很诧异,我就是按照以前的方式写的代码就这么用的怎么到这就不管用了,深深怀疑自己水平中...


      经过排查,发现了这个大深坑:讯飞语音


原理就在于



注意到了吧!


原来人家是要释放哒!!有多少人跟我一样做项目先搞一个RootViewController作为所有界面控制器的父视图控制器的?有木有?有木有??!!


我就SB一样习惯性地集成在了自定义的父视图控制器上;


所以答案就在这里啦!!!!


如果你把讯飞集成在自己定义的父视图控制器上的话,一旦在语音未结束的情况下进行跳转,讯飞就会来不及释放,然后就闪退!!!!


好吧...


于是我就集成在了APPdelegate上(切记一定要写在APPdelegate上!)

@interface AppDelegate ()<IFlySpeechSynthesizerDelegate>

{
    IFlySpeechSynthesizer       * _iFlySpeechSynthesizer;
}

@end


@implementation AppDelegate


#pragma mark - 集成讯飞
- (void)initXunFei {
    
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(voice:) name:@"xunfei" object:nil];
    
    NSString *initString = [[NSString alloc] initWithFormat:@"appid=%@",XUNFEI_VOICE_APPID];
    
    [IFlySpeechUtility createUtility:initString];

}


- (void)dealloc {

    [[NSNotificationCenter defaultCenter]removeObserver:self name:@"xunfei" object:nil];

}

- (void)voice:(NSNotification *)sender {
    
    [self setupXunFeiWithText:[NSString stringWithFormat:@"%@",sender.object]];
    
}

#pragma mark -讯飞语音
- (void)setupXunFeiWithText:(NSString *)text {
    
    // 创建合成对象,为单例模式
    _iFlySpeechSynthesizer = [IFlySpeechSynthesizer sharedInstance];
    _iFlySpeechSynthesizer.delegate = self;
    //设置语音合成的参数
    //语速,取值范围 0~100
    [_iFlySpeechSynthesizer setParameter:@"50" forKey:[IFlySpeechConstant SPEED]];
    //音量;取值范围 0~100
    [_iFlySpeechSynthesizer setParameter:@"60" forKey: [IFlySpeechConstant VOLUME]];
    //发音人,默认为”xiaoyan”;可以设置的参数列表可参考个 性化发音人列表
    [_iFlySpeechSynthesizer setParameter:@"xiaoyan" forKey: [IFlySpeechConstant VOICE_NAME]];
    //音频采样率,目前支持的采样率有 16000 和 8000
    [_iFlySpeechSynthesizer setParameter:@"8000" forKey: [IFlySpeechConstant SAMPLE_RATE]];
    //asr_audio_path保存录音文件路径,如不再需要,设置value为nil表示取消,默认目录是documents
    [_iFlySpeechSynthesizer setParameter:@"tts.pcm" forKey: [IFlySpeechConstant TTS_AUDIO_PATH]];
    //启动合成会话
    [_iFlySpeechSynthesizer startSpeaking:text];
    
}

//合成结束,此代理必须要实现
- (void) onCompleted:(IFlySpeechError *) error{
}
//合成开始
- (void) onSpeakBegin{
}
//合成缓冲进度
- (void) onBufferProgress:(int) progress message:(NSString *)msg{
}
//合成播放进度
- (void) onSpeakProgress:(int) progress{
}



@end

在项目里的任何地方需要使用的时候,只需要这样:


[[NSNotificationCenter defaultCenter]postNotificationName:@"xunfei" object:@"喂!110吗?又翻车了,对对,还是讯飞,还是那个弯!!!];






0 0