参考: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;

}

[ios]ios语音识别的更多相关文章

  1. [IOS]IOS UI指南

    [IOS]IOS UI指南 众所周知,IOS的界面设计,越来越流行,可以说都形成了一个标准,搜集了一些资料,供自己以后学习使用! iOS Human Interface Guidelines (中文翻 ...

  2. iOS 10 语音识别Speech Framework详解

    最近做了一个项目,涉及到语音识别,使用的是iOS的speech Framework框架,在网上搜了很多资料,也看了很多博客,但介绍的不是很详细,正好项目做完,在这里给大家详解一下speech Fram ...

  3. iOS中 语音识别功能/语音转文字教程具体解释 韩俊强的博客

    原文地址:http://blog.csdn.net/qq_31810357/article/details/51111702 前言:近期研究了一下语音识别,从百度语音识别到讯飞语音识别:首先说一下个人 ...

  4. iOS中 语音识别功能/语音转文字教程详解 韩俊强的博客

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博 原文地址:http://blog.csdn.net/qq_31810357/article/details/5111 ...

  5. IOS Google语音识别更新啦!!!

      旧版本的API:   —Google提供了一个在线语音识别的API接口,通过该API可以进行中文.英文等语言的识别.  API地址:http://www.google.com/speech-api ...

  6. [ios]ios tts的使用

    参考:http://www.tekuba.net/program/327/ http://blog.sina.com.cn/s/blog_923fdd9b0101flx3.html iOS平台由于本身 ...

  7. iOS - iOS 应用

    1.Xcode 项目属性 Product Name 软件名称.产品名称.项目名称 Organization Name 公司名称.组织名称 Organization Identifier 公司的唯一标识 ...

  8. iOS - iOS 适配

    前言 什么是适配: 适应.兼容各种不同的情况. iOS 开发中,适配的常见种类: 1)系统适配, 针对不同版本的操作系统进行适配. 2)屏幕适配,针对不同大小的屏幕尺寸进行适配. iPhone 的尺寸 ...

  9. [ios]iOS 图形编程总结

    转自:http://www.cocoachina.com/ios/20141104/10124.html iOS实现图形编程可以使用三种API(UIKIT.Core Graphics.OpenGL E ...

随机推荐

  1. qt mysql驱动问题解绝

    传统解决方法:一.解决问题 本文解决在Ubuntu16.04系统下,Qt5无法连接MySQL数据库的问题(Qt5缺少MySQL驱动,Qt5缺少libqsqlmysql.so动态库,如何安装libqsq ...

  2. [转]Visual C++ RunTime的特征——非烫即屯

    Visual C++ RunTime的特征——非烫即屯 大一刚学C语言,第二次上机课,当我发现我照着书抄写的程序在运行之外的黑框里面跳出一排“烫烫烫烫烫”,当时就震惊了.你们能想象一个来自小城, 在大 ...

  3. 取n的某些位

    实例十一:取n的某些位 方法:result=(n>>4)&(~(~0<<4)) 取出某数n的低4位. 数值0  0000 0000 ~0   1111 1111 ~0& ...

  4. NIO_2

    导语 缓冲器的设计的是新IO模型中最基础的一部分.因为新IO模型中要求所有的IO操作都需要进行缓冲.在新的IO模型中,不再向输出流写入数据和从数据流中读取数据了,而是要从缓冲区中读写数据.缓冲区可是是 ...

  5. centos crontab详解

    1.crontab安装 [root@CentOS ~]# yum install vixie-cron [root@CentOS ~]# yum install crontabs 说明:vixie-c ...

  6. python之路----进程二

    守护进程 会随着主进程的结束而结束. 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic ...

  7. Java MD5校验与RSA加密

    区别: MD5加密: 加密时通过原字符串加密成另一串字符串 解密时需要原加密字符串进行重新加密比较两次加密结果是否一致 RSA加密: 加密时通过原字符串生成密钥对(公钥+私钥) 解密时通过公钥和私钥进 ...

  8. troubleshooting-执行Oozie调度Hive导数脚本抛java.io.IOException: output.properties data exceeds its limit [2048]

    执行Oozie调度Hive导数脚本抛java.io.IOException: output.properties data exceeds its limit [2048] 原因分析 shell脚本中 ...

  9. 20145220韩旭飞《网络对抗》Exp7 网络欺诈技术防范

    20145220韩旭飞<网络对抗>Exp7 网络欺诈技术防范 应用SET工具建立冒名网站 要让冒名网站在别的主机上也能看到,需要开启本机的Apache服务,并且要将Apache服务的默认端 ...

  10. 20145225 《网络对抗》逆向及Bof基础实践

    实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getShe ...