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()
,
RecognizerListener
public 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.SpeechInterface
key
- 参数名称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.SpeechInterface
key
- 参数名称,所有支持参数,参考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()