首先,导入讯飞语音库(友情提示在讯飞语音官方平台申请过的识别次数无上限,没有申请过的app每日500次),在delegate.m注册讯飞语音appKey,然后接入如下:
.h文件.
#import <UIKit/UIKit.h>
#import "IATConfig.h"
#import "ISRDataHelper.h"
#import <iflyMSC/iflyMSC.h>@class IFlySpeechRecognizer;
@interface ListenView : UIView<IFlySpeechRecognizerDelegate,UIGestureRecognizerDelegate>
//显示的文本框
@property(strong,nonatomic)UILabel *WordsLB;
//麦克风图标
@property(strong,nonatomic)UIButton*IconBtn;
//提示:按住说话
@property(strong,nonatomic)UILabel*TipLB;
//确定
@property(strong,nonatomic)UIButton *SureBtn;
//删除
@property(strong,nonatomic)UIButton *ClearBtn;
//讯飞语音要求接入的lb,好扯淡的审核
@property(strong,nonatomic)UILabel *XFTipLB;
//显示,前提是已经有这个实例了,就是已经alloc,init了
-(void)ShowListenView;
//隐藏,前提是已经有这个实例了,就是已经alloc,init了
-(void)HideListenView;
//横竖屏切换需调用
//show跟hideblock是出现和隐藏的时候调用,一般是,showblock里边,消失掉直播间声音,hideblock重新播放声音
@property(nonatomic,copy)void (^ShowBlock)();
@property(nonatomic,copy)void (^HideBlock)();
-(void)ChangeFrameToWhatLand1OrVertical2:(NSInteger)Land1OrVertical2;
//不带界面的识别对象
@property (nonatomic, strong) IFlySpeechRecognizer *iFlySpeechRecognizer;
//录音路径,暂时没有用到
@property (nonatomic, strong) NSString *pcmFilePath;//音频文件路径
//识别结果,暂时没有用到,直接添加在textview
@property (nonatomic, strong) NSString * result;
//是否继续录音
@property(assign,nonatomic)BOOL StopListen;
//外部vc消失时候调用,防止特殊情况的没有释放speechrecognizer,造成内存泄漏
-(void)ShouldDelete;
//确定按钮按下,调用的方法,参数是textview的text,在这里需要将text放到直播间的输入框,活着直接发送等
@property(nonatomic,copy)void (^SureBlock)(NSString*Words);
//点击文字的,调用方法,参数是textview的text,在这里需要将words写到输入框,并且让用户在直播间编辑
@property(nonatomic,copy)void (^ClickWordsBlock)(NSString*Words);
//点击语音的block
@property(nonatomic,copy)void (^TouchUpVoiceImgBlock)();
//取消点击语音图片的block
@property(nonatomic,copy)void (^TouchCancelVoiceImgBlock)();
-(void)ShowWordSLB;
@property(nonatomic,copy)void (^NoWordRecognizeBlock)();
//是否是喇叭发言
@property(assign,nonatomic)BOOL IsAnnounce;
//发言中的提示
@property(strong,nonatomic)UIView* ListenTipView;@end
.m文件代码:
#import "ListenView.h"@implementation ListenView/*// Only override drawRect: if you perform custom drawing.// An empty implementation adversely affects performance during animation.- (void)drawRect:(CGRect)rect {// Drawing code}*/
- (instancetype)initWithFrame:(CGRect)frame
{self = [super initWithFrame:frame];if (self) {self.backgroundColor = [UIColor whiteColor];UITapGestureRecognizer *tapWordsLB = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(TapWordsLB)];[self addGestureRecognizer:tapWordsLB];//frame宽度必须大于300,确定的是图片半径100//高度是165-50self.WordsLB = [[UILabel alloc] initWithFrame:CGRectMake(13, 13, 0, 0)];self.WordsLB.numberOfLines = 0;Alignment = NSTextAlignmentLeft;[self.WordsLB setFont:[UIFont systemFontOfSize:15]];Color = [UIColor blackColor];[self addSubview:self.WordsLB];self.IconBtn = [UIButton buttonWithType:UIButtonTypeCustom];self.IconBtn.adjustsImageWhenHighlighted = NO;self.IconBtn.frame = CGRectMake(frame.size.width/2-50, 165-50, 100, 100);self.IconBtn.userInteractionEnabled = YES;[self.IconBtn setImage:[UIImage imageNamed:@"YBkxNoListenImg"] forState:UIControlStateNormal];[self.IconBtn addTarget:self action:@selector(touchInIcon:) forControlEvents:UIControlEventTouchDown];[self.IconBtn addTarget:self action:@selector(touchOutOrCancelIcon:) forControlEvents:UIControlEventTouchUpInside];[self.IconBtn addTarget:self action:@selector(touchOutOrCancelIcon:) forControlEvents:UIControlEventTouchCancel];[self.IconBtn addTarget:self action:@selector(touchOutOrCancelIcon:) forControlEvents:UIControlEventTouchUpOutside];[self addSubview:self.IconBtn];self.TipLB = [[UILabel alloc] initWithFrame:CGRectMake(0, self.igin.y-35, frame.size.width, 20)]; = @"按住说话";Alignment = NSTextAlignmentCenter;self.TipLB.font = [UIFont systemFontOfSize:14];Color = [UIColor blackColor];Alignment = NSTextAlignmentCenter;[self addSubview:self.TipLB];//默认隐藏//语音开始是要显示的视图//140宽高UIView* TipBgView = [[UIView alloc] initWithFrame:CGRectMake(kYBScreenWidth/2-70, (kYBScreenHeight/2-70)-igin.y, 140, 140)];TipBgView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.7];Radius = 5;TipBgView.layer.masksToBounds = YES;TipBgView.userInteractionEnabled = YES;[self addSubview:TipBgView];self.ListenTipView = TipBgView;UIImageView* TipImageView = [[UIImageView alloc] initWithFrame:CGRectMake((TipBgView.frame.size.width-40)/2, (TipBgView.frame.size.width-50-30)/3, 40, 50)];TipImageView.image = [UIImage imageNamed:@"KXInVoice2"];[TipBgView addSubview:TipImageView];UILabel* TipLB1 = [[UILabel alloc] initWithFrame:CGRectMake(0, TipImageView.frame.size.height+igin.y+(TipBgView.frame.size.width-50-30)/3, TipBgView.frame.size.width, 15)]; = @"语音识别中";TipLB1.font = [UIFont systemFontOfSize:12];Color = [UIColor whiteColor];Alignment =NSTextAlignmentCenter;[TipBgView addSubview:TipLB1];UILabel* TipLB2 = [[UILabel alloc] initWithFrame:CGRectMake(0, TipLB1.frame.size.height+igin.y, TipLB1.frame.size.width, 15)]; = @"请保持周边安静";TipLB2.font = [UIFont systemFontOfSize:12];Color = [UIColor whiteColor];Alignment =NSTextAlignmentCenter;[TipBgView addSubview:TipLB2];//默认,没有点击语音,隐藏[TipBgView setHidden:YES];//frame-80 然后/2 100是按钮的宽度,80是语音图片的宽度//最窄300,可以放下self.ClearBtn = [[UIButton alloc] initWithFrame:CGRectMake(((frame.size.width-self.IconBtn.frame.size.width)/2-100)/2, self.igin.y+20, 100, 20)];[self.ClearBtn setTitle:@"清空" forState:UIControlStateNormal];[self.ClearBtn setTitleColor:UIColorFromRGB(0x999999) forState:UIControlStateNormal];[self.ClearBtn.titleLabel setFont:[UIFont systemFontOfSize:15]];[self addSubview:self.ClearBtn];[self.ClearBtn addTarget:self action:@selector(ClickBtnS:) forControlEvents:UIControlEventTouchUpInside];self.SureBtn = [[UIButton alloc] initWithFrame:CGRectMake(frame.size.width- ((frame.size.width-self.IconBtn.frame.size.width)/2-100)/2-100,self.igin.y+20, 100, 20)];[self.SureBtn setTitle:@"发送" forState:UIControlStateNormal];[self.SureBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];[self.SureBtn.titleLabel setFont:[UIFont systemFontOfSize:15]];[self addSubview:self.SureBtn];[self.SureBtn addTarget:self action:@selector(ClickBtnS:) forControlEvents:UIControlEventTouchUpInside];//科大讯飞的审核需要的,醉了,要明确显示技术来自讯飞UILabel *XunFeiLB = [[UILabel alloc] initWithFrame:CGRectMake(0, frame.size.height-20, frame.size.width, 15)];NSString *normalStr = [NSString stringWithFormat:@"语音核心技术由科大讯飞提供"];Alignment = NSTextAlignmentCenter;NSMutableAttributedString *XFstr = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@",normalStr]];[XFstr addAttribute:NSForegroundColorAttributeName value:UIColorFromRGB(0x333333) range:NSMakeRange(7, 4)];[XFstr addAttribute:NSForegroundColorAttributeName value:UIColorFromRGB(0x999999) range:NSMakeRange(0, 7)];[XFstr addAttribute:NSForegroundColorAttributeName value:UIColorFromRGB(0x999999) range:NSMakeRange(11, 2)];[XFstr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:13] range:NSMakeRange(7, 4)];[XFstr addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:NSMakeRange(7, 4)];[XFstr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:12] range:NSMakeRange(0, 7)];[XFstr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:12] range:NSMakeRange(11, 2)];self.XFTipLB = XunFeiLB;self.XFTipLB.attributedText = XFstr;[self addSubview:XunFeiLB];//语音识别调用相关配置//单例模式,无UI的实例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]];//设置语言[_iFlySpeechRecognizer setParameter:instance.language forKey:[IFlySpeechConstant LANGUAGE]];//设置方言[_iFlySpeechRecognizer setParameter:instance.accent forKey:[IFlySpeechConstant ACCENT]];//设置是否返回标点符号[_iFlySpeechRecognizer setParameter:instance.dot forKey:[IFlySpeechConstant ASR_PTT]];}//默认停止识别self.StopListen = YES;//默认不显示,删除,确认按钮self.ClearBtn.hidden = YES;self.SureBtn.hidden = YES;//self.userInteractionEnabled = YES;//防止“null”+字符串,初始化字符串为“” = @"";self.IsAnnounce = NO;}return self;
}
-(void)ChangeFrameToWhatLand1OrVertical2:(NSInteger)Land1OrVertical2{if (Land1OrVertical2==1) {self.frame = CGRectMake(0, kYBScreenHeight-self.frame.size.height, kYBScreenWidth, self.frame.size.height);self.WordsLB.frame = CGRectMake(13, 13, self.WordsLB.frame.size.width, self.WordsLB.frame.size.height);self.IconBtn.frame = CGRectMake(self.frame.size.width/2-50, 165-50, 100, 100);self.TipLB.frame = CGRectMake(0, self.igin.y-35, self.frame.size.width, 20);self.ClearBtn.frame = CGRectMake(((self.frame.size.width-self.IconBtn.frame.size.width)/2-100)/2, self.igin.y+20, 100, 20);self.SureBtn.frame = CGRectMake(self.frame.size.width- ((self.frame.size.width-self.IconBtn.frame.size.width)/2-100)/2-100,self.igin.y+20, 100, 20);self.XFTipLB.frame = CGRectMake(0, self.frame.size.height-20, self.frame.size.width, 15);self.ListenTipView.frame = CGRectMake(kYBScreenWidth/2-70, (kYBScreenHeight/2-70)-igin.y, 140, 140);}else if(Land1OrVertical2==2){self.frame = CGRectMake(0, kYBScreenHeight-self.frame.size.height, kYBScreenWidth, self.frame.size.height);self.WordsLB.frame = CGRectMake(13, 13, self.WordsLB.frame.size.width, self.WordsLB.frame.size.height);self.IconBtn.frame = CGRectMake(self.frame.size.width/2-50, 165-50, 100, 100);self.TipLB.frame = CGRectMake(0, self.igin.y-35, self.frame.size.width, 20);self.ClearBtn.frame = CGRectMake(((self.frame.size.width-self.IconBtn.frame.size.width)/2-100)/2, self.igin.y+20, 100, 20);self.SureBtn.frame = CGRectMake(self.frame.size.width- ((self.frame.size.width-self.IconBtn.frame.size.width)/2-100)/2-100,self.igin.y+20, 100, 20);self.XFTipLB.frame = CGRectMake(0, self.frame.size.height-20, self.frame.size.width, 15);self.ListenTipView.frame = CGRectMake(kYBScreenWidth/2-70, (kYBScreenHeight/2-70)-igin.y, 140, 140);}
}-(void)ClickBtnS:(UIButton*)btn{WeakObj(self)if (btn == self.ClearBtn) { = @"";self.ClearBtn.hidden = YES;self.SureBtn.hidden = YES;}else if(btn == self.SureBtn){if (self.SureBlock) {self.SureBlock();}}
}
-(void)TapWordsLB{WeakObj(self)if (self.ClickWordsBlock) {self.ClickWordsBlock();}
}
-(void)touchInIcon:(UIButton*)btn{//点下//开始语音中self.StopListen = NO;//self.IconBtn.image = [UIImage imageNamed:@"YBkxListeningImg"];[self.IconBtn setImage:[UIImage imageNamed:@"YBkxListeningImg"] forState:UIControlStateNormal];if ([self.iFlySpeechRecognizer isListening]) {[self.iFlySpeechRecognizer cancel];}[self.iFlySpeechRecognizer startListening];// = @"识别中...";if (self.TouchUpVoiceImgBlock) {self.TouchUpVoiceImgBlock();}//隐藏可操作控件//self.WordsLB.hidden = YES;self.TipLB.hidden = YES;self.ClearBtn.hidden = YES;self.SureBtn.hidden = YES;
}
-(void)touchOutOrCancelIcon:(UIButton*)btn{//点下取消//滑倒区域外,等其他特殊情况,中断监听//结束语音后self.StopListen = YES;//self.IconBtn.image = [UIImage imageNamed:@"YBkxNoListenImg"];[self.IconBtn setImage:[UIImage imageNamed:@"YBkxNoListenImg"] forState:UIControlStateNormal];
// if ([self.iFlySpeechRecognizer isListening]) {
// [self.iFlySpeechRecognizer cancel];
//
// }//停止本次录音并识别//[self.iFlySpeechRecognizer stopListening]; = @"按住说话";if (self.TouchCancelVoiceImgBlock) {self.TouchCancelVoiceImgBlock();}//显示可操作控件//不要等识别有结果在显示,直接取消按下的时候就判断是否有文字self.TipLB.hidden = NO;if (length>0) {self.WordsLB.hidden = NO;self.ClearBtn.hidden = NO;self.SureBtn.hidden = NO;}
}
-(void)ShowListenView{[UIView setAnimationsEnabled:YES];self.alpha= 1;[UIView animateWithDuration:.3 animations:^{self.frame = CGRectMake(0, kYBScreenHeight-self.frame.size.height, self.frame.size.width, self.frame.size.height);} completion:nil];if (self.ShowBlock) {self.ShowBlock();}[self ShowWordSLB];}
-(void)HideListenView{[UIView setAnimationsEnabled:YES];self.alpha= 1;[UIView animateWithDuration:.3 animations:^{self.frame = CGRectMake(0, kYBScreenHeight, self.frame.size.width, self.frame.size.height);} completion:^(BOOL finished) {if (finished) {self.alpha = 0;}}];//隐藏默认就是,关闭语音监听self.StopListen = YES;//self.IconBtn.image = [UIImage imageNamed:@"YBkxNoListenImg"];[self.IconBtn setImage:[UIImage imageNamed:@"YBkxNoListenImg"] forState:UIControlStateNormal];if ([self.iFlySpeechRecognizer isListening]) {[self.iFlySpeechRecognizer cancel];} = @"";self.SureBtn.hidden = YES;self.ClearBtn.hidden = YES;if (self.HideBlock) {self.HideBlock();}}
-(void)onResults:(NSArray *)results isLast:(BOOL)isLast{//接收到一段录音并且转换成文字//shuNSMutableString *resultString = [[NSMutableString alloc] init];NSDictionary *dic = results[0];for (NSString *key in dic) {[resultString appendFormat:@"%@",key];}_result =[NSString stringWithFormat:@"%@%@", ,resultString];NSString * resultFromJson = [ISRDataHelper stringFromJson:resultString];NSString *subStr = [NSString stringWithFormat:@"%@%@", ,resultFromJson];if (subStr.length>20) {//超过20字,应该提示下的 = [subStr substringWithRange:NSMakeRange(0, 20)];}else{//没超过,直接显示 = subStr;}//根据总的字体长度,来决定是否隐藏两个按钮if (length>0) {//根据当前文本信息,重新绘制label的frame.CGSize lblSize = [ boundingRectWithSize:CGSizeMake(self.frame.size.width-13*2, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:15]} context:nil].size;self.WordsLB.frame = CGRectMake(self.igin.x, self.igin.y, lblSize.width, lblSize.height);}if (self.StopListen == YES) {[self.iFlySpeechRecognizer cancel];if (self.NoWordRecognizeBlock) {self.NoWordRecognizeBlock();}//显示可操作控件self.TipLB.hidden = NO;if (length>0) {self.WordsLB.hidden = NO;self.ClearBtn.hidden = NO;self.SureBtn.hidden = NO;}}if (isLast){NSLog(@"听写结果(json):%@测试", sult);}NSLog(@"_result=%@",_result);NSLog(@"resultFromJson=%@",resultFromJson);NSLog(@"isLast=%d,_=%@",isLast,);
}
-(void)ShowWordSLB{self.TipLB.hidden = NO;if (length>0) {self.SureBtn.hidden = NO;self.ClearBtn.hidden = NO;self.WordsLB.hidden = NO;//根据当前文本信息,重新绘制label的frame.CGSize lblSize = [ boundingRectWithSize:CGSizeMake(self.frame.size.width-13*2, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:15]} context:nil].size;self.WordsLB.frame = CGRectMake(self.igin.x, self.igin.y, lblSize.width, lblSize.height);}
}
-(void)onEndOfSpeech{if (self.StopListen) {//取消的情况下,识别完毕,就停止[self.iFlySpeechRecognizer cancel];if (self.NoWordRecognizeBlock) {self.NoWordRecognizeBlock();}//显示可操作控件self.TipLB.hidden = NO;if (length>0) {self.WordsLB.hidden = NO;self.ClearBtn.hidden = NO;self.SureBtn.hidden = NO;}}else{//按着的情况下,重复调用[self.iFlySpeechRecognizer startListening];}}
-(void)onError:(IFlySpeechError *)errorCode{//可提示用户识别不到语音//暂不操作//现在onerror的逻辑和OnEndOfSpeech逻辑一样if (self.StopListen) {//取消的情况下,识别完毕,就停止[self.iFlySpeechRecognizer cancel];if (self.NoWordRecognizeBlock) {self.NoWordRecognizeBlock();}//显示可操作控件self.TipLB.hidden = NO;if (length>0) {self.WordsLB.hidden = NO;self.ClearBtn.hidden = NO;self.SureBtn.hidden = NO;}}else{//按着的情况下,重复调用[self.iFlySpeechRecognizer startListening];}
}
//父级视图dealloc时调用
-(void)ShouldDelete{if (self.iFlySpeechRecognizer) {self.StopListen = YES;if ([self.iFlySpeechRecognizer isListening]) {[self.iFlySpeechRecognizer cancel];}}
}- (void)dealloc {NSLog(@"function %s-%d",__FUNCTION__,__LINE__);
}@end
在需要调用的,地方initwithframe。另外提醒下,我一直以为可以直接说完一段语音,然后再开始识别语音输出出结果;但实际上讯飞语音应该没有这么做,它是边接收语音,边识别数出结果的形式(有点略坑).
代码有些乱,不过大体上需求都是这个模子,改下就好
好了,还有不懂的小伙伴,请加QQ群一起讨论:565191947
本文发布于:2024-02-02 18:50:10,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170687101145741.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |