# 离线语音听写 Android SDK 文档

语音听写,是基于自然语言处理,将自然语言音频转换为文本输出的技术。语音听写技术与语法识别技术的不同在于,语音听写不需要基于某个具体的语法文件,其识别范围是整个语种内的词条。在听写时,应用还可以上传个性化的词表,如联系人列表等,提高列表中词语的匹配率(见后面章节)。

语音听写能力,目前msc sdk支持在线和离线模式,其相关调用说明如下:

# 1.在线听写

sdk提供了两种识别方式,分别为带UI识别和无UI方式:

# 一.无UI识别

//初始化识别无UI识别对象
//使用SpeechRecognizer对象,可根据回调消息自定义界面;
mIat = SpeechRecognizer.createRecognizer(IatDemo.this, mInitListener);

//设置语法ID和 SUBJECT 为空,以免因之前有语法调用而设置了此参数;或直接清空所有参数,具体可参考 DEMO 的示例。
mIat.setParameter( SpeechConstant.CLOUD_GRAMMAR, null );
mIat.setParameter( SpeechConstant.SUBJECT, null );
//设置返回结果格式,目前支持json,xml以及plain 三种格式,其中plain为纯听写文本内容
mIat.setParameter(SpeechConstant.RESULT_TYPE, "json");
//此处engineType为“cloud”
mIat.setParameter( SpeechConstant.ENGINE_TYPE, engineType );
//设置语音输入语言,zh_cn为简体中文
mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
//设置结果返回语言
mIat.setParameter(SpeechConstant.ACCENT, "mandarin");
// 设置语音前端点:静音超时时间,单位ms,即用户多长时间不说话则当做超时处理
//取值范围{1000~10000}
mIat.setParameter(SpeechConstant.VAD_BOS, "4000");
//设置语音后端点:后端点静音检测时间,单位ms,即用户停止说话多长时间内即认为不再输入, 
//自动停止录音,范围{0~10000}
mIat.setParameter(SpeechConstant.VAD_EOS, "1000");
//设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点
mIat.setParameter(SpeechConstant.ASR_PTT,"1");

//开始识别,并设置监听器
mIat.startListening(mRecogListener);

# 二.带UI识别

// 初始化听写Dialog,如果只使用有UI听写功能,无需创建SpeechRecognizer
// 使用UI听写功能,请根据sdk文件目录下的notice.txt,放置布局文件和图片资源
mIatDialog = new RecognizerDialog(IatDemo.this, mInitListener);

//以下为dialog设置听写参数
mIatDialog.setParams("xxx","xxx");
....

//开始识别并设置监听器
mIatDialog.setListener(mRecognizerDialogListener);
//显示听写对话框
mIatDialog.show();

具体配置信息,请参考后面识别对话框的内容

# 2.离线听写

离线听写与在线听写主要差别在于引擎类型和听写资源:

//此处engineType为“local”
mIat.setParameter( SpeechConstant.ENGINE_TYPE, engineType );
if (mEngineType.equals(SpeechConstant.TYPE_LOCAL)) {
	// 设置本地识别资源
	mIat.setParameter(ResourceUtil.ASR_RES_PATH, getResourcePath());
}

resourcce设置种包含两个资源,common.jet 和 sms_16k.jet, 从资源配置中可以看出,目前离线听写仅支持16k音频

private String getResourcePath(){
		StringBuffer tempBuffer = new StringBuffer();
		//识别通用资源
		tempBuffer.append(ResourceUtil.generateResourcePath(this, ResourceUtil.RESOURCE_TYPE.assets, "iat/common.jet"));
		tempBuffer.append(";");
		tempBuffer.append(ResourceUtil.generateResourcePath(this, ResourceUtil.RESOURCE_TYPE.assets, "iat/sms_16k.jet"));
		//识别8k资源-使用8k的时候请解开注释
		return tempBuffer.toString();
	}

# 更新词典

更新词典,又被称为个性化热词上传,包括更新本地语法文件的词典,以及更新在线听写的词典。词典的内容格式及更详细调用说明,参考MSC Android API 文档中 SpeechRecognizer 类的 updateLexicon 函数介绍。

# 在线听写词典

无论在哪一种语言中,不同的单词或字(word),或多或少,都会有相似的发音(pronounce)。尤其在汉语中,这种现象更普遍,如当一个人说 /zhang/ /s[h]an/ 时,对应的词语的组成,可能是 {张,章,彰,...} {三,姗,珊,...},这些文字的组合,在汉语的习惯中出现频率最高的,当然是“张三”了。

而在听写返回结果时,会结合上下文,把日常生活中,出现频率最高的词汇返回给客户端。这时,如果我们实际想要的结果并不是出现频率最高的词汇,如上文中我们实际要的是“张姗”——这样的情况在手机联系人信息中经常会出现,此时听写结果就不是我们想要的。这种情况下,我们可以通过上传个性化热词的方式,把在同样发音情况下,自己希望最优先匹配的词语告知语音云服务器。

个性化热词通过应用调用SDK函数上传时,影响的范围是,当前 APPID 应用的当前设备——即同一应用,不同设备里上传的热词互不干扰;同一设备,不同APPID的应用上传的热词互不干扰。另外,更新的热词仅对对应的语言区域(LANGUAGE)和方言(ACCENT)(在部份特殊场景,此两个参数可能被 "ent" 参数代替)生效,如果听写时指定了不同的LANGUAGE,ACCENT,或 "ent",则更新热词时,也应当指定对应的参数值。

如果需要一次上传热词,更新给当前APPID的所有使用设备,则可通过开发者平台网站上传应用级热词:讯飞开放平台

mAsr.setParameter( SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD );

// lexiconName 为词典名字,lexiconContents 为词典内容,lexiconListener 为回调监听器
ret = mAsr.updateLexicon( lexiconName, lexiconContents, lexiconListener );

# 常见问题

# 支持哪些语言?

答:目前只支持中文(普通话)

# 离线语音听写是否可以试用?

答:可以的,目前提供10个装机量可以免费试用,试用期90天。

# 离线语音听写是否支持个性化热词功能?

答:目前不支持

# 离线语音听写支持的音频格式是什么?

答:音频长度:小于20s;采样率16KHz;采样精度:16bit;声道单声道,音频文件的录制和格式确认(推荐使用Cool Edit Pro工具)。

# 支持平台是什么?

答:目前只支持Android平台,不支持其他平台。