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];
}
iOS开发之语音功能实现的更多相关文章
- IOS开发之支付功能概述
前言:本随笔将对IOS开发的支付功能进行一个概述. 内容大纲: 一.常见的支付方案简介 二.第三方支付SDK 三.苹果官方支付方案 四.Web支付方案 正文: 一.常见的支付方案简介 在微信支付中 微 ...
- iOS开发: 向右滑动手势功能实现
在navigationController中实现向右滑动 返回功能 系统提供的backbarbuttonitem,不用添加任何代码即可实现向右滑动后退功能,但是往往要对按钮修改样式等时,就需要自定义l ...
- iOS开发-清理缓存功能的实现
移动应用在处理网络资源时,一般都会做离线缓存处理,其中以图片缓存最为典型,其中很流行的离线缓存框架为SDWebImage. 但是,离线缓存会占用手机存储空间,所以缓存清理功能基本成为资讯.购物.阅读类 ...
- iOS开发系统类功能划分
0.OC语法基础 CHOCBase Object C语法学习笔记(一) Object C语法学习笔记(二) 1.UI类 自定义控件程序运行流程 setNeedsLayOut和setNeedsDispl ...
- iOS开发总结-搜索功能实现--使用SKTag
TagsTableViewController.h 文件 #import <UIKit/UIKit.h> #import "personSearch.h" @inter ...
- iOS开发打电话的功能
1,这种方法,拨打完电话回不到原来的应用,会停留在通讯录里,而且是直接拨打,不弹出提示 NSMutableString * phoneStr=[[NSMutableString alloc] init ...
- iOS开发笔记10:圆点缩放动画、强制更新、远程推送加语音提醒及UIView截屏
1.使用CAReplicatorLayer制作等待动画 CALayer+CABasicAnimation可以制作很多简单的动画效果,之前的博客中介绍的“两个动画”,一个是利用一张渐变色图片+CABas ...
- iOS开发之窥探UICollectionViewController(四) --一款功能强大的自定义瀑布流
在上一篇博客中<iOS开发之窥探UICollectionViewController(三) --使用UICollectionView自定义瀑布流>,自定义瀑布流的列数,Cell的外边距,C ...
- 深入理解iOS开发中的BitCode功能
前言 做iOS开发的朋友们都知道,目前最新的Xcode7,新建项目默认就打开了bitcode设置.而且大部分开发者都被这个突如其来的bitcode功能给坑过导致项目编译失败,而这些因为bitcode而 ...
随机推荐
- Cocos2dx-lua开发之c++绑定到lua
一. 简单介绍 文章介绍是在实际的游戏开发项目中,将自定义的C++类绑定到lua中,能够让lua调用c++类.会创建一个python脚本,执行python脚本会让自动将我们的c++类绑定到lua.生成 ...
- [转]UIApplicationDelegate分析小结
转载地址:http://www.apkbus.com/android-131646-1-1.html 我们开发出来的运行在iOS平台上的应用程序都有一个UIApplication类的对象.1.是iOS ...
- java中文件的读取和写入
//首先要顶一个file文件用来存放要读取的文件 File f=new File("c:/test/aa.txt"); //在实例化一个输入流,并把文件对象传到里面 FileInp ...
- Python中通过cx_Oracle访问数据库遇到的问题总结
以下是Python中通过cx_Oracle操作数据库的过程中我所遇到的问题总结,感谢我们测试组的前辈朱勃给予的帮助最终解决了下列两个问题: 1)安装cx_Oracle会遇到的问题:在Windo ...
- linux 文件操作命令
目录操作命令 命令格式 命令 [-选项] [-参数] ls -la /etc 有多个选项时可以合并 ls命令: -a (all) 显示所有文件,包括隐藏文件,那是用.开头的文件 为什么要隐藏(这是个系 ...
- grails的layouts模板页面使用
使用方式1: layouts文件夹下新建文件,名称和Controller名称相同,例如UserController,layouts下面创建user.gsp,此时,user站点下所有的页面都将套用 us ...
- Response.Cookies 和 Request.Cookies
Response.Cookies 和 Request.Cookies 原文地址: http://www.cnblogs.com/forcertain/archive/2012/12/04/28 ...
- Task<TResult>的使用
https://msdn.microsoft.com/en-us/library/dd321424(v=vs.110).aspx Represents an asynchronous operatio ...
- python基础字符串操作
去空格及特殊符号 s.strip().lstrip().rstrip(',') 复制字符串 #strcpy(sStr1,sStr2) sStr1 = 'strcpy' sStr2 = sStr1 sS ...
- Timeout expired超时时间已到. 达到了最大池大小 错误及Max Pool Size设置
此文章非原创,仅为分享.学习!!! 参考数据库链接串: <add key="data" value="server=192.168.1.123; port=3306 ...