Objective-C用讯飞SDK实现语音识别
2016-06-27 12:37
525 查看
周末参加了一个活动,涉及到了语音识别的东西,回来整理了一下讯飞的语音识别SDK的用法,官方文档写得很详细,这里给大家过一下流程吧。
1. 获取Appid就不多做介绍了,官网注册app即可获取。
2. 集成讯飞库:讯飞 iOS framework 名称为 iflyMSC.framework,直接拖进工程或者在link Binary With Libraries中添加都行。注意:iflyMSC.framework 非系统库文件,添加 iflyMSC.framework 时,请注意工程 BuildSetting 中的 framwork path 的设置,如果出现找不到 framework 中头文件的编译警 告,可以将 path 清空,在 xcode 中删除 framework,然后重新添加。
3. 集成系统库:
之后把Bitcode关掉:Targets - Build Settings 中搜索 Bitcode 即可,找 到相应选项,设置为 NO。
4. 使用:
AppDelegate中导入头文件:#import “iflyMSC/IFlyMSC.h”
使用的时候遵循IFlySpeechRecognizerDelegate代理,下面两个方法是必须实现的:
定义一个属性:
接下来初始化及设置参数:
IATConfig为设置参数的辅助类,在里面也添加了默认设置:
开始录音:
停止录音:
取消录音:
在IFlySpeechRecognizerDelegate代理方法中实现回调,拿到识别结果或者输出错误。
拿到结果:
输出错误:
1. 获取Appid就不多做介绍了,官网注册app即可获取。
2. 集成讯飞库:讯飞 iOS framework 名称为 iflyMSC.framework,直接拖进工程或者在link Binary With Libraries中添加都行。注意:iflyMSC.framework 非系统库文件,添加 iflyMSC.framework 时,请注意工程 BuildSetting 中的 framwork path 的设置,如果出现找不到 framework 中头文件的编译警 告,可以将 path 清空,在 xcode 中删除 framework,然后重新添加。
3. 集成系统库:
之后把Bitcode关掉:Targets - Build Settings 中搜索 Bitcode 即可,找 到相应选项,设置为 NO。
4. 使用:
AppDelegate中导入头文件:#import “iflyMSC/IFlyMSC.h”
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. //存储路径 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); NSString *cachePath = [paths objectAtIndex:0]; [IFlySetting setLogFilePath:cachePath]; //创建语音配置,appid必须要传入,仅执行一次则可 NSString *initString = [[NSString alloc] initWithFormat:@"appid=%@",@"YOUkey"]; //所有服务启动前,需要确保执行createUtility [IFlySpeechUtility createUtility:initString]; return YES; }
使用的时候遵循IFlySpeechRecognizerDelegate代理,下面两个方法是必须实现的:
/*! * 识别结果回调 * 在进行语音识别过程中的任何时刻都有可能回调此函数,你可以根据errorCode进行相应的处理, * 当errorCode没有错误时,表示此次会话正常结束;否则,表示此次会话有错误发生。特别的当调用 * `cancel`函数时,引擎不会自动结束,需要等到回调此函数,才表示此次会话结束。在没有回调此函数 * 之前如果重新调用了`startListenging`函数则会报错误。 * * @param errorCode 错误描述 */ - (void) onError:(IFlySpeechError *) errorCode; - /*! * 识别结果回调 * 在识别过程中可能会多次回调此函数,你最好不要在此回调函数中进行界面的更改等操作,只需要将回调的结果保存起来。 * 使用results的示例如下: * <pre><code> * - (void) onResults:(NSArray *) results{ * NSMutableString *result = [[NSMutableString alloc] init]; * NSDictionary *dic = [results objectAtIndex:0]; * for (NSString *key in dic){ * [result appendFormat:@"%@",key];//合并结果 * } * } * </code></pre> * * @param results -[out] 识别结果,NSArray的第一个元素为NSDictionary,NSDictionary的key为识别结果,sc为识别结果的置信度。 * @param isLast -[out] 是否最后一个结果 */ - (void) onResults:(NSArray *) results isLast:(BOOL)isLast;
定义一个属性:
@property (nonatomic, strong) IFlySpeechRecognizer *iFlySpeechRecognizer;
接下来初始化及设置参数:
- (void)initRecognizer { if (_iFlySpeechRecognizer == nil) { _iFlySpeechRecognizer = [IFlySpeechRecognizer sharedInstance]; [_iFlySpeechRecognizer setParameter:@"" forKey:[IFlySpeechConstant PARAMS]]; //设置听写模式 [_iFlySpeechRecognizer setParameter:@"iat" forKey:[IFlySpeechConstant IFLY_DOMAIN]]; } _iFlySpeechRecognizer.delegate = self; if (_iFlySpeechRecognizer != nil) { IATConfig *instance = [IATConfig sharedInstance]; //设置最长录音时间 [_iFlySpeechRecognizer setParameter:instance.speechTimeout forKey:[IFlySpeechConstant SPEECH_TIMEOUT]]; //设置后端点 [_iFlySpeechRecognizer setParameter:instance.vadEos forKey:[IFlySpeechConstant VAD_EOS]]; //设置前端点 [_iFlySpeechRecognizer setParameter:instance.vadBos forKey:[IFlySpeechConstant VAD_BOS]]; //网络等待时间 [_iFlySpeechRecognizer setParameter:@"20000" forKey:[IFlySpeechConstant NET_TIMEOUT]]; //设置采样率,推荐使用16K [_iFlySpeechRecognizer setParameter:instance.sampleRate forKey:[IFlySpeechConstant SAMPLE_RATE]]; if ([instance.language isEqualToString:[IATConfig chinese]]) { //设置语言 [_iFlySpeechRecognizer setParameter:instance.language forKey:[IFlySpeechConstant LANGUAGE]]; //设置方言 [_iFlySpeechRecognizer setParameter:instance.accent forKey:[IFlySpeechConstant ACCENT]]; }else if ([instance.language isEqualToString:[IATConfig english]]) { [_iFlySpeechRecognizer setParameter:instance.language forKey:[IFlySpeechConstant LANGUAGE]]; } //设置是否返回标点符号 [_iFlySpeechRecognizer setParameter:instance.dot forKey:[IFlySpeechConstant ASR_PTT]]; } }
IATConfig为设置参数的辅助类,在里面也添加了默认设置:
-(void)defaultSetting { _speechTimeout = @"30000"; _vadEos = @"3000"; _vadBos = @"3000"; _dot = @"1"; _sampleRate = @"16000"; _language = CHINESE; _accent = PUTONGHUA; _haveView = NO;//默认是不dai界面的 _accentNickName = [[NSArray alloc] initWithObjects:@"粤语",@"普通话",@"河南话",@"英文", nil]; }
开始录音:
- (void)starAudioInput{ NSLog(@"开始输入"); if(_iFlySpeechRecognizer == nil) { [self initRecognizer]; } [_iFlySpeechRecognizer cancel]; //设置音频来源为麦克风 [_iFlySpeechRecognizer setParameter:IFLY_AUDIO_SOURCE_MIC forKey:@"audio_source"]; //设置听写结果格式为json [_iFlySpeechRecognizer setParameter:@"json" forKey:[IFlySpeechConstant RESULT_TYPE]]; //保存录音文件,保存在sdk工作路径中,如未设置工作路径,则默认保存在library/cache下 [_iFlySpeechRecognizer setParameter:@"asr.pcm" forKey:[IFlySpeechConstant ASR_AUDIO_PATH]]; [_iFlySpeechRecognizer setDelegate:self]; BOOL ret = [_iFlySpeechRecognizer startListening]; if (!ret) { NSLog(@"error"); } }
停止录音:
[_iFlySpeechRecognizer stopListening];
取消录音:
[_iFlySpeechRecognizer cancel];
在IFlySpeechRecognizerDelegate代理方法中实现回调,拿到识别结果或者输出错误。
拿到结果:
- (void) onResults:(NSArray *) results isLast:(BOOL)isLast { NSMutableString *resultString = [[NSMutableString alloc] init]; NSDictionary *dic = results[0]; for (NSString *key in dic) { [resultString appendFormat:@"%@",key]; } NSString * resultFromJson = [self stringFromJson:resultString]; [self _addInputText:resultFromJson]; } - (NSString *)stringFromJson:(NSString*)params { if (params == NULL) { return nil; } NSMutableString *tempStr = [[NSMutableString alloc] init]; NSDictionary *resultDic = [NSJSONSerialization JSONObjectWithData: //返回的格式必须为utf8的,否则发生未知错误 [params dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:nil]; if (resultDic!= nil) { NSArray *wordArray = [resultDic objectForKey:@"ws"]; for (int i = 0; i < [wordArray count]; i++) { NSDictionary *wsDic = [wordArray objectAtIndex: i]; NSArray *cwArray = [wsDic objectForKey:@"cw"]; for (int j = 0; j < [cwArray count]; j++) { NSDictionary *wDic = [cwArray objectAtIndex:j]; NSString *str = [wDic objectForKey:@"w"]; [tempStr appendString: str]; } } } return tempStr; }
输出错误:
- (void) onError:(IFlySpeechError *) errorCode{ NSLog(@"%@", errorCode); }
相关文章推荐
- C#中调用SAPI实现语音识别的2种方法
- 使用科大讯飞语音SDK实现文字在线合成语音
- Android实现语音识别代码
- Android基于讯飞语音SDK实现语音识别
- 模式识别
- 谷歌眼镜GDK开发指南之语音输入
- 讯飞语音输入法iPhone公测版发布
- android语音识别技术
- HTK3.4程序员手册(2.3)--特征参数提取HParm.c
- 鱼与熊掌如何兼得:微软科学家解决并行训练困境
- 3D语音天气球(源码分享)本文出自大苞米的博客(http://blog.csdn.net/a396901990)
- 关于在WP7应用里加入Speech To Text (语音识别) 记录
- 隐马尔可夫链(一)
- DIY: 实现自己的中文语音应用
- 这篇文章为什么能发表在Science上?
- 语言模型
- 基于神经网络的统计语言模型-----第一章 引言
- 基于神经网络的统计语言模型-----第一章 引言
- 简单的语音合成与语音识别(科大讯飞)
- 免费的语音识别api调用