public final class SpeechRecognizer
extends com.iflytek.cloud.msc.module.SpeechInterface
语音识别,包括听写、语法识别功能。语音识别技术(Auto Speech Recognize,
简称ASR)即把人的自然语言音频数据转换成文本数据。除了本类包含的听写、语法
识别外,还有语义理解类SpeechUnderstander。关于文本数据转语音的
功能,请参考语音合成类 SpeechSynthesizer。关于识别对话框,请参考
RecognizerDialog。
听写,是基于自然语言处理,将自然语言音频转换为文本输出的技术。语音听写技术
与语法识别技术的不同在于,语音听写不需要基于某个具体的语法文件,其识别
范围是整个语种内的词条。在听写时,应用还可以上传个性化的词表,如联系人
列表等,提高列表中词语的匹配率。关于个性化词表上传,请参考updateLexicon(String, String, LexiconListener)。
语法识别,是基于语法规则,将与语法一致的自然语言转换为文本输出的技术。语法
识别相比听写,有更高的匹配率,多用于要更准确结果且有限说法的语音控制,
如空调的语音控制等。在使用语法识别时,应用需要先构建一个语法文件上传给
服务器,并在会话时,传入语法ID,以使用该语法。关于上传语法文件,请参考
buildGrammar(String, String, GrammarListener)。
关于语法文件的编写,请参考。
关于语法ID设置,请参考setParameter(String, String)和
SpeechConstant.CLOUD_GRAMMAR、
SpeechConstant.LOCAL_GRAMMAR。
听写与语法识别的区别,在于语法识别需要指写一个语法ID,而听写不需要。
本类使用单例,调用者使用本类的对象,只需要通过createRecognizer(Context, com.iflytek.cloud.InitListener)创建
一次对象后,便可一直使用该对象,直到通过调用destroy()进行单例对象销毁。调
用者可通过getRecognizer()获取当前已经创建的单例。在销毁本类的单例对象后,
需要先通过createRecognizer(Context, com.iflytek.cloud.InitListener)再次创建单例对象,方可再使用。
在当前应用生命周期第一次使用本类的任何函数前,须先调用
SpeechUtility.createUtility(Context, java.lang.String)进行SDK初始化。
SpeechUtility.createUtility(Context, java.lang.String),
SpeechUnderstander,
SpeechSynthesizer,
RecognizerDialog| 限定符和类型 | 方法和说明 |
|---|---|
int |
buildGrammar(java.lang.String grammarType,
java.lang.String grammarContent,
GrammarListener grammarListener)
构建语法文件
在使用语法识别时,需要先构建语法。
|
void |
cancel()
取消会话
通过此函数取消当前的会话。
|
static SpeechRecognizer |
createRecognizer(Context context,
InitListener listener)
创建单例对象
使用此函数创建一个本类单例对象。
|
boolean |
destroy()
销毁单例对象
通过本函数,销毁由
createRecognizer(Context, com.iflytek.cloud.InitListener)创建的单例对象。 |
java.lang.String |
getParameter(java.lang.String key)
获取参数
获取指定的参数的当前值。
|
static SpeechRecognizer |
getRecognizer()
获取单例对象
通过函数获取已创建的单例对象。
|
boolean |
isListening()
是否在会话中
通过此函数,获取当前SDK是否正在进行会话。
|
boolean |
setParameter(java.lang.String key,
java.lang.String value)
参数设置
可设置的参数有:
SpeechConstant.NET_TIMEOUT: 网络连接超时时间SpeechConstant.KEY_SPEECH_TIMEOUT:语音输入超时时间 SpeechConstant.LANGUAGE:语言SpeechConstant.ACCENT:语言区域SpeechConstant.DOMAIN:应用领域SpeechConstant.CLOUD_GRAMMAR:云端语法IDSpeechConstant.LOCAL_GRAMMAR:本地语法IDSpeechConstant.AUDIO_SOURCE:音频源SpeechConstant.VAD_BOS:前端点超时SpeechConstant.VAD_EOS:后端点超时SpeechConstant.SAMPLE_RATE:识别采样率SpeechConstant.ASR_NBEST:句子级多候选SpeechConstant.ASR_WBEST:词级多候选SpeechConstant.ASR_PTT:设置是否有标点符号SpeechConstant.RESULT_TYPE:识别结果类型SpeechConstant.ASR_AUDIO_PATH:识别录音保存路径
SpeechConstant.ENGINE_TYPE:引擎类型;
ResourceUtil.ASR_RES_PATH:离线资源路径;
ResourceUtil.ENGINE_START:启动离线引擎;
ResourceUtil.GRM_BUILD_PATH:离线语法路径;
当前识别支持未压缩的16位,单声道,采样率为16000或8000,字节顺序为
Little-Endian的Windows PCM音频。 |
int |
startListening(RecognizerListener listener)
开始录音
调用此函数,开始听写或语法识别。
|
void |
stopListening()
停止录音
调用本函数告知SDK,当前会话音频已全部录入。
|
int |
updateLexicon(java.lang.String lexiconName,
java.lang.String lexiconContent,
LexiconListener lexiconListener)
更新词典
更新应用个性化的词典,如联系人列表等。
|
int |
writeAudio(byte[] buffer,
int offset,
int length)
写入录音数据
通过调用此函数,把音频数据传给SDK。
|
public static SpeechRecognizer createRecognizer(Context context, InitListener listener)
使用此函数创建一个本类单例对象。当成功创建一次单例对象后,可一直使用此对象,
直到调用destroy()销毁已创建的单例对象为止。若在当前应用生命周期内调用
destroy()前再次调用本函数,则直接返回已创建的单例对象。可通过
getRecognizer()获取已创建的单例对象。
destroy(),
getRecognizer()public static SpeechRecognizer getRecognizer()
通过函数获取已创建的单例对象。当单例对象未创建时,将返回null,此时应先通过
createRecognizer(Context, com.iflytek.cloud.InitListener)创建单例对象。
createRecognizer(Context, com.iflytek.cloud.InitListener),
destroy()public int buildGrammar(java.lang.String grammarType,
java.lang.String grammarContent,
GrammarListener grammarListener)
在使用语法识别时,需要先构建语法。
本地语法仅支持"bnf"类型,构建在线语法支持“abnf”。
关于语法文件的编写,请参考。
grammarType - 语法类型,支持:abnf,bnfgrammarContent - 语法内容grammarListener - 语法构建回调,语法ID将通过
GrammarListener.onBuildFinish(String, SpeechError)回调返回,以用于
识别开始前设置SpeechConstant.CLOUD_GRAMMAR或
SpeechConstant.LOCAL_GRAMMAR参数,使用该语法。public int updateLexicon(java.lang.String lexiconName,
java.lang.String lexiconContent,
LexiconListener lexiconListener)
更新应用个性化的词典,如联系人列表等。热词更新后,在5~10分钟内生效。
lexiconName - 词典名称,{ "userword", "contact" }。lexiconContent - 词典内容,联系人列表:以换行符"\n"分隔的词语字符串,如"张三,李四,王五";
用户热词:满足一定格式的json字符串,格式如下:
UserWords类。lexiconListener - 词典更新回调接口public int startListening(RecognizerListener listener)
调用此函数,开始听写或语法识别。
目前SDK不支持多线程,所以在调用本函数开始一次会话后,直到结束前(结果返回 完毕,或出现错误),不能再调用本函数开始新的会话。一次会话,即从会话开始,到结 束为止。
在调用本函数开始听写或语法识别前,通过setParameter(String, String)设置相
应的参数。
调用本函数开始识别后,通过SDK的录音机录取用户通过麦克风读入的音频(当
SpeechConstant.AUDIO_SOURCE 值>=0时),或由应用层调用
writeAudio(byte[], int, int)写入音频流,获取用于识别的音频。在完成音频
录入(包括麦克风或写音频流方式)后,通过调用stopListening()告知SDK已完
成音频录入,或由SDK自带的VAD(Voice Activity Detection,静音抑制)自动结束音频录
入,见RecognizerListener.onEndOfSpeech()。(关于写入音流方式的SDK自动结束
录入应注意的地方,请参考writeAudio(byte[], int, int);VAD端点长度设置,请
参考setParameter(String, String))
可通过cancel()取消当前的会话。
public int writeAudio(byte[] buffer,
int offset,
int length)
通过调用此函数,把音频数据传给SDK。
仅在SpeechConstant.AUDIO_SOURCE值为-1时,需要通过调用本函数,把
音频数据传给SDK。在写入音频数据前,应先通过startListening(RecognizerListener)
开启会话。在结束录音数据写入后,调用stopListening()告知应用层,当前会话
音频数据已全部写入。
当SDK回调RecognizerListener.onEndOfSpeech()时,说明SDK已经通过VAD检测
到了静音末端点,应该立即停止写入音频数据。当SDK回调
RecognizerListener.onResult(com.iflytek.cloud.RecognizerResult, boolean)返回完结果,或回调
RecognizerListener.onError(SpeechError)返回错误时,也应该停止当次会话的音频写
入。
支持的音频格式,请参考setParameter(String, String)的参数说明。
buffer - 要写入的录音数据缓存offset - 实际音频在传入缓存的起始点length - 音频数据长度ErrorCode.SUCCESS表示成功,其他值表示有错误,
具体错误码,请参考ErrorCode。startListening(RecognizerListener),
stopListening(),
RecognizerListenerpublic void stopListening()
调用本函数告知SDK,当前会话音频已全部录入。
在调用本函数后,已录入的音频还在继续上传到服务器,结果不会马上就返回,当前会 话还在继续,直到结果返回完毕,或出现错误。
要取消会话,请参考cancel()函数。
当应用调用本函数结束停止录音时,SDK不会再回调
RecognizerListener.onEndOfSpeech()。相反的,当SDK回调
RecognizerListener.onEndOfSpeech()时,应用层可不必再调用本函数通知SDK停止
录音。
public boolean isListening()
通过此函数,获取当前SDK是否正在进行会话。应用层可通过此函数,查询能否 开始一路新的会话等。
调用了stopListening()停止录音后,如果会话未出现错误或返回最后的结果,
当前状态依然处于会话中,即本函数会返回true。如果调用cancel()取消了会话,
则当前状态处于不在会话中。
startListening(RecognizerListener),
stopListening(),
cancel()public void cancel()
通过此函数取消当前的会话。
在会话被取消后,当前会话结束,未返回的结果将不再返回。
public boolean setParameter(java.lang.String key,
java.lang.String value)
可设置的参数有:
SpeechConstant.NET_TIMEOUT: 网络连接超时时间
SpeechConstant.KEY_SPEECH_TIMEOUT:语音输入超时时间
SpeechConstant.LANGUAGE:语言
SpeechConstant.ACCENT:语言区域
SpeechConstant.DOMAIN:应用领域
SpeechConstant.CLOUD_GRAMMAR:云端语法ID
SpeechConstant.LOCAL_GRAMMAR:本地语法ID
SpeechConstant.AUDIO_SOURCE:音频源
SpeechConstant.VAD_BOS:前端点超时
SpeechConstant.VAD_EOS:后端点超时
SpeechConstant.SAMPLE_RATE:识别采样率
SpeechConstant.ASR_NBEST:句子级多候选
SpeechConstant.ASR_WBEST:词级多候选
SpeechConstant.ASR_PTT:设置是否有标点符号
SpeechConstant.RESULT_TYPE:识别结果类型
SpeechConstant.ASR_AUDIO_PATH:识别录音保存路径
SpeechConstant.ENGINE_TYPE:引擎类型;
ResourceUtil.ASR_RES_PATH:离线资源路径;
ResourceUtil.ENGINE_START:启动离线引擎;
ResourceUtil.GRM_BUILD_PATH:离线语法路径;
当前识别支持未压缩的16位,单声道,采样率为16000或8000,字节顺序为 Little-Endian的Windows PCM音频。本地识别时,需要有相应的资源文件才支 持对应的采样率的音频识别。
setParameter 在类中 com.iflytek.cloud.msc.module.SpeechInterfacekey - 参数名称value - 参数值getParameter(String),
startListening(RecognizerListener)public java.lang.String getParameter(java.lang.String key)
获取指定的参数的当前值。
某些有默认的值的参数,如SpeechConstant.SAMPLE_RATE,在应用层未
调用setParameter(String, String)来设置参数值前,可能获取到的是null值,
但在实际会话会始时,SDK会使用默认值传给服务器。
getParameter 在类中 com.iflytek.cloud.msc.module.SpeechInterfacekey - 参数名称,所有支持参数,参考setParameter(String, String)SpeechConstant对各参数的说明。setParameter(String, String)public boolean destroy()
通过本函数,销毁由createRecognizer(Context, com.iflytek.cloud.InitListener)创建的单例对象。
在调用本函数进行销毁前,应先保证当前不在会话中,否则,本函数将尝试取消当前
会话,并返回false,此时销毁失败。关于当前是否在会话中,请参考函数
isListening()。若销毁失败,请在取消当前会话后,再次调用本函数重试。
当本函数返回true时,销毁成功。此时,之前创建的单例对象已不能再使用,否则,
将会报错。此时需要再使用,应先通过createRecognizer(Context, com.iflytek.cloud.InitListener)创建一个新的单例
对象。
createRecognizer(Context, com.iflytek.cloud.InitListener),
cancel()