语音评测 iOS SDK 文档

1、简介

语音评测(Speech Evaluator)通过智能语音技术自动对发音水平进行评价、发音错误、缺陷进行定位和问题分析。目前评音评测提供汉语、英语两种语言的评测,支持单字(汉语专有)、词语 和句子朗读三种题型。

评测详细的接口介绍及说明请参考: MSC iOS API 文档, 在集成过程中如有疑问,可登录讯飞开放平台论坛,查找答案或与其他开发者交流。

2、SDK集成指南

第一步:获取appid

appid是第三方应用集成讯飞开放平台SDK的身份标识,SDK静态库和appid是绑定的,每款应用必须保持唯一,否则会出现10407错误码。appid在开放平台申请应用时可以获得,下载SDK后可从SDK中sample文件夹的Demo工程里找到(例如: /sample/MSCDemo/MSCDemo/Definition.h 的APPID_VALUE)。

第二步:工程配置

添加库

将开发工具包中lib目录下的iflyMSC.framework添加到工程中。同时请将Demo中依赖的其他库也添加到工程中。 按下图示例添加 SDK 所需要的 iOS系统库:

库名称 添加范围 功能
iflyMSC.framework 必要 讯飞开放平台静态库。
libz.tbd 必要 用于压缩、加密算法。
AVFoundation.framework 必要 用于系统录音和播放 。
SystemConfiguration.framework 系统库 用于系统设置。
Foundation.framework 必要 基本库。
CoreTelephony.framework 必要 用于电话相关操作。
AudioToolbox.framework 必要 用于系统录音和播放。
UIKit.framework 必要 用于界面显示。
CoreLocation.framework 必要 用于定位。
Contacts.framework 必要 用于联系人。
AddressBook.framework 必要 用于联系人。
QuartzCore.framework 必要 用于界面显示。
CoreGraphics.framework 必要 用于界面显示。
libc++.tbd 必要 用于支持C++。

注意

  1. 添加iflyMSC.framework时,请检查工程BuildSetting中的framwork path的设置,如果出现找不到framework的情况,可以将path清空,在Xcode中删除framework,然后重新添加。
  2. iflyMSC.framework最低支持iOS 8.0。

设置Bitcode

在Xcode 7,8默认开启了Bitcode,而Bitcode 需要工程依赖的所有类库同时支持。MSC SDK暂时还不支持Bitcode,可以先临时关闭。后续MSC SDK支持Bitcode 时,会在讯飞开放平台上进行SDK版本更新,请关注。关闭此设置,只需在Targets - Build Settings 中搜索Bitcode 即可,找到相应选项,设置为NO。

用户隐私权限配置

iOS 10发布以来,苹果为了用户信息安全,加入隐私权限设置机制,让用户来选择是否允许。 隐私权限配置可在info.plist 新增相关privacy字段,MSC SDK中需要用到的权限主要包括麦克风权限、联系人权限和地理位置权限:

<key>NSMicrophoneUsageDescription</key>
<string></string>
<key>NSLocationUsageDescription</key>
<string></string>
<key>NSLocationAlwaysUsageDescription</key>
<string></string>
<key>NSContactsUsageDescription</key>
<string></string>

即在Info.plist 中增加下图设置:

第三步:初始化

初始化示例:

//Appid是应用的身份信息,具有唯一性,初始化时必须要传入Appid。
NSString *initString = [[NSString alloc] initWithFormat:@"appid=%@", @"YourAppid"];
[IFlySpeechUtility createUtility:initString];
参数 说明 必填
appid 8位16进制数字字符串,应用的唯一标识,与下载的SDK一一对应。
usr 保留字段,无需关注。
pwd 保留字段,无需关注。

注意: 初始化是一个异步过程,可放在App启动时执行初始化,具体代码可以参照Demo的MSCAppDelegate.m。

第四步:启动服务

所有的服务皆遵循如下的流程,如下图:

所有服务的API详细说明可参见:https://www.ai-nanchang.cn/doc/mscapi/iOS/iosevaluator.html

3.语音评测

1.评测

// 获取评测对象单例
_iFlySpeechEvaluator = [IFlySpeechEvaluator sharedInstance];
_iFlySpeechEvaluator.delegate = self;
// 设置训练参数
// 清空参数
[_iFlySpeechEvaluator setParameter:@"" forKey:[IFlySpeechConstant PARAMS]];
// 设置评测采样率
[self.iFlySpeechEvaluator setParameter:@"16000" forKey:[IFlySpeechConstant SAMPLE_RATE]];
// 设置评测题目编码,如果是utf-8格式,请添加bom头,添加方式可参考demo。
[self.iFlySpeechEvaluator setParameter:@"utf-8" forKey:[IFlySpeechConstant TEXT_ENCODING]];
// 设置评测题目结果格式,目前仅支持xml
[self.iFlySpeechEvaluator setParameter:@"xml" forKey:[IFlySpeechConstant ISE_RESULT_TYPE]];
// 设置评测前端点超时
[self.iFlySpeechEvaluator setParameter:self.iseParams.bos forKey:[IFlySpeechConstant VAD_BOS]];
// 设置评测后端点超时
[self.iFlySpeechEvaluator setParameter:self.iseParams.eos forKey:[IFlySpeechConstant VAD_EOS]]; 
// 设置评测题型
[self.iFlySpeechEvaluator setParameter:self.iseParams.category forKey:[IFlySpeechConstant ISE_CATEGORY]];
// 设置评测语言
[self.iFlySpeechEvaluator setParameter:self.iseParams.language
forKey:[IFlySpeechConstant LANGUAGE]];
// 设置评测结果级别
[self.iFlySpeechEvaluator setParameter:self.iseParams.rstLevel forKey:[IFlySpeechConstant ISE_RESULT_LEVEL]];
// 设置评测超时
[self.iFlySpeechEvaluator setParameter:self.iseParams.timeout forKey:[IFlySpeechConstant SPEECH_TIMEOUT]];

可通过setParameter设置的评测相关参数说明如下:

参数 说明 是否必需
language 评测语种,可选值:
en_us(英语)、zh_cn(汉语)
category 评测题型,可选值:
read_syllable(单字,汉语专有)、read_word(词语)、
read_sentence(句子)、read_chapter(篇章)
text_encoding 上传的试题编码格式,可选值:
gb2312、utf-8。
当进行汉语评测时,必须设置成utf-8,
建议所有试题都使用utf-8编码
vad_bos 前端点超时,默认5000ms
vad_eos 后端点超时,默认1800ms
speech_timeout 录音超时,当录音达到时限将自动触发
vad停止录音,默认-1(无超时)
result_level 评测结果等级,可选值:
plain、complete,默认为complete
plev 全维度功能,详见下方说明
可选值:0

全维度说明

使用方法:将参数plev设置为0
使用说明:使用全维度权限前后可获得的结果对比如下,红色为使用全维度以后才会返回的评分维度,返回结果各字段的详细说明请点击 语音评测结果说明 查看。

题型 中文
默认
中文
使用全维度
英文
默认
英文
使用全维度
总分(total_score) 总分(total_score)
声韵分(phone_score)
调型分(tone_score)
- -
总分(total_score) 总分(total_score)
声韵分(phone_score)
调型分(tone_score)
总分(total_score)
音节得分(syll_score)
总分(total_score)
音节得分(syll_score)
准确度分(accuracy_score)
总分(total_score) 总分(total_score)
完整度分(integrity_score)
流畅度分(fluency_score)
声韵分(phone_score)
调型分(tone_score)
总分(total_score)
音节得分(syll_score)
总分(total_score)
音节得分(syll_score)
完整度分(integrity_score)
流畅度分(fluency_score)
准确度分(accuracy_score)
篇章 总分(total_score) 总分(total_score)
完整度分(integrity_score)
流畅度分(fluency_score)
声韵分(phone_score)
调型分(tone_score)
总分(total_score)
音节得分(syll_score)
总分(total_score)
音节得分(syll_score)
完整度分(integrity_score)
流畅度分(fluency_score)
准确度分(accuracy_score)

注:
中文声韵分:指声母和韵母正确率的得分。
中文调型分:指声调正确率的得分。

实现协议:

//语音评测实现Delegate
// 音量和数据回调
- (void)onVolumeChanged:(int)volume buffer:(NSData *)buffer{}
// 开始录音回调
- (void)onBeginOfSpeech{}
// 停止录音回调
- (void)onEndOfSpeech{}
// 会话取消回调
- (void)onCancel{}
// 评测错误回调
- (void)onCompleted:(IFlySpeechError *)errorCode{}
// 评测结果回调
- (void)onResults:(NSData *)results isLast:(BOOL)isLast{}

2.音频流评测

音频流评测功能可以让开发者将已录制好的音频数据写入评测控件,最后得到评测结果。

//设置音频源为音频流(-1)
[self.iFlySpeechEvaluatorr setParameter:@"-1" forKey:@"audio_source"];

//启动评测服务
[self.iFlySpeechEvaluator startListening:buffer params:nil];

//写入音频数据
NSData *data = [NSData dataWithContentsOfFile:_pcmFilePath];    //从文件中读取音频
[self.iFlySpeechEvaluator writeAudio:data];//写入音频,让SDK评测。建议将音频数据分段写入。

//音频写入结束或出错时,必须调用结束评测接口
[self.iFlySpeechEvaluator stopListening];//音频数据写入完成,进入等待状态

tartListening即开始评测录音,读完试题内容后可以调用 stopListening停止录音,也可以在一段时间后由SDK自动检测VAD并停止录音。当评测出错时,SDK会回调onError方法抛出IFlySpeechError 错误,通过IFlySpeechError的getErrorCode()方法可获得错误码,错误码列表和下表:

错误码 数值 含义
MSP_ERROR_ASE_EXCEP_SILENCE 11401 无语音或音量太小
MSP_ERROR_ASE_EXCEP_SNRATIO 11402 信噪比低或有效语音过短
MSP_ERROR_ASE_EXCEP_PAPERDATA 11403 非试卷数据
MSP_ERROR_ASE_EXCEP_PAPERCONTENTS 11404 试卷内容有误
MSP_ERROR_ASE_EXCEP_NOTMONO 11405 录音格式有误
MSP_ERROR_ASE_EXCEP_OTHERS 11406 其他评测数据异常,包括错读、漏读、恶意录入、试卷内容等错误
MSP_ERROR_ASE_EXCEP_PAPERFMT 11407 试卷格式有误
MSP_ERROR_ASE_EXCEP_ULISTWORD 11408 存在未登录词,即引擎中没有该词语的信息

解析评测结果: SDK通过onResult回调抛出XML格式的评测结果,结果格式及字段含义详见 语音评测试题格式及结果说明 文档,具体解析过程可参考Demo工程IFlyMscDemo中ISE 目录下Result目录中的源代码。

其它常见问题请参见 科大讯飞语音评测 FAQ 文档。

3、视频教程

技术起源

技术原理

典型应用

SDK集成指南iOS

4、代理服务器设置方法

在createUtility接口的params参数中添加:

net_type=custom, proxy_ip=<host>, proxy_port=<port>
其中,<host>,<port>替换为实际的代理服务器地址和端口。

例如:

NSString *initString = [[NSString alloc] initWithFormat:@"appid=%@, net_type=custom, proxy_ip=192.168.1.2, proxy_port=8080", @"12345678"];  //注意:各参数间,以英文逗号分隔。
[IFlySpeechUtility createUtility:initString]; 

接口原型: (IFlySpeechUtility *)createUtility:(NSString *)params

注意: 若在设置代理参数后,使用语音服务过程中,报错10204/10205/10212等网络异常错误时,请查阅以下内容,做出相关操作:

  • 讯飞语音SDK的通信协议使用的是标准HTTP1.1协议,其代理协议使用的是标准HTTP代理协议。

  • 代理服务器需要支持全双工多问多答方式,即 pipeline 模式。

  • 代理服务器不能对80端口做限制,不能对如下域名做拦截: hdns.openspeech.cn scs.openspeech.cn open.xf-yun.com dev.voicecloud.cn

  • 需要确保代理服务器只负责转发数据包,不能改变数据包的完整性和时序性。

  • 代理服务器在转发数据包时,不能在HTTP协议头部添加 IE6 标识头。

5、常见问题

ios常见问题资料

答:请参见论坛帖子:iOS MSC SDK常见问题总结

iOS评测sdk如何下载?

答:文档中心---快速指引有介绍步骤根据步骤下载在线评测sdk

如何处理iOS SDK音频服务

答:请参见论坛帖子:讯飞语音iOS SDK音频问题详解

语音评测支持题型和结果格式及字段含义?

答:评测试题需要符合一定的格式,汉语试题和英语试题有所不同,同语种的不同题型也有差异。
英文口语评测:支持单词,句子,篇章等题型评测。
中文口语评测:支持字、词、句,篇章等题型评测。
评测试题和结果格式及字段含义详见 语音评测试题格式及结果说明 文档。

语音评测最多支持多长时间的语音输入?

答:对于所有评测题型,都只支持最长 3分钟 的语音输入。

语音评测支持传入的音频格式有哪些?

答:支持的音频类型是:单声道 16bit Inter PCM。 支持的音频采样率是:16000HZ。推荐使用Cool edit软件查询音频格式是否符合,音频格式不符合会检测为乱读,分值不能作为参考

错误码及相应解决方案查询网址

答:错误码及相应解决方案查询

如何设置语音云服务URL

答:对于一些特殊服务,需要在createUtility接口中添加:server_url = http://YourDomainName/msp.do (YourDomainName是指语音云服务域名,请开发者自行替换) 例如:

NSString *initString = [[NSString alloc] initWithFormat:@"appid=%@,server_url=%@", @"12345678",@"http://sdk.openspeech.cn/msp.do"];  //注意:各参数间,以英文逗号分隔。
[IFlySpeechUtility createUtility:initString]; 

接口原型: (IFlySpeechUtility *)createUtility:(NSString *)params