- (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];

}

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

  1. IOS开发之支付功能概述

    前言:本随笔将对IOS开发的支付功能进行一个概述. 内容大纲: 一.常见的支付方案简介 二.第三方支付SDK 三.苹果官方支付方案 四.Web支付方案 正文: 一.常见的支付方案简介 在微信支付中 微 ...

  2. iOS开发: 向右滑动手势功能实现

    在navigationController中实现向右滑动 返回功能 系统提供的backbarbuttonitem,不用添加任何代码即可实现向右滑动后退功能,但是往往要对按钮修改样式等时,就需要自定义l ...

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

    移动应用在处理网络资源时,一般都会做离线缓存处理,其中以图片缓存最为典型,其中很流行的离线缓存框架为SDWebImage. 但是,离线缓存会占用手机存储空间,所以缓存清理功能基本成为资讯.购物.阅读类 ...

  4. iOS开发系统类功能划分

    0.OC语法基础 CHOCBase Object C语法学习笔记(一) Object C语法学习笔记(二) 1.UI类 自定义控件程序运行流程 setNeedsLayOut和setNeedsDispl ...

  5. iOS开发总结-搜索功能实现--使用SKTag

    TagsTableViewController.h 文件 #import <UIKit/UIKit.h> #import "personSearch.h" @inter ...

  6. iOS开发打电话的功能

    1,这种方法,拨打完电话回不到原来的应用,会停留在通讯录里,而且是直接拨打,不弹出提示 NSMutableString * phoneStr=[[NSMutableString alloc] init ...

  7. iOS开发笔记10:圆点缩放动画、强制更新、远程推送加语音提醒及UIView截屏

    1.使用CAReplicatorLayer制作等待动画 CALayer+CABasicAnimation可以制作很多简单的动画效果,之前的博客中介绍的“两个动画”,一个是利用一张渐变色图片+CABas ...

  8. iOS开发之窥探UICollectionViewController(四) --一款功能强大的自定义瀑布流

    在上一篇博客中<iOS开发之窥探UICollectionViewController(三) --使用UICollectionView自定义瀑布流>,自定义瀑布流的列数,Cell的外边距,C ...

  9. 深入理解iOS开发中的BitCode功能

    前言 做iOS开发的朋友们都知道,目前最新的Xcode7,新建项目默认就打开了bitcode设置.而且大部分开发者都被这个突如其来的bitcode功能给坑过导致项目编译失败,而这些因为bitcode而 ...

随机推荐

  1. poj1988 Cube Stacking

    并查集的高效之处在于路径压缩和延迟更新. 在本题中需要额外维护子树的规模以及当前子树节点到跟的距离两个数组. 由于一个新的数必然是两棵树拼接而成,对于子树规模的更新直接相加即可, 对于节点到跟的距离: ...

  2. Fibonacci Again 分类: HDU 2015-06-26 11:05 13人阅读 评论(0) 收藏

    Fibonacci Again Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tot ...

  3. unity替换mesh测试

    直接替换SkinnedMeshRender的Mesh,实现所谓断肢效果(不过最近发现,绑定多mesh似乎更好实现这样的效果.有时间准备写一篇): 只要不改变两个Mesh原始文件的层级,就不会出现权重的 ...

  4. github pages搭建个人网站如何添加导航

    折腾过github pages的同学都清楚使用jekyll搭建个人网站的目录结构,而导航最终的代码是在使用的主题目录中的default.html文件中的. 我的结构如下: . ├── .html ├─ ...

  5. torch基本命令

    命令行输入th进入torch框架 命令行输入th + lua文件表示用torch执行lua文件

  6. jquery简单插件到复杂插件(3)--顶部导航固定

    那个效果很多,比如hao123的头部 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...

  7. EF 存储过程

    今天我们利用EF执行sql语句的方式来执行存储过程,并得到OutPut的值. 首先新建存储过程: Create PROCEDURE proc_testEF   (     @id int,     @ ...

  8. Twitter数据抓取

    说明:这里分三个系列介绍Twitter数据的非API抓取方法.有兴趣的QQ群交流: BitCrawler网络爬虫QQ群 322937592 1.Twitter数据抓取(一) 2.Twitter数据抓取 ...

  9. Zabbix监控交换机设置

    说明: Zabbix监控服务端已经配置完成,现在要使用Zabbix对交换机进行监控. 具体操作: 以下操作在被监控的交换机上进行,这里以Cisco交换机为例. 一.登录到Cisco交换机,开启snmp ...

  10. img 图片高度设置为百分比无效的解答

    当用百分比作为宽高时  因为百分比是相对于其最近的父元素的宽高,所以首先其父元素要有宽高,宽度一般不设置会有默认值(比如整个屏幕的宽度),但是高度不设置就没有默认值,因此如果父元素没设高度值,而其内部 ...