最近需要做一個(gè)語(yǔ)言搜索的功能,所以需要用到語(yǔ)言識(shí)別的SDK,最終選擇科大訊飛的SDK.
科大訊飛APPkey的獲取直接申請(qǐng)應(yīng)用就可以了
集成SDK主要參考官方文檔:http://doc.xfyun.cn/msc_ios/302721,基本不會(huì)有問(wèn)題
下面主要是記錄代碼部分:
1.首先需要在appdelegate的didFinishLaunchingWithOptions方法中啟用訊飛的SDK

2.新建一個(gè)類,初始化IFlySpeechRecognizer


3.sdk識(shí)別出來(lái)的是一串json字符串,所以還需要一個(gè)方法將字符串里的字符提取出來(lái)
```/**
?解析聽(tīng)寫json格式的數(shù)據(jù)
?params例如:
?{"sn":1,"ls":true,"bg":0,"ed":0,"ws":[{"bg":0,"cw":[{"w":"白日","sc":0}]},{"bg":0,"cw":[{"w":"依山","sc":0}]},{"bg":0,"cw":[{"w":"盡","sc":0}]},{"bg":0,"cw":[{"w":"黃河入海流","sc":0}]},{"bg":0,"cw":[{"w":"。","sc":0}]}]}
?*/
-(NSString*)getResultFromJson:(NSString*)params
{
? ? if(params ==NULL) {
? ? ? ? returnnil;
? ? }
? ? NSString *tempStr = [[NSString alloc] init];
? ? //返回的格式必須為utf8的,否則發(fā)生未知錯(cuò)誤
? ? NSString*jsonString = params;
? ? tempStr = [selfVoiceConversionString:jsonString];
? ? returntempStr;
}
- (NSString*)VoiceConversionString:(NSString*)jsonString{
? ? NSDictionary*values =? [JKJsonHelpertoJsonObject:jsonString];
? ? NSMutableString *discourse = [NSMutableString string];
? ? NSArray*ws = [valuesobjectForKey:@"ws"];
? ? for(NSDictionary*dicinws) {
? ? ? ? NSArray*cw = [dicobjectForKey:@"cw"];
? ? ? ? for(NSDictionary*secDicincw) {
? ? ? ? ? ? NSString*w = [secDicobjectForKey:@"w"];
? ? ? ? ? ? [discourseappendString:w];
? ? ? ? }
? ? }? ? returndiscourse;
}```
4.在需要的view里調(diào)用創(chuàng)建這個(gè)類并設(shè)置delegate
```
?self.voiceSearchMVVM = [JKVoiceSearchMVVM create];
? ? _voiceRecognition? = [NSString string];? // 保存識(shí)別的字符串
? ? ? ? [self.loading setupAlpha:0.8];
?? ? self.voiceSearchMVVM.iflySpeechRecognizer.delegate = self;
```
5.開(kāi)啟語(yǔ)音識(shí)別
```
bool ret = [self.voiceSearchMVVM.iflySpeechRecognizer startListening];
? ? if(ret) {
? ? ? // 開(kāi)啟成功
? ? ? ? self.wavesView.hidden=NO;
? ? ? ? [self.waveViewwave];
? ? }
? ? else
? ? {
? ? ? ? self.wavesView.hidden=YES;
? ? ? ? // 開(kāi)啟失敗
? ? ? ? [self showToast:@"啟動(dòng)識(shí)別服務(wù)失敗,請(qǐng)稍后重試"];
}
```
6.停止語(yǔ)音識(shí)別
```
? ? if (self.voiceSearchMVVM.iflySpeechRecognizer.isListening) {
?? ? ? ? [self.voiceSearchMVVM.iflySpeechRecognizer stopListening];
? ? }
```
7.取消語(yǔ)音識(shí)別
```
?[self.voiceSearchMVVM.iflySpeechRecognizer cancel];
```
8.實(shí)現(xiàn)代理
- (void)onBeginOfSpeech
{
?DDLogDebug(@"開(kāi)始語(yǔ)音識(shí)別");
}
- (void)onVolumeChanged:(int)volume{
// 語(yǔ)音聲音大小
}
- (void)onResults:(NSArray*)results isLast:(BOOL)isLast{
// 語(yǔ)音結(jié)果識(shí)別后回調(diào),因?yàn)檎Z(yǔ)音識(shí)別是一段段識(shí)別,所以應(yīng)保存所有識(shí)別的語(yǔ)句,當(dāng)isLast為yes時(shí)才算識(shí)別完成
? ? if(results)
? ? {
? ? ? ? NSMutableString *resultString = [[NSMutableString alloc] init];
? ? ? ? NSDictionary*dic = results[0];
? ? ? ? for(NSString*keyindic)
? ? ? ? {
? ? ? ? ? ? [resultStringappendFormat:@"%@",key];
? ? ? ? }
? ? ? ? NSString* resultFromJson =? [self.voiceSearchMVVMgetResultFromJson:resultString];
? ? ? ? _voiceRecognition = [_voiceRecognition stringByAppendingString:resultFromJson];
? ? }
? ? if(isLast)
? ? {
? ? ? ? if (_voiceRecognition.length>0) {
? ? ? ? ? ? int64_tdelayInSeconds =1.0;? ? ? // 延遲的時(shí)間
? ? ? ? ? ? dispatch_time_tpopTime =dispatch_time(DISPATCH_TIME_NOW, delayInSeconds *NSEC_PER_SEC);
? ? ? ? ? ? dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
// 識(shí)別成功
? ? ? ? ? ? });
? ? ? ? }else{
? ? ? ? ? ? int64_tdelayInSeconds =1.0;? ? ? // 延遲的時(shí)間
? ? ? ? ? ? dispatch_time_tpopTime =dispatch_time(DISPATCH_TIME_NOW, delayInSeconds *NSEC_PER_SEC);
? ? ? ? ? ? dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
// 識(shí)別失敗
? ? ? ? ? ? });
? ? ? ? }
? ? }
? ? DDLogDebug(@"isLast=%d",isLast);
}