- (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. Integer Inquiry -TJU1112

    作为最简单的高精度加法,要注意的是如下几点, 第一,因为是数位达到上百位的大数,所以只能用字符串数组来存贮. 第二,为了方便之后的相加操作,应该把字符串数组逆序转化为一个整型数组. 第三,在控制进位的 ...

  2. js笔记---(运动)通用的move方法,兼容透明度变化

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  3. YTU 2335: 0-1背包问题

    2335: 0-1背包问题 时间限制: 1 Sec  内存限制: 128 MB 提交: 15  解决: 12 题目描述 试设计一个用回溯法搜索子集空间树的函数.该函数的参数包括结点可行性判定函数和上界 ...

  4. asp.net 父窗体获取子窗体的返回值,可用来对父窗体局部更新

    今天在项目上遇到了这个问题,其实只是window.returnValue的简单应用,不是asp.net的专属内容.作为积累,记录一个简单的实现模型. 图1  用到的文件 从图1中我们可以看到,只用到了 ...

  5. Andriod 字符串数组里加入字符串元素

    private String[] t1 = { "姓名", "性别", "年龄", "居住地","邮箱&quo ...

  6. eclipse编辑jsp快捷键保存时特别卡的解决方法

    今天eclipse用着用着的时候,每次编辑jsp页面快捷键保存的时候要等半天才保存好,特别的卡.搞的很蛋疼.上网搜了下有解决办法 Window -> Preference -> Gener ...

  7. SSL/TLS 原理详解

    本文大部分整理自网络,相关文章请见文后参考. SSL/TLS作为一种互联网安全加密技术,原理较为复杂,枯燥而无味,我也是试图理解之后重新整理,尽量做到层次清晰.正文开始. 1. SSL/TLS概览 1 ...

  8. Linux运维命令之一

    释放内存:syncecho 3 > /proc/sys/vm/drop_caches Linux查看Dell服务器型号命令:dmidecode | grep "Product Name ...

  9. R语言画图基础参数设置

    Graphical Parameters You can customize many features of your graphs (fonts, colors, axes, titles) th ...

  10. Shared Assembilies and Strongly Named Assemblies

    the .NET Framework has in place to deal with versioning problems. Two Kinds of Assemblies, Two Kinds ...