[ios]ios语音识别
2015-09-11 10:02
441 查看
参考:http://blog.sina.com.cn/s/blog_923fdd9b0101flx1.html
通过谷歌语音接口的实现语音识别
最近在项目中有需要实现语音识别的功能。折腾了几天才搞好。刚开始做的时候没点头绪 ,网上找的资料都是乱七八糟的,要不就是非常古老的实现方法,一些简单的代码片段。所以我决定把我的经验分享给大家。
要在IOS中实现语音识别流程如下:
录音->pcm格式->转换wav->转换flac->向谷歌发送请求->等待返回的json数据->解析数据;
首先如果你要使用谷歌的接口实现语音识别必须知道下面着几点:
1.如何发送POST请求。(可以使用开源库ASIHttpRequest,AFNetWorking,这些库都封装了网络请求,使用起来非常简单);
2.了解音频格式pcm,wav,flac,(着三个音频格式的关系是,因为谷歌接口只接受flac音频格式,其他格式无法识别,IOS中无法录制flac音频格式,也无法录制wav,只能录制pcm,所以要一步一步转换);
3.了解AVAudioRecorder类如何使用,怎么配置.
在IOS中录音就要使用AVAudioRecorder这个类,这个类的实例方法如下:
- (id)initWithURL:(NSURL *)url settings:(NSDictionary *)settings error:(NSError **)outError;
url:录音完成后声音存放的位置,
settings:设置录制声音的参数,只有一个关键的key跟大家讲下AVFormatIDKey,这个key决定你录制出来声音的格式,我们要录成
lpcm格式,未压缩的原音数据,以便我们转换,所以使用kAudioFormatLinearPCM值.其他key可以在帮助文档看,
NSMutableDictionary *recordSetting =
[[NSMutableDictionaryalloc]init];
[recordSetting setValue:[NSNumbernumberWithInt:kAudioFormatLinearPCM]forKey:AVFormatIDKey];
[recordSetting setValue:[NSNumbernumberWithFloat:16000.0]forKey:AVSampleRateKey];
[recordSetting setValue:[NSNumbernumberWithInt:1]forKey:AVNumberOfChannelsKey];
[recordSetting setValue:[NSNumbernumberWithInt:16]forKey:AVLinearPCMBitDepthKey];
[recordSetting setValue:[NSNumbernumberWithInt:AVAudioQualityHigh]forKey:AVEncoderAudioQualityKey];
[recordSetting setValue:@(NO)forKey:AVLinearPCMIsBigEndianKey];
设置完这个对象后就可以开始录音了.得到lpcm格式音频数据后就开始我们的第一次转换,转换成wav,什么是wav呢?点击,
知道wav是什么之后就可以开始转码了.转码是用C实现的,着部分代码在下面我打包的文件里面;
文件转换成WAV之后还需要将WAV的转换成FLAC才能上传到谷歌接口进行语音识别,幸好在在github上有人封装好了一个FLAC的开源库:https://github.com/jhurt/FLACiOS
下载这个源码后要去掉OGG的支持,不然编译不过。直接点击文件
-,编译后进入,Products目录拿到.a和framework,把这个两个文件一起加入你的工程。
声音处理完毕后就要往谷歌语音接口发请求了。我是使用ASI发的请求,大家可以用其他库来发,毕竟ASI有点太老了,我只是用习惯了而已。这里的filePath就是转换后FLAC文件的地址;
#define GOOGLE_AUDIO_URL
@"http://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=zh-CN"
NSURL *URL = [NSURL
URLWithString:GOOGLE_AUDIO_URL];
ASIFormDataRequest *request =
[ASIFormDataRequestrequestWithURL:URL];
[request addRequestHeader:@"Content-Type"value:@"audio/x-flac;
rate=16000"];
[request
appendPostDataFromFile:filePath];
[request
setRequestMethod:@"POST"];
request.completionBlock = ^{
NSLog(@"json:
%@",request.responseString);
NSData *data = request.responseData;
id
ret = nil;
ret =
[NSJSONSerializationJSONObjectWithData:data options:NSJSONReadingMutableContainerserror:nil];
NSLog(@"ret %@",ret);
results(ret);
};
request.failedBlock = ^{
UIAlertView *alert =
[[UIAlertViewalloc]initWithTitle:@"错误"message:@"网络请求错误" delegate:nilcancelButtonTitle:@"确定" otherButtonTitles:nil,nil];
[alert show];
NSLog(@"网络请求错误:%@",request.error);
};
[request startSynchronous];
-----------------------------------------------------------------------------------------------
以下是谷歌返回的JSON解析
--------------------------------------------------------------------------------------------
if(dic ==nil || [dic count] ==
0){
return;
}
NSArray *array = [dic
objectForKey:@"hypotheses"];
if ([arraycount] ) {
NSDictionary *dic_hypotheses
= [arrayobjectAtIndex:0];
NSString * sContent
= [NSStringstringWithFormat:@"%@",
[dic_hypothesesobjectForKey:@"utterance"]];
self.textField.text = sContent;
}
这里是我写的一个测试工程全部代码
http://pan.baidu.com/s/1kTMBBk7 ;直接可以用
通过谷歌语音接口的实现语音识别
最近在项目中有需要实现语音识别的功能。折腾了几天才搞好。刚开始做的时候没点头绪 ,网上找的资料都是乱七八糟的,要不就是非常古老的实现方法,一些简单的代码片段。所以我决定把我的经验分享给大家。
要在IOS中实现语音识别流程如下:
录音->pcm格式->转换wav->转换flac->向谷歌发送请求->等待返回的json数据->解析数据;
首先如果你要使用谷歌的接口实现语音识别必须知道下面着几点:
1.如何发送POST请求。(可以使用开源库ASIHttpRequest,AFNetWorking,这些库都封装了网络请求,使用起来非常简单);
2.了解音频格式pcm,wav,flac,(着三个音频格式的关系是,因为谷歌接口只接受flac音频格式,其他格式无法识别,IOS中无法录制flac音频格式,也无法录制wav,只能录制pcm,所以要一步一步转换);
3.了解AVAudioRecorder类如何使用,怎么配置.
在IOS中录音就要使用AVAudioRecorder这个类,这个类的实例方法如下:
- (id)initWithURL:(NSURL *)url settings:(NSDictionary *)settings error:(NSError **)outError;
url:录音完成后声音存放的位置,
settings:设置录制声音的参数,只有一个关键的key跟大家讲下AVFormatIDKey,这个key决定你录制出来声音的格式,我们要录成
lpcm格式,未压缩的原音数据,以便我们转换,所以使用kAudioFormatLinearPCM值.其他key可以在帮助文档看,
NSMutableDictionary *recordSetting =
[[NSMutableDictionaryalloc]init];
[recordSetting setValue:[NSNumbernumberWithInt:kAudioFormatLinearPCM]forKey:AVFormatIDKey];
[recordSetting setValue:[NSNumbernumberWithFloat:16000.0]forKey:AVSampleRateKey];
[recordSetting setValue:[NSNumbernumberWithInt:1]forKey:AVNumberOfChannelsKey];
[recordSetting setValue:[NSNumbernumberWithInt:16]forKey:AVLinearPCMBitDepthKey];
[recordSetting setValue:[NSNumbernumberWithInt:AVAudioQualityHigh]forKey:AVEncoderAudioQualityKey];
[recordSetting setValue:@(NO)forKey:AVLinearPCMIsBigEndianKey];
设置完这个对象后就可以开始录音了.得到lpcm格式音频数据后就开始我们的第一次转换,转换成wav,什么是wav呢?点击,
知道wav是什么之后就可以开始转码了.转码是用C实现的,着部分代码在下面我打包的文件里面;
文件转换成WAV之后还需要将WAV的转换成FLAC才能上传到谷歌接口进行语音识别,幸好在在github上有人封装好了一个FLAC的开源库:https://github.com/jhurt/FLACiOS
下载这个源码后要去掉OGG的支持,不然编译不过。直接点击文件
-,编译后进入,Products目录拿到.a和framework,把这个两个文件一起加入你的工程。
声音处理完毕后就要往谷歌语音接口发请求了。我是使用ASI发的请求,大家可以用其他库来发,毕竟ASI有点太老了,我只是用习惯了而已。这里的filePath就是转换后FLAC文件的地址;
#define GOOGLE_AUDIO_URL
@"http://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=zh-CN"
NSURL *URL = [NSURL
URLWithString:GOOGLE_AUDIO_URL];
ASIFormDataRequest *request =
[ASIFormDataRequestrequestWithURL:URL];
[request addRequestHeader:@"Content-Type"value:@"audio/x-flac;
rate=16000"];
[request
appendPostDataFromFile:filePath];
[request
setRequestMethod:@"POST"];
request.completionBlock = ^{
NSLog(@"json:
%@",request.responseString);
NSData *data = request.responseData;
id
ret = nil;
ret =
[NSJSONSerializationJSONObjectWithData:data options:NSJSONReadingMutableContainerserror:nil];
NSLog(@"ret %@",ret);
results(ret);
};
request.failedBlock = ^{
UIAlertView *alert =
[[UIAlertViewalloc]initWithTitle:@"错误"message:@"网络请求错误" delegate:nilcancelButtonTitle:@"确定" otherButtonTitles:nil,nil];
[alert show];
NSLog(@"网络请求错误:%@",request.error);
};
[request startSynchronous];
-----------------------------------------------------------------------------------------------
以下是谷歌返回的JSON解析
--------------------------------------------------------------------------------------------
if(dic ==nil || [dic count] ==
0){
return;
}
NSArray *array = [dic
objectForKey:@"hypotheses"];
if ([arraycount] ) {
NSDictionary *dic_hypotheses
= [arrayobjectAtIndex:0];
NSString * sContent
= [NSStringstringWithFormat:@"%@",
[dic_hypothesesobjectForKey:@"utterance"]];
self.textField.text = sContent;
}
这里是我写的一个测试工程全部代码
http://pan.baidu.com/s/1kTMBBk7 ;直接可以用
相关文章推荐
- [ios]ios tts的使用
- 正则表达式在IOS中的应用及IOS中三种正则表达式的使用与比较
- 苹果为公测用户发布第一个 iOS 9.1 测试版
- iOS:Button.titleLabel.text
- 在iOS中9和OSX10.11配置应用程序传输安全
- 举例讲解iOS中延迟加载和上拉刷新/下拉加载的实现
- 全面了解 iOS 静态库开发
- 源码推荐(9.11):带指示牌晃动效果的进度条,ios涂鸦支持贝塞尔曲线
- iOS Block之皮毛
- iOS 生成静态库.a文件
- licode的ios最新版本的接入
- iOS 9学习系列:打通 iOS 9 的通用链接(Universal Links)
- iOS宏定义的使用与规范
- 【读书笔记】iOS-垃圾回收
- IOS学习笔记之获取Plist文件读取数据
- 【读书笔记】iOS-垃圾回收
- ios 控件代码transform学习笔记
- 【转载】iOS堆和栈的理解
- iOS系统 越狱系统还原(平刷)
- IOS中Json解析的四种方法