失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > iOS中 语音识别功能/语音转文字教程详解

iOS中 语音识别功能/语音转文字教程详解

时间:2020-12-03 11:08:03

相关推荐

iOS中 语音识别功能/语音转文字教程详解

iOS中 语音识别功能/语音转文字教程详解

前言:最近研究了一下语音识别,从百度语音识别到讯飞语音识别;首先说一下个人针对两者的看法,讯飞毫无疑问比较专业,识别率也很高真对语音识别是比较精准的,但是很多开发者和我一样期望离线识别,而讯飞离线是收费的;请求次数来讲,两者都可以申请高配额,真对用户较多的几乎都一样。基于免费并且支持离线我选择了百度离线语音识别。比较简单,UI设计多一点,下面写一下教程:

1.首先:需要的库

2.我是自定义的UI所以以功能实现为主(头文件)

[objc]view plaincopy//头文件 #import"BDVRCustomRecognitonViewController.h" #import"BDVRClientUIManager.h" #import"WBVoiceRecordHUD.h" #import"BDVRViewController.h" #import"MyViewController.h" #import"BDVRSConfig.h"

3.需要知道的功能:能用到的如下:

[objc]view plaincopy//-------------------类方法------------------------ //创建语音识别客户对像,该对像是个单例 +(BDVoiceRecognitionClient*)sharedInstance; //释放语音识别客户端对像 +(void)releaseInstance; //-------------------识别方法----------------------- //判断是否可以录音 -(BOOL)isCanRecorder; //开始语音识别,需要实现MVoiceRecognitionClientDelegate代理方法,并传入实现对像监听事件 //返回值参考TVoiceRecognitionStartWorkResult -(int)startVoiceRecognition:(id<MVoiceRecognitionClientDelegate>)aDelegate; //说完了,用户主动完成录音时调用 -(void)speakFinish; //结束本次语音识别 -(void)stopVoiceRecognition; /** *@brief获取当前识别的采样率 * *@return采样率(16000/8000) */ -(int)getCurrentSampleRate; /** *@brief得到当前识别模式(deprecated) * *@return当前识别模式 */ -(int)getCurrentVoiceRecognitionMode__attribute__((deprecated)); /** *@brief设置当前识别模式(deprecated),请使用-(void)setProperty:(TBDVoiceRecognitionProperty)property; * *@param识别模式 * *@return是否设置成功 */ -(void)setCurrentVoiceRecognitionMode:(int)aMode__attribute__((deprecated)); //设置识别类型 -(void)setProperty:(TBDVoiceRecognitionProperty)property__attribute__((deprecated)); //获取当前识别类型 -(int)getRecognitionProperty__attribute__((deprecated)); //设置识别类型列表,除EVoiceRecognitionPropertyInput和EVoiceRecognitionPropertySong外 //可以识别类型复合 -(void)setPropertyList:(NSArray*)prop_list; //cityID仅对EVoiceRecognitionPropertyMap识别类型有效 -(void)setCityID:(NSInteger)cityID; //获取当前识别类型列表 -(NSArray*)getRecognitionPropertyList; //-------------------提示音----------------------- //播放提示音,默认为播放,录音开始,录音结束提示音 //BDVoiceRecognitionClientResources/Tone //record_start.caf录音开始声音文件 //record_end.caf录音结束声音文件 //声音资源需要加到项目工程里,用户可替换资源文件,文件名不可以变,建音提示音不宜过长,0。5秒左右。 //aTone取值参考TVoiceRecognitionPlayTones,如没有找到文件,则返回NO -(BOOL)setPlayTone:(int)aToneisPlay:(BOOL)aIsPlay;

4.录音按钮相关动画(我自定义的,大家可以借鉴)

每日更新关注:/hanjunqiang 新浪微博

[objc]view plaincopy//录音按钮相关 @property(nonatomic,weak,readonly)UIButton*holdDownButton;//说话按钮 /** *是否取消錄音 */ @property(nonatomic,assign,readwrite)BOOLisCancelled; /** *是否正在錄音 */ @property(nonatomic,assign,readwrite)BOOLisRecording; /** *当录音按钮被按下所触发的事件,这时候是开始录音 */ -(void)holdDownButtonTouchDown; /** *当手指在录音按钮范围之外离开屏幕所触发的事件,这时候是取消录音 */ -(void)holdDownButtonTouchUpOutside; /** *当手指在录音按钮范围之内离开屏幕所触发的事件,这时候是完成录音 */ -(void)holdDownButtonTouchUpInside; /** *当手指滑动到录音按钮的范围之外所触发的事件 */ -(void)holdDownDragOutside;

5.初始化系统UI[objc]view plaincopy#pragmamark-layoutsubViewsUI /** *根据正常显示和高亮状态创建一个按钮对象 * *@paramimage正常显示图 *@paramhlImage高亮显示图 * *@return返回按钮对象 */ -(UIButton*)createButtonWithImage:(UIImage*)imageHLImage:(UIImage*)hlImage; -(void)holdDownDragInside; -(void)createInitView;//创建初始化界面,播放提示音时会用到 -(void)createRecordView;//创建录音界面 -(void)createRecognitionView;//创建识别界面 -(void)createErrorViewWithErrorType:(int)aStatus;//在识别view中显示详细错误信息 -(void)createRunLogWithStatus:(int)aStatus;//在状态view中显示详细状态信息 -(void)finishRecord:(id)sender;//用户点击完成动作 -(void)cancel:(id)sender;//用户点击取消动作 -(void)startVoiceLevelMeterTimer; -(void)freeVoiceLevelMeterTimerTimer;

6.最重要的部分

[objc]view plaincopy//录音完成 [[BDVoiceRecognitionClientsharedInstance]speakFinish];

[objc]view plaincopy//取消录音 [[BDVoiceRecognitionClientsharedInstance]stopVoiceRecognition];

7.两个代理方法[objc]view plaincopy-(void)VoiceRecognitionClientWorkStatus:(int)aStatusobj:(id)aObj { switch(aStatus) { caseEVoiceRecognitionClientWorkStatusFlushData://连续上屏中间结果 { NSString*text=[aObjobjectAtIndex:0]; if([textlength]>0) { //[clientSampleViewControllerlogOutToContinusManualResut:text]; UILabel*clientWorkStatusFlushLabel=[[UILabelalloc]initWithFrame:CGRectMake(kScreenWidth/2-100,64,200,60)]; clientWorkStatusFlushLabel.text=text; clientWorkStatusFlushLabel.textAlignment=NSTextAlignmentCenter; clientWorkStatusFlushLabel.font=[UIFontsystemFontOfSize:18.0f]; clientWorkStatusFlushLabel.numberOfLines=0; clientWorkStatusFlushLabel.backgroundColor=[UIColorwhiteColor]; [self.viewaddSubview:clientWorkStatusFlushLabel]; } break; } caseEVoiceRecognitionClientWorkStatusFinish://识别正常完成并获得结果 { [selfcreateRunLogWithStatus:aStatus]; if([[BDVoiceRecognitionClientsharedInstance]getRecognitionProperty]!=EVoiceRecognitionPropertyInput) { //搜索模式下的结果为数组,示例为 //["公园","公元"] NSMutableArray*audioResultData=(NSMutableArray*)aObj; NSMutableString*tmpString=[[NSMutableStringalloc]initWithString:@""]; for(inti=0;i<[audioResultDatacount];i++) { [tmpStringappendFormat:@"%@\r\n",[audioResultDataobjectAtIndex:i]]; } clientSampleViewController.resultView.text=nil; [clientSampleViewControllerlogOutToManualResut:tmpString]; } else { NSString*tmpString=[[BDVRSConfigsharedInstance]composeInputModeResult:aObj]; [clientSampleViewControllerlogOutToContinusManualResut:tmpString]; } if(self.view.superview) { [self.viewremoveFromSuperview]; } break; } caseEVoiceRecognitionClientWorkStatusReceiveData: { //此状态只有在输入模式下使用 //输入模式下的结果为带置信度的结果,示例如下: //[ //[ //{//"百度"="0.6055192947387695"; //}, //{//"摆渡"="0.3625582158565521"; //}, //] //[ //{//"一下"="0.7665404081344604"; //} //], //] //暂时关掉--否则影响跳转结果 //NSString*tmpString=[[BDVRSConfigsharedInstance]composeInputModeResult:aObj]; //[clientSampleViewControllerlogOutToContinusManualResut:tmpString]; break; } caseEVoiceRecognitionClientWorkStatusEnd://用户说话完成,等待服务器返回识别结果 { [selfcreateRunLogWithStatus:aStatus]; if([BDVRSConfigsharedInstance].voiceLevelMeter) { [selffreeVoiceLevelMeterTimerTimer]; } [selfcreateRecognitionView]; break; } caseEVoiceRecognitionClientWorkStatusCancel: { if([BDVRSConfigsharedInstance].voiceLevelMeter) { [selffreeVoiceLevelMeterTimerTimer]; } [selfcreateRunLogWithStatus:aStatus]; if(self.view.superview) { [self.viewremoveFromSuperview]; } break; } caseEVoiceRecognitionClientWorkStatusStartWorkIng://识别库开始识别工作,用户可以说话 { if([BDVRSConfigsharedInstance].playStartMusicSwitch)//如果播放了提示音,此时再给用户提示可以说话 { [selfcreateRecordView]; } if([BDVRSConfigsharedInstance].voiceLevelMeter)//开启语音音量监听 { [selfstartVoiceLevelMeterTimer]; } [selfcreateRunLogWithStatus:aStatus]; break; } caseEVoiceRecognitionClientWorkStatusNone: caseEVoiceRecognitionClientWorkPlayStartTone: caseEVoiceRecognitionClientWorkPlayStartToneFinish: caseEVoiceRecognitionClientWorkStatusStart: caseEVoiceRecognitionClientWorkPlayEndToneFinish: caseEVoiceRecognitionClientWorkPlayEndTone: { [selfcreateRunLogWithStatus:aStatus]; break; } caseEVoiceRecognitionClientWorkStatusNewRecordData: { break; } default: { [selfcreateRunLogWithStatus:aStatus]; if([BDVRSConfigsharedInstance].voiceLevelMeter) { [selffreeVoiceLevelMeterTimerTimer]; } if(self.view.superview) { [self.viewremoveFromSuperview]; } break; } } }

[objc]view plaincopy-(void)VoiceRecognitionClientNetWorkStatus:(int)aStatus { switch(aStatus) { caseEVoiceRecognitionClientNetWorkStatusStart: { [selfcreateRunLogWithStatus:aStatus]; [[UIApplicationsharedApplication]setNetworkActivityIndicatorVisible:YES]; break; } caseEVoiceRecognitionClientNetWorkStatusEnd: { [selfcreateRunLogWithStatus:aStatus]; [[UIApplicationsharedApplication]setNetworkActivityIndicatorVisible:NO]; break; } } }

8.录音按钮的一些操作

[objc]view plaincopy#pragmamark------关于按钮操作的一些事情------- -(void)holdDownButtonTouchDown{ //开始动画 _disPlayLink=[CADisplayLinkdisplayLinkWithTarget:selfselector:@selector(delayAnimation)]; _disPlayLink.frameInterval=40; [_disPlayLinkaddToRunLoop:[NSRunLoopcurrentRunLoop]forMode:NSDefaultRunLoopMode]; self.isCancelled=NO; self.isRecording=NO; //开始语音识别功能,之前必须实现MVoiceRecognitionClientDelegate协议中的VoiceRecognitionClientWorkStatus:obj方法 intstartStatus=-1; startStatus=[[BDVoiceRecognitionClientsharedInstance]startVoiceRecognition:self]; if(startStatus!=EVoiceRecognitionStartWorking)//创建失败则报告错误 { NSString*statusString=[NSStringstringWithFormat:@"%d",startStatus]; [selfperformSelector:@selector(firstStartError:)withObject:statusStringafterDelay:0.3];//延迟0.3秒,以便能在出错时正常删除view return; } //"按住说话-松开搜索"提示 [voiceImageStrremoveFromSuperview]; voiceImageStr=[[UIImageViewalloc]initWithFrame:CGRectMake(kScreenWidth/2-40,kScreenHeight-153,80,33)]; voiceImageStr.backgroundColor=[UIColorcolorWithPatternImage:[UIImageimageNamed:@"searchVoice"]]; [self.viewaddSubview:voiceImageStr]; } -(void)holdDownButtonTouchUpOutside{ //结束动画 [self.view.layerremoveAllAnimations]; [_disPlayLinkinvalidate]; _disPlayLink=nil; //取消录音 [[BDVoiceRecognitionClientsharedInstance]stopVoiceRecognition]; if(self.view.superview) { [self.viewremoveFromSuperview]; } } -(void)holdDownButtonTouchUpInside{ //结束动画 [self.view.layerremoveAllAnimations]; [_disPlayLinkinvalidate]; _disPlayLink=nil; [[BDVoiceRecognitionClientsharedInstance]speakFinish]; } -(void)holdDownDragOutside{ //如果已經開始錄音了,才需要做拖曳出去的動作,否則只要切換isCancelled,不讓錄音開始. if(self.isRecording){ //if([self.delegaterespondsToSelector:@selector(didDragOutsideAction)]){//[self.delegatedidDragOutsideAction]; //} }else{ self.isCancelled=YES; } } #pragmamark-layoutsubViewsUI -(UIButton*)createButtonWithImage:(UIImage*)imageHLImage:(UIImage*)hlImage{ UIButton*button=[[UIButtonalloc]initWithFrame:CGRectMake(kScreenWidth/2-36,kScreenHeight-120,72,72)]; if(image) [buttonsetBackgroundImage:imageforState:UIControlStateNormal]; if(hlImage) [buttonsetBackgroundImage:hlImageforState:UIControlStateHighlighted]; returnbutton; } #pragmamark-----------动画部分----------- -(void)startAnimation { CALayer*layer=[[CALayeralloc]init]; layer.cornerRadius=[UIScreenmainScreen].bounds.size.width/2; layer.frame=CGRectMake(0,0,layer.cornerRadius*2,layer.cornerRadius*2); layer.position=CGPointMake([UIScreenmainScreen].bounds.size.width/2,[UIScreenmainScreen].bounds.size.height-84); //self.view.layer.position; UIColor*color=[UIColorcolorWithRed:arc4random()%10*0.1green:arc4random()%10*0.1blue:arc4random()%10*0.1alpha:1]; layer.backgroundColor=color.CGColor; [self.view.layeraddSublayer:layer]; CAMediaTimingFunction*defaultCurve=[CAMediaTimingFunctionfunctionWithName:kCAMediaTimingFunctionDefault]; _animaTionGroup=[CAAnimationGroupanimation]; _animaTionGroup.delegate=self; _animaTionGroup.duration=2; _animaTionGroup.removedOnCompletion=YES; _animaTionGroup.timingFunction=defaultCurve; CABasicAnimation*scaleAnimation=[CABasicAnimationanimationWithKeyPath:@"transform.scale.xy"]; scaleAnimation.fromValue=@0.0; scaleAnimation.toValue=@1.0; scaleAnimation.duration=2; CAKeyframeAnimation*opencityAnimation=[CAKeyframeAnimationanimationWithKeyPath:@"opacity"]; opencityAnimation.duration=2; opencityAnimation.values=@[@0.8,@0.4,@0]; opencityAnimation.keyTimes=@[@0,@0.5,@1]; opencityAnimation.removedOnCompletion=YES; NSArray*animations=@[scaleAnimation,opencityAnimation]; _animaTionGroup.animations=animations; [layeraddAnimation:_animaTionGroupforKey:nil]; [selfperformSelector:@selector(removeLayer:)withObject:layerafterDelay:1.5]; } -(void)removeLayer:(CALayer*)layer { [layerremoveFromSuperlayer]; } -(void)delayAnimation { [selfstartAnimation]; }

完成以上操作,就大功告成了!

温馨提示:

1.由于是语音识别,需要用到麦克风相关权限,模拟器会爆12个错误,使用真机可以解决;

2.涉及到授权文件相关并不复杂,工程Bundle Identifier只需要设置百度的离线授权一致即可,如下图:

最终效果如下:

如果觉得《iOS中 语音识别功能/语音转文字教程详解》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。