【iOS篇】使用科大讯飞SDK集成语音合成和识别

科大讯飞语音集成(语音识别和语音合成)

讯飞开发步骤

1.申请账号
链接:http://member.xfyun.cn/index.php/default/register?referer=&visitor_from=YmFpZHU=
2.参考文档
链接:http://www.xfyun.cn/doccenter/iOS
3.相关SDK下载
链接:http://www.xfyun.cn/sdk/dispatcher
4.集成步骤

4.1、在创建应用的界面完成相关信息的填写,然后下载对应的SDK;
4.2、下载下来的SDK包解压出来有三个文件夹,第一个市doc文件夹,不多说,肯定是开发文档, 还有相关的作者信息什么的.最重要的是剩下的两个文件夹,一个是lib文件夹,这里存放的是讯飞SDK的类库文件,我们导入SDK就是导入的这里的文件. 第三个文件夹是一个IOS的Demo演示工程.
4.3、新建一个IOS工程,将lib文件夹下的”iflyMSC.framework”文件拷贝到工程目录下,然后在工程配置文件的[Build Phases]-[Link Binary With Libraries]中通过[AddOther];
4.4、确认SDK路径。在配置文件中搜索”head”找到[Framework Search Paths],点开查看SDK的路径是不是绝对路径,如果是如下图的样子,那就没问题了.这一步主要是确保SDK的路径为相对路径,防止工程换了文件夹位置就无法运行的情况的发生.
4.5、添加框架

5.语音识别

语音识别分两种,分别用在不同的场合,一个是界面提示的语音识别,一个是无界面提示的语音识别,这里以有界面提示的语音识别为例子.
5.1、有界面提示的语音识别
1 导入头文件
//将讯飞SDK中的所有类都导入进来
#import < iflyMSC/iflyMSC.h >
2 登陆讯飞服务器在使用讯飞的语音解析之前,需要进行用户身份验证,即登陆讯飞服务器,这个在viewDidLoad()方法中添加两行代码即可.后面的ID数字就是之前我们在开放平台创建按自己应用时给的APPID,在下载的SDK中也是有的.

NSString *initString = [[NSString alloc] initWithFormat:@"appid=%@",@"565e4dd9"];
[IFlySpeechUtility createUtility:initString];

3 创建有界面提示的语音识别对象创建一个讯飞语音识别对象,可以对他进行一系列的调用

@property (nonatomic, strong) IFlyRecognizerView *iflyRecognizerView;//带界面的识别对象

4 初始化带界面的识别对象前面声明了一个带界面的语音识别对象,现在需要对这个识别对象进行初始化,同样是在ViewDidLoad()方法中进行就行.
#pragma mark ------ 进行有界面的语音识别的初始化
_iflyRecognizerView = [[IFlyRecognizerView alloc] initWithCenter:self.view.center];
_iflyRecognizerView.delegate = self;
[_iflyRecognizerView setParameter: @“iat” forKey: [IFlySpeechConstant IFLY_DOMAIN]];
//asr_audio_path保存录音文件名,如不再需要,设置value为nil表示取消,默认目录是documents

  [_iflyRecognizerView setParameter:@"asrview.pcm " forKey:[IFlySpeechConstant ASR_AUDIO_PATH]];

5 实现代理方法讯飞对识别结果的处理采用的代理回调的方法,实现IFlySpeechSynthesizerDelegate协议的onResult:isLast:方法.注意!!!这里的是onResult,不是onResults,后者是无界面提示的语音解析的结果回调函数.
- (void)onResult: (NSArray *)resultArray isLast:(BOOL) isLast
{
NSMutableString *result = [[NSMutableString alloc] init];
NSDictionary *dic = [resultArray objectAtIndex:0];
for (NSString *key in dic) {
[result appendFormat:@"%@",key];
}
NSString * resu = [ISRDataHelper stringFromJson:result];
//将结果显示在界面的Label上
_text.text = [NSString stringWithFormat:@"%@%@",_text.text,resu];
}
这里默认的传回来的是Json字符串,需要对字符串进行解析.当然,讯飞还是比较良心的,在demo中给提供了一个解析类,就是上面用到的ISRDataHelper.用它来进行解析就可以了. 6 触发开始语音识别 拖动一个Button,给一个响应事件,用于开始监听语音识别
//启动识别服务

[_iflyRecognizerView start];

5.2、无界面提示的语音识别
无界面提示的语音识别适合将语音识别放在后台,这个看具体的使用场景.无界面的方式相对来说简洁大方,可制定性高.
1 导入头文件
将讯飞SDK中的所有类都导入进来
#import < iflyMSC/iflyMSC.h >
2 登陆讯飞服务器在使用讯飞的语音解析之前,需要进行用户身份验证,即登陆讯飞服务器,这个在viewDidLoad()方法中添加两行代码即可.后面的ID数字就是之前我们在开放平台创建按自己应用时给的APPID,在下载的SDK中也是有的.

NSString *initString = [[NSString alloc] initWithFormat:@"appid=%@",@"565e4dd9"];
[IFlySpeechUtility createUtility:initString];

3 创建无界面提示的语音识别对象创建一个讯飞语音识别对象,可以对他进行一系列的调用

 @property (nonatomic, strong) IFlySpeechRecognizer *iFlySpeechRecognizer;//不带界面的识别对象

4 对象初始化前面声明了一些在语音合成的时候会用到的对象,现在需要对前面的对象进行初始化.还是在ViewDidLoad()里面进行就可以了.这里的初始化内容比较多,是进行一些语音的设置,所以单独做成了一个方法,在ViewDidLoad()中进行调用即可.

 -(void)initRecognizer{
 //单例模式,无UI的实例
 if (_iFlySpeechRecognizer == nil) {
    _iFlySpeechRecognizer = [IFlySpeechRecognizer sharedInstance];            
    [_iFlySpeechRecognizer setParameter:@"" forKey:[IFlySpeechConstant PARAMS]];

  //设置听写模式
  [_iFlySpeechRecognizer setParameter:@"iat" forKey:[IFlySpeechConstant IFLY_DOMAIN]];
  }
_iFlySpeechRecognizer.delegate = self;    
if (_iFlySpeechRecognizer != nil) {
   IATConfig *instance = [IATConfig sharedInstance];     
    //设置最长录音时间
   [_iFlySpeechRecognizer setParameter:instance.speechTimeout forKey:[IFlySpeechConstant SPEECH_TIMEOUT]];
   //设置后端点
    [_iFlySpeechRecognizer setParameter:instance.vadEos forKey:[IFlySpeechConstant VAD_EOS]];
//设置前端点
[_iFlySpeechRecognizer setParameter:instance.vadBos forKey:[IFlySpeechConstant VAD_BOS]];
//网络等待时间
[_iFlySpeechRecognizer setParameter:@"20000" forKey:[IFlySpeechConstant NET_TIMEOUT]];    
//设置采样率,推荐使用16K
[_iFlySpeechRecognizer setParameter:instance.sampleRate forKey:[IFlySpeechConstant SAMPLE_RATE]];    
if ([instance.language isEqualToString:[IATConfig chinese]]) {
    //设置语言
    [_iFlySpeechRecognizer setParameter:instance.language forKey:[IFlySpeechConstant LANGUAGE]];
    //设置方言
    [_iFlySpeechRecognizer setParameter:instance.accent forKey:[IFlySpeechConstant ACCENT]];
}else if ([instance.language isEqualToString:[IATConfig english]]) {
    [_iFlySpeechRecognizer setParameter:instance.language forKey:[IFlySpeechConstant LANGUAGE]];
}
//设置是否返回标点符号
[_iFlySpeechRecognizer setParameter:instance.dot forKey:[IFlySpeechConstant ASR_PTT]];    
 }
}

5 实现代理方法讯飞对识别结果的处理采用的代理回调的方法,实现IFlySpeechSynthesizerDelegate协议的onResult:isLast:方法.注意!!!这里的是onResults,不是onResult,前者是有界面提示的语音识别的结果回调函数.
- (void) onResults:(NSArray *) results isLast:(BOOL)isLast{
NSMutableString *result = [[NSMutableString alloc] init];
NSDictionary *dic = [results objectAtIndex:0];
for (NSString *key in dic) {
[result appendFormat:@"%@",key];
}
NSString * resu = [ISRDataHelper stringFromJson:result];
_text.text = [NSString stringWithFormat:@"%@%@",_text.text,resu];
}
6 触发语音合成添加一个输入框,一个button,button的响应时间是将输入框中的文本内容读出来.

 if(_iFlySpeechRecognizer == nil)
{
[self initRecognizer];
}
[_iFlySpeechRecognizer cancel];
//设置音频来源为麦克风
[_iFlySpeechRecognizer setParameter:IFLY_AUDIO_SOURCE_MIC forKey:@"audio_source"];
//设置听写结果格式为json
 [_iFlySpeechRecognizer setParameter:@"json" forKey:[IFlySpeechConstant RESULT_TYPE]];
//保存录音文件,保存在sdk工作路径中,如未设置工作路径,则默认保存在library/cache下
[_iFlySpeechRecognizer setParameter:@"asr.pcm" forKey:[IFlySpeechConstant ASR_AUDIO_PATH]];
[_iFlySpeechRecognizer setDelegate:self];
BOOL ret = [_iFlySpeechRecognizer startListening];

6.语音合成
语音合成和语音识别的过程差不多
1 导入头文件
将讯飞SDK中的所有类都导入进来
#import < iflyMSC/iflyMSC.h >
#import “PcmPlayer.h”
#import “TTSConfig.h”
2 登陆讯飞服务器在使用讯飞的语音解析之前,需要进行用户身份验证,即登陆讯飞服务器,这个在viewDidLoad()方法中添加两行代码即可.后面的ID数字就是之前我们在开放平台创建按自己应用时给的APPID,在下载的SDK中也是有的.

NSString *initString = [[NSString alloc] initWithFormat:@"appid=%@",@"565e4dd9"];
[IFlySpeechUtility createUtility:initString];

3 创建有界面提示的语音识别对象创建一个讯飞语音识别对象,可以对他进行一系列的调用

typedef NS_OPTIONS(NSInteger, SynthesizeType) {
NomalType           = 5,//普通合成
UriType             = 6, //uri合成
};
@property (nonatomic, strong) IFlySpeechSynthesizer * iFlySpeechSynthesizer;//语音合成对象
@property (nonatomic, strong) PcmPlayer *audioPlayer;//用于播放音频的
@property (nonatomic, assign) SynthesizeType synType;//是何种合成方式
@property (nonatomic, assign) BOOL hasError;//解析过程中是否出现错误

4 对象初始化前面声明了一些在语音合成的时候会用到的对象,现在需要对前面的对象进行初始化.还是在ViewDidLoad()里面进行就可以了.

   *instance = [TTSConfig sharedInstance];
   1	if (instance == nil) {
return;
 }
 //合成服务单例
  if (_iFlySpeechSynthesizer == nil) {
_iFlySpeechSynthesizer = [IFlySpeechSynthesizer sharedInstance];
  }    
_iFlySpeechSynthesizer.delegate = self;    
 //设置语速1-100
 [_iFlySpeechSynthesizer setParameter:instance.speed forKey:[IFlySpeechConstant SPEED]];    
 //设置音量1-100
 [_iFlySpeechSynthesizer setParameter:instance.volume forKey:[IFlySpeechConstant VOLUME]];    
 //设置音调1-100
 [_iFlySpeechSynthesizer setParameter:instance.pitch forKey:[IFlySpeechConstant PITCH]];   
 //设置采样率
 [_iFlySpeechSynthesizer setParameter:instance.sampleRate forKey:[IFlySpeechConstant SAMPLE_RATE]];
 //设置发音人
 [_iFlySpeechSynthesizer setParameter:instance.vcnName forKey:[IFlySpeechConstant VOICE_NAME]];

5 触发语音合成添加一个输入框,一个button,button的响应时间是将输入框中的文本内容读出来.

 if ([self.VoiceText.text isEqualToString:@""]) {
return;
}
if (_audioPlayer != nil && _audioPlayer.isPlaying == YES) {
[_audioPlayer stop];
}
_synType = NomalType;
self.hasError = NO;
[NSThread sleepForTimeInterval:0.05];
_iFlySpeechSynthesizer.delegate = self;
[_iFlySpeechSynthesizer startSpeaking:self.VoiceText.text];

demo地址

2 预备工作 2.1 创建iOS工程 在XCode中建立你的工程,或者打开已经建立的工程。 2.2 添加静态库 将开发工具包中lib目录下的iflyMSC.framework添加到新建工程中(如下图所示)。 提交 图一 图二 提交 图三 2.3 添加framework 按下图添加SDK所需要的iOS库,请注意libz.dylib,CoreTelephoney.framework不要遗漏。 提交 图四 注:如果使用的是离线识别,还需要增加libc++.dylib。 2.4 确认SDK的路径 提交 图五 请确认上图红色部分的路径能够找到iflyMSC.framework。为了支持多人开发,建议双击红色部分,把路径改为相对路径,例如像下图所示。 提交 图六 注意:请把不必要的路径删除。例如更新了SDK后,新的SDK与旧的SDK不在同一路径,请把旧的路径删除,避免引用到旧的库。对应集成SDK后发现编译失败,提示找不到头文件,请先检查这个路径是否正确。 2.5 导入头文件 在你需要使用MSC服务的文件中导入相应的头文件 例如: C/C++ Code //带界面的语音识别控件 #import “iflyMSC/IFlyRecognizerViewDelegate.h” #import “iflyMSC/IFlyRecognizerView.h” C/C++ Code //不带界面的语音识别控件 #import “iflyMSC/IFlySpeechRecognizerDelegate.h” #import “iflyMSC/IFlySpeechRecognizer.h” C/C++ Code //不带界面的语音合成控件 #import “iflyMSC/IFlySpeechSynthesizerDelegate.h” #import “iflyMSC/IFlySpeechSynthesizer.h” 2.6 集成帮助文档到Xcode 打开终端(termainl或iterm),cd 到压缩包的doc 目录,执行以下命令: 注:不同的xcode版本,对应的docset路径可能有变化,需要根据实际路径来操作。 C/C++ Code cp -R -f -a com.iflytek.documentation.IFlyMSC.docset ~/Library/Developer/Shared/Documentation/DocSets/ 然后执行命令 C/C++ Code open ~/Library/Developer/Shared/Documentation/DocSets/ 请核对文档的版本为最新下载的版本 提交 图七 打开Xcode的帮助文档就可以看到已经集成的文档 提交 图八 2.7 初始化 必须在初始化后才可以使用语音服务,初始化是异步过程,推荐在程序入口处调用。 Appid是应用的身份信息,具有唯一性,初始化时必须要传入Appid。可以从demo的Definition.h APPID_VALUE中查看此信息。Demo和SDK申请地址:http://xfyun.cn C/C++ Code //将“12345678”替换成您申请的APPID。 NSString *initString = [[NSString alloc] initWithFormat:@"appid=%@",@” 12345678”]; [IFlySpeechUtility createUtility:initString]; 3 语音听写 使用示例如下: C/C++ Code //头文件定义 //需要实现IFlyRecognizerViewDelegate,为识别会话的服务代理 @interface RecognizerViewController : UIViewController<IFlyRecognizerViewDelegate> { IFlyRecognizerView *_iflyRecognizerView; } //初始化语音识别控件 _iflyRecognizerView = [[IFlyRecognizerView alloc] initWithCenter:self.view.center]; _iflyRecognizerView.delegate = self; [_iflyRecognizerView setParameter: @"iat" forKey: [IFlySpeechConstant IFLY_DOMAIN]]; //asr_audio_path保存录音文件名,如不再需要,设置value为nil表示取消,默认目录是documents [_iflyRecognizerView setParameter:@"asrview.pcm " forKey:[IFlySpeechConstant ASR_AUDIO_PATH]]; //启动识别服务 [_iflyRecognizerView start]; /*识别结果返回代理 @param resultArray 识别结果 @ param isLast 表示是否最后一次结果 */ - (void)onResult: (NSArray *)resultArray isLast:(BOOL) isLast { } /*识别会话错误返回代理 @ param error 错误码 */ - (void)onError: (IFlySpeechError *) error { } 4 语音识别 4.1 在线语音识别 上传联系人,使用示例如下: C/C++ Code //创建上传对象 _uploader = [[IFlyDataUploader alloc] init]; //获取联系人集合 IFlyContact *iFlyContact = [[IFlyContact alloc] init]; NSString *contactList = [iFlyContact contact]; //设置参数 [_uploader setParameter:@"uup" forKey:@"subject"]; [_uploader setParameter:@"contact" forKey:@"dtt"]; //启动上传 [_uploader uploadDataWithCompletionHandler:^(NSString * grammerID, IFlySpeechError *error) { //接受返回的grammerID和error [self onUploadFinished:grammerID error:error]; }name:@"contact" data: contactList]; 上传用户词表,使用示例如下: C/C++ Code //创建上传对象 _uploader = [[IFlyDataUploader alloc] init]; //生成用户词表对象 //用户词表 #define USERWORDS @"{\"userword\":[{\"name\":\"iflytek\",\"words\":[\"德国盐猪手\",\"1912酒吧街\",\"清蒸鲈鱼\",\"挪威三文鱼\",\"黄埔军校\",\"横沙牌坊\",\"科大讯飞\"]}]}" IFlyUserWords *iFlyUserWords = [[IFlyUserWords alloc] initWithJson:USERWORDS ]; #define NAME @"userwords" //设置参数 [_uploader setParameter:@"iat" forKey:@"sub"]; [_uploader setParameter:@"userword" forKey:@"dtt"]; //上传词表 [_uploader uploadDataWithCompletionHandler:^(NSString * grammerID, IFlySpeechError *error) { //接受返回的grammerID和error [self onUploadFinished:grammerID error:error]; } name:NAME data:[iFlyUserWords toString]]; abnf语法上传,示例如下: C/C++ Code // ABNF语法示例,可以说”北京到上海” #define ABNFPARAM @”sub=asr,dtt=abnf” #define ABNFDATA = “#ABNF 1.0 gb2312; language zh-CN; mode voice; root $main; $main = $place1 到$place2 ; $place1 = 北京 | 武汉 | 南京 | 天津 | 天京 | 东京; $place2 = 上海 | 合肥;” //创建上传对象 _uploader = [[IFlyDataUploader alloc] init]; //设置参数 [_uploader setParameter:@"asr" forKey:@"sub"]; [_uploader setParameter:@"abnf" forKey:@"dtt"]; //上传abnf语法 [_uploader uploadDataWithCompletionHandler:^(NSString * grammerID, IFlySpeechError *error) { //接受返回的grammerID和error [self setGrammerId:grammerID]; }name:ABNFNAME data:ABNFDATA]; 4.2 本线语音识别 1) 创建识别对象(注:如果使用的是离线识别,还需要增加libc++.dylib) C/C++ Code //此方法为demo中封装,具体实现请参照demo。 self.iFlySpeechRecognizer = [RecognizerFactory CreateRecognizer:self Domain:@"asr"]; 2)设置参数 C/C++ Code //开启候选结果 [_iflySpeechRecognizer setParameter:@"1" forKey:@"asr_wbest"]; //设置引擎类型,clound或者local [_iflySpeechRecognizer setParameter:@”local” forKey:[IFlySpeechConstant ENGINE_TYPE]]; //设置字符编码为utf-8 [_iflySpeechRecognizer setParameter:@"utf-8" forKey:[IFlySpeechConstant TEXT_ENCODING]]; //语法类型,本地是bnf,在线识别是abnf [_iflySpeechRecognizer setParameter:@”bnf” forKey:[IFlyResourceUtil GRAMMARTYPE]]; //启动asr识别引擎 [[IFlySpeechUtility getUtility] setParameter:@"asr" forKey:[IFlyResourceUtil ENGINE_START]]; //设置服务类型为asr识别 [_iflySpeechRecognizer setParameter:@"asr" forKey:[IFlySpeechConstant IFLY_DOMAIN]]; //设置语法构建路径,该路径为sandbox下的目录,请确保目录存在 [_iflySpeechRecognizer setParameter:_grammBuildPath forKey:[IFlyResourceUtil GRM_BUILD_PATH]]; //设置引擎资源文件路径,如demo中的aitalkResource中的common.mp3 [_iflySpeechRecognizer setParameter:_aitalkResourcePath forKey:[IFlyResourceUtil ASR_RES_PATH]]; 3)编译语法文本
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值