您的位置:首页 > 移动开发 > Objective-C

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”

- (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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  讯飞 语音识别