使用实时语音识别
前提条件
- 确保已经按照配置好IOS开发环境。
- 确保已存在待识别的音频文件。如果需要请在下载的SDK压缩包中获取示例音频。
初始化Client
初始化RasrClient,其参数包括SisAuthInfo、SisConfig、代理对象delegate代理对象需要用户自定义实现回调逻辑,SisAuthInfo和SisConfig 详见表 SisAuthInfo数据结构、表 SisConfig数据结构。
请求参数
请求类为RasrRequest,详见表 RasrRequest数据结构。
参数名称 |
是否必选 |
参数类型 |
描述 |
---|---|---|---|
audioFormat |
是 |
NSString |
音频格式,支持pcm,alaw,ulaw等,如pcm8k16bit,参见《API参考》中开始识别章节。 |
property |
是 |
NSString |
属性字符串,language_sampleRate_domain,如chinese_8k_common,参见《API参考》中开始识别章节。 |
punc |
否 |
NSString |
表示是否在识别结果中添加标点,取值为yes 、no,默认no。 |
digitNorm |
否 |
NSString |
表示是否将语音中的数字识别为阿拉伯数字,取值为yes 、 no,默认为yes。 |
vadHead |
否 |
NSInteger |
头部最大静音时间,[0, 60000],默认10000ms。 |
vadTail |
否 |
NSInteger |
尾部最大静音时间,[0, 3000],默认500ms。 |
maxSeconds |
否 |
NSInteger |
音频最长持续时间, [0, 60],默认30s。 |
intermediateResult |
否 |
NSString |
是否显示中间结果,yes 或 no,默认no。 |
vocabularyId |
否 |
NSString |
热词表id,若没有则不填。 |
needWordInfo |
否 |
NSString |
表示是否在识别结果中输出分词结果信息,取值为“yes”和“no”,默认为“no”。 |
响应参数
响应参数统一为字典NSDictionary,具体参数如下表。调用失败处理方法请参见错误码。
参数名称 |
是否必选 |
参数类型 |
描述 |
---|---|---|---|
state |
是 |
NSString |
识别状态,包括start、end、fail。 |
trace_id |
是 |
NSString |
用于日志问题追溯。 |
description |
是 |
NSString |
状态描述。 |
参数名称 |
参数类型 |
描述 |
---|---|---|
resp_type |
NSString |
识别状态,包括start、end、fail。 |
trace_id |
NSString |
用于日志问题追溯。 |
segments |
NSSArray |
多句结果,请参考表 segment 数据结构。 |
参数名称 |
参数类型 |
描述 |
---|---|---|
start_time |
NSInteger |
一句的起始时间戳,单位为ms。 |
end_time |
NSInteger |
一句的结束时间戳,单位为ms。 |
is_final |
BOOL |
true表示是最终结果, false表示为中间临时结果。 |
result |
NSDictionary |
调用成功表示识别结果,调用失败时无此字段。请参考表 result数据结构。 |
参数名称 |
参数类型 |
描述 |
---|---|---|
text |
NSString |
识别结果。 |
score |
float |
识别结果的置信度,取值范围:0~1。此值仅会在最终结果时被赋值,在中间结果时统一置为“0.0”。 说明:目前置信度作用不是太大,请勿过多依赖此值。 |
word_info |
NSArray |
分词输出列表。参考表 word_info数据结构。 |
示例代码
- (void)viewDidLoad { [super viewDidLoad]; //授权信息 SisAuthInfo *authInfo = [[SisAuthInfo alloc] initWithAk:kAppKey sk:kAppSecret endpoint:kEndpoint projectId:kProjectId]; //时间设置 SisConfig *config = [[SisConfig alloc] initDefault]; //请求参数对象 RasrRequest *request = [[RasrRequest alloc] init]; //设置音频模式 request.audioFormat = @"pcm8k16bit"; //设置特征值 request.property = @"chinese_8k_common"; //设置是否添加标点符号,yes 或 no,默认"no" request.punc = @"yes"; //设置是否将音频中数字转写为阿拉伯数字,yes or no,默认yes request.digitNorm = @"no"; //初始化RasrClient self.client = [[RasrClient alloc] initWithAuthInfo:authInfo config:config delegate:self]; // 选择连接模式,目前实时语音识别提供三种接口,流式一句话、实时语音识别连续模式、实时语音识别单句模式 // 选择1 流式一句话连接 [self.client shortStreamConnect:request]; // 选择2 实时语音识别单句模式 // [self.client sentenceStreamConnect:request]; // 选择3 实时语音识别连续模式 // [self.client continueStreamConnect:request]; // //获取要发送的语音数据 // NSString *path = [[NSBundle mainBundle] pathForResource:@"8k16bit" ofType:@"pcm"]; // NSData *data = [NSData dataWithContentsOfFile:path]; // //异步任务 // dispatch_async(dispatch_get_global_queue(0, 0), ^{ // // 选择连接模式,目前实时语音识别提供三种接口,流式一句话、实时语音识别连续模式、实时语音识别单句模式 // // 选择1 流式一句话连接 // [self.client shortStreamConnect:request]; // //发送开始请求 // [self.client sendStart]; // //发送音频数据 // // 可以自己控制发送速率.byteLen为每次发送大小,sleepTime为每次发送后睡眠时间(s),一些非持续获取音频场景不需要睡眠,可设置为0. // [self.client sendAudioData:data byteLen:2000 sleepTime:0.1]; // //发送结束请求 // [self.client sendEnd]; // // //关闭客户端。发送完毕后,此步一定要实施,否则服务端因为20s没有接受任何消息而报异常。 // [self.client closeConnect]; // }); } #pragma mark - RasrClientDelegate -(void)rasrClientConnectStatus:(RCConnectStatus)status{ NSLog(@"status = %ld",status); if(status == RCConnectStatus_Connected){ //获取要发送的语音数据 NSString *path = [[NSBundle mainBundle] pathForResource:@"8k16bit" ofType:@"pcm"]; NSData *data = [NSData dataWithContentsOfFile:path]; //异步任务 dispatch_async(dispatch_get_global_queue(0, 0), ^{ //发送开始请求 [self.client sendStart]; //发送音频数据 // 可以自己控制发送速率.byteLen为每次发送大小,sleepTime为每次发送后睡眠时间(s),一些非持续获取音频场景不需要睡眠,可设置为0. [self.client sendAudioData:data byteLen:2000 sleepTime:0.1]; //对于较短音频也可直接发送data // [self.client sendAudioData:data]; //发送结束请求 [self.client sendEnd]; //关闭客户端。发送完毕后,此步一定要实施,否则服务端因为20s没有接受任何消息而报异常。 [self.client closeConnect]; }); } } -(void)rasrClientReceiveMessage:(id)data{ NSDictionary *dic; if ([data isKindOfClass:[NSString class]]){ dic = [self dictionaryWithJsonString:data]; }else if([data isKindOfClass:[NSDictionary class]]){ dic = data; }else{ NSLog(@"data = %@",data); } NSString *type = [dic valueForKey:@"resp_type"]; if([type isEqualToString:@"RESULT"]){ NSLog(@"响应内容: %@",[self convertToJsonString:dic]); }else{ NSLog(@"其他内容: %@",data); } }
