iOS开发之语音功能实现

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

//创建语音配置,appid必须要传入,仅执行一次则可

NSString *initString = [[NSString alloc] initWithFormat:@"appid=570f3db3"];

//所有服务启动前,需要确保执行createUtility

[IFlySpeechUtility createUtility:initString];

return YES;

}

制作录音文件,使用apple原生API框架。需要添加头文件AVFoundation框架,在程序第一次启用时候会请求是否打开此项功能。另使用科大API只能免费使用在线SDK,调用离线SDK只能用于3个iOS设备使用35天。离线购买价格很贵。

#import "iflyMSC/IFlyMSC.h"

#import "iflyMSC/IFlySpeechConstant.h"

#import "iflyMSC/IFlySpeechRecognizerDelegate.h"

#import "iflyMSC/IFlySpeechRecognizer.h"

@import AVFoundation;

<AVAudioRecorderDelegate>使用代理

@property (nonatomic,strong)IFlySpeechRecognizer *iFlySpeechRecognizer;

@property (nonatomic,strong)AVAudioRecorder *recorder;

@property (nonatomic,strong)AVAudioPlayer *player;

@property (nonatomic,strong)NSTimer *timer;

@property (nonatomic,strong)NSURL *url;

@property (nonatomic,strong)NSMutableDictionary *dict;

@property (nonatomic,strong)UIProgressView *gress;

@property (nonatomic,strong)NSMutableString *text;

@property (weak, nonatomic) IBOutlet UITextField *textField;

AVAudioSession *session = [AVAudioSession sharedInstance];

//单例模式,设置为录音并播放

[session setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];

[session setActive:YES error:nil];

NSString *str = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];

self.url = [NSURL fileURLWithPath:[str stringByAppendingPathComponent:@"myFirstRecord.caf"]];

设置文件的保存路径

self.gress = [[UIProgressView alloc]initWithProgressViewStyle:UIProgressViewStyleDefault];

self.gress.progress = 0;设置进度条

self.gress.frame = CGRectMake(90, 200, 200, 2);

[self.view addSubview:self.gress];

self.dict = [NSMutableDictionary dictionary];

[self.dict setObject:@(kAudioFormatLinearPCM) forKey:AVFormatIDKey];

[self.dict setObject:@10000 forKey:AVSampleRateKey];

[self.dict setObject:@1 forKey:AVNumberOfChannelsKey];

[self.dict setObject:@8 forKey:AVLinearPCMBitDepthKey];

[self.dict setObject:@(YES) forKey:AVLinearPCMIsFloatKey];

if (!_recorder) {

_recorder = [[AVAudioRecorder alloc]initWithURL:self.url settings:self.dict error:nil];

_recorder.delegate = self;

_recorder.meteringEnabled = YES;

}

if (!_player) {

_player = [[AVAudioPlayer alloc]initWithContentsOfURL:self.url error:nil];

}

[self start];

- (void)start{

_iFlySpeechRecognizer = [IFlySpeechRecognizer sharedInstance]; //设置听写模式

_iFlySpeechRecognizer.delegate = self;

//2.设置听写参数

[_iFlySpeechRecognizer setParameter: @"iat" forKey: [IFlySpeechConstant IFLY_DOMAIN]];

//asr_audio_path是录音文件名,设置value为nil或者为空取消保存,默认保存目录在 Library/cache下。

[_iFlySpeechRecognizer setParameter:@"asrview.pcm" forKey:[IFlySpeechConstant ASR_AUDIO_PATH]];

//3.启动识别服务 [_iFlySpeechRecognizer start];

}

- (NSTimer *)timer{

if (!_timer) {

_timer = [NSTimer scheduledTimerWithTimeInterval:1/20.0 target:self selector:@selector(showProgress:) userInfo:nil repeats:YES];

NSLog(@"nstime");

}

return _timer;

}

- (void)showProgress:(NSTimer*)t{

[self.recorder updateMeters];

float power = [self.recorder averagePowerForChannel:0];//取得第一个通道的音频,注意音频强度范围时-160到0

self.gress.progress = (power+160)/160.0;

}

- (IBAction)recording:(id)sender {

if (![self.recorder isRecording]) {

[self.recorder record];

self.timer.fireDate = [NSDate distantPast];

}

NSLog(@"录音开始!");

}

- (IBAction)pause:(id)sender {

if (![self.recorder isRecording]) {

[self.recorder pause];

self.timer.fireDate = [NSDate distantFuture];

}else{

[self.recorder record];

self.timer.fireDate = [NSDate distantPast];

}

NSLog(@"暂停切换!");

}

- (IBAction)stop:(id)sender {

[self.recorder stop];

NSLog(@"录音结束!");

self.timer.fireDate = [NSDate distantFuture];

self.timer = nil;

self.gress.progress = 0;

}

- (IBAction)iflyClick:(id)sender {

NSLog(@"iflyClick");按下button的时候调用方法TouchDown

_text = [[NSMutableString alloc]init];

[_iFlySpeechRecognizer startListening];

}

- (IBAction)iflyClickstop:(id)sender {

NSLog(@"iflyClickstop");离开button后调用的方法,无论是在按钮上离开还是在按钮外离开都执行。TouchUpInside&TouchUpOutside

[_iFlySpeechRecognizer stopListening];

}

#pragma  - mark -   AVAudioRecordDelegate

- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag{

AVAudioSession *session = [AVAudioSession sharedInstance];

[session setCategory:AVAudioSessionCategoryPlayback error:nil]; //开启扬声器

[session setActive:YES error:nil];

if(![self.player isPlaying]){

[self.player play];

}

NSLog(@"录音完成!");

}

#pragma  - mark -   IFlySpeechRecognizerDelegate

- (void) onError:(IFlySpeechError *) errorCode{

NSLog(@"onError-----------------%@",errorCode);

}

- (void) onResults:(NSArray *) results isLast:(BOOL)isLast{

NSLog(@"onResults-----------------%@",results);

NSMutableString *result = [[NSMutableString alloc] init];

NSDictionary *dic = [results objectAtIndex:0];

for (NSString *key in dic){

[result appendFormat:@"%@",key];//合并结果

}

NSLog(@"result-------%@",result);

NSMutableArray *strArr = [[result componentsSeparatedByString:@"\"}]}"] mutableCopy];

[strArr removeLastObject];

for (NSString *str in strArr) {

[_text appendString:[[str componentsSeparatedByString:@"\""]lastObject]];

}

NSLog(@"_text-------%@",_text);

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

self.textField.text = _text;

});

}

-(void)viewWillDisappear:(BOOL)animated

{

[_iFlySpeechRecognizer cancel];

_iFlySpeechRecognizer.delegate = nil;

//设置回非语义识别

[_iFlySpeechRecognizer destroy];

[super viewWillDisappear:animated];

}

时间: 2025-01-19 20:24:37

iOS开发之语音功能实现的相关文章

IOS开发之支付功能概述

前言:本随笔将对IOS开发的支付功能进行一个概述. 内容大纲: 一.常见的支付方案简介 二.第三方支付SDK 三.苹果官方支付方案 四.Web支付方案 正文: 一.常见的支付方案简介 在微信支付中 微信支付的网址是: https://pay.weixin.qq.com/wiki/doc/api/index.html 进去之后,我们可以看到网页,但我接下来主要讲的是app支付 app支付的过程:商业app通过集成微信SDK,用户解析后跳转到微信内软件支付的过程. 点进去app支付: 我们可以看到A

iOS开发 - 网络&amp;数据库功能综述

学习经验尚浅,以前iOS开发一直停留在单机版的开发,但是现在如果一个移动端开发完全抛弃网络功能,它也不会存在很久.网上讲的关于iOS的网络部分都比较专一,这两天经过融合和总结,大致摸索出了一套整体流程,在此和对网络连接不甚明了的同学分享,本文不涉及技术层面,只是概念的串通. 前提注:如果你真的只是开发一个单机版app也或者公司已经将网络数据封装好给你个接口or XML格式等文件用而且也不想知道的话就请华丽丽地忽视我吧. 一.前提概览 首先,要考虑app所在的大环境是个什么级别的环境,我大致将环境

iOS开发部分小功能(1)

功能:打电话 方法1: NSURL *url = [NSURL URLWithString:@"tel://10010"]; [[UIApplication sharedApplication] openURL:url]; 优点:直接跳到拨号界面,最简单最直接.缺点:电话打完后,不会自动回到原应用,直接停留在通话记录界面. 方法2: if (_webView == nil) { _webView = [[UIWebView alloc] initWithFrame:self.view.

iOS开发-清理缓存功能的实现

移动应用在处理网络资源时,一般都会做离线缓存处理,其中以图片缓存最为典型,其中很流行的离线缓存框架为SDWebImage. 但是,离线缓存会占用手机存储空间,所以缓存清理功能基本成为资讯.购物.阅读类app的标配功能. 今天介绍的离线缓存功能的实现,主要分为缓存文件大小的获取.删除缓存文件的实现. 获取缓存文件的大小 由于缓存文件存在沙箱中,我们可以通过NSFileManager API来实现对缓存文件大小的计算. 计算单个文件大小 +(float)fileSizeAtPath:(NSStrin

ios开发- NSOperation高级功能

直接上代码 示例1: @interface TBViewController() //队列 @property(nonatomic,strong)NSOperationQueue *queue; @end //队列的暂停和继续(在storyboard中拖两个按钮,分别为暂停.继续,连线) //暂停 -(IBAction)pause { if(self.queue.operationCount == 0){ NSLog(@"无操作"): return: } //挂起>暂停  暂停的

iOS开发之语音录制

首先我们需要进行麦克风访问授权 AVAudioSessionRecordPermission permission = [[AVAudioSession sharedInstance] recordPermission]; //判断是否授权 if (AVAudioSessionRecordPermissionUndetermined == permission) { [[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL g

iOS开发--添加定位功能

.h 首先在头文件中#import <CoreLocation/CoreLocation.h> 添加CLLocationManagerDelegate协议 @property (strong, nonatomic) IBOutlet CLLocationManager *myLocationManager; .m 在- (void)viewDidLoad添加以下代码: self.myLocationManager=[[CLLocationManager alloc]init]; [self.m

【iOS开发】封装聊天输入框MKInputBar,语音支持iOS &amp; Android平台

最近做的一个项目,有聊天的功能,最开始从网上找了个被人封装好的输入框,写的很复杂(反正我有点被看迷糊了),用起来呢又有点问题,最终放弃,自己封装了一个聊天输入框MKInputBar,难度不大.语音支持iOS和Android平台,其实就是把caf转换为mp3.底部给出了Demo工程,用起来很简单. 先上几张图吧       用法很简答,封装好只有两个文件MKInputBar.h & MKInputBar.m,实现三个代理方法: 1 - (void)inputBar:(MKInputBar *)in

iOS开发中打电话发短信等功能的实现

在APP开发中,可能会涉及到打电话.发短信.发邮件等功能.比如说,通常一个产品的“关于”页面,会有开发者的联系方式,理想情况下,当用户点击该电话号码时,能够自动的帮用户拨出去,就涉及到了打电话的功能. iOS开发中,有三种方式可以打电话: (1)直接跳到拨号界面,代码如下 1 2 NSURL *url = [NSURL URLWithString:@"tel://10010"];  [[UIApplication sharedApplication] openURL:url]; 缺点: