# 离线命令词识别 Android SDK 文档

# 语音识别

语音识别技术(Auto Speech Recognize,简称ASR)即把人的自然语言音频数据转换成文本数据。

# 语法识别(又被称作离线命令词)

语法识别,是基于语法规则,将与语法一致的自然语言音频转换为文本输出的技术。语法识别的结果值域只在语法文件所列出的规则里,故有很好的匹配率,另外,语法识别结果携带了结果的置信度,应用可以根据置信分数,决定这个结果是否有效。语法识别多用于要更准确结果且有限说法的语音控制,如空调的语音控制等。在使用离线语法识别时,需要设置本地语法名字(在语法文件中定义)。

注:语法识别仅提供离线版本。

//设置引擎类型(SpeechConstant.TYPE_LOCAL)
mAsr.setParameter( SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_LOCAL );
// 设置本地识别资源
mAsr.setParameter(ResourceUtil.ASR_RES_PATH, getResourcePath());
// 设置语法构建路径
mAsr.setParameter(ResourceUtil.GRM_BUILD_PATH, grmPath);
// 设置返回结果格式
mAsr.setParameter(SpeechConstant.RESULT_TYPE, mResultType);
// 设置本地识别使用语法id
mAsr.setParameter(SpeechConstant.LOCAL_GRAMMAR, grammarName );

ret = mAsr.startListening( mRecognizerListener );

# 构建语法

本文只对构建和使用语法的 SDK 调用过程进行介绍,关于语法的规则说明,请参考语法开发指南

# 构建BNF语法

BNF语法为离线识别使用的语法,在构建时,除了指定引擎为本地引擎,语法类型为BNF外,还必须指定离线资源的路径(MSC模式下,需下载使用对应的离线识别SDK),语法构建的路径——本地语法构建结果文件保存的路径:

// 设置引擎类型
mAsr.setParamter( SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_LOCAL );

// 设置语法结果文件保存路径,以在本地识别时使用
mAsr.setParameter( ResourceUtil.GRM_BUILD_PATH, grmPath );
    
//设置识别资源路径
mAsr.setParameter( ResourceUtil.ASR_RES_PATH, asrResPath );

/* 其中 "bnf" 指定语法类型为 BNF,  grammarContent 为语法内容,grammarListener 为构建结果监听器*/
ret = mAsr.buildGrammar( "bnf", grammarContent, grammarListener );

构建语法状态通过监听器 grammarListener 获取,当构建成功时,语法文件将保存到由 grmPath 指定的目录中,将在语法识别时用到(MSC 模式下)。

# 更新本地语法文件的词典

离线语法词典,旨在更新已构建的语法文件中某个规则里的内容,因此在更新时,需要指定识别资源路径,语法文件路径,语法列表(语法文件的语法名字)。词典的内容格式及更详细调用说明,参考MSC Android API 文档中 SpeechRecognizer 类的 updateLexicon 函数介绍。

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

// 指定资源路径
mAsr.setParameter( ResourceUtil.ASR_RES_PATH, asrResPath );

// 指定语法路径
mAsr.setParameter( ResourceUtil.GRM_BUILD_PATH, grmPath );

// 指定语法名字
mAsr.setParameter( SpeechConstant.GRAMMAR_LIST, grammarName );

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

# 识别对话框

为了便于快速开发,SDK 提供了识别时用户交互(User Interface)的对话框控件类 RecognizerDialog,又被称为语音输入 UI。使用时,需先将 SDK 资源包 assets 路径下的资源文件拷贝至 Android 工程 asstes 目录下,如图添加资源所示:

RecognizerDialog 可以用于语音听写、语法识别和语义理解,使用方法大致如下:

//1.创建 RecognizerDialog 对象
RecognizerDialog mDialog = new RecognizerDialog(this, mInitListener);

//若要将 RecognizerDialog 用于语义理解,必须添加以下参数设置,设置之后 onResult 回调返回将是语义理解的结果
// mDialog.setParameter("asr_sch", "1");
// mDialog.setParameter("nlp_version", "3.0");

//3.设置回调接口
mDialog.setListener( mRecognizerDialogListener );

//4.显示 dialog,接收语音输入
mDialog.show();

在显示对话框后,录音自动开始,RecognizerDialog 中包含了根据当前状态显示不同图片的处理,如声音的大小,错误的提示;同时,点击对话框内任意地方,可结束录音,点击对话框外,则取消会话;出现错误后,再点击对话框内,可启动下一次会话。应用根据回调状态,进行结果和错误的处理。

# 识别结果

开发者可以通过调用以下方法,来设置识别结果对应的格式,目前支持的结果格式有:plain、json、xml private String mResultType = "xml"; mAsr.setParameter(SpeechConstant.RESULT_TYPE, mResultType);

语法识别结果示例:

json格式
=============================================================
{
    "sn":1,
    "ls":true,
    "bg":0,
    "ed":0,
    "ws":[
        {
            "bg":0,
            "cw":[
                {
                    "id":10001,
                    "sc":81,
                    "w":"打电话给",
                    "gm":0
                }
            ],
            "slot":"<dialpre>"
        },
        {
            "bg":0,
            "cw":[
                {
                    "id":65535,
                    "sc":100,
                    "w":"丁伟",
                    "gm":0
                }
            ],
            "slot":"<contact>"
        }
    ],
    "sc":94
}
=============================================================

xml格式
=============================================================
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<nlp>
    <version>1.1</version>
    <rawtext>打电话给丁伟</rawtext>
    <confidence>92</confidence>
    <engine>local</engine>
    <result>
        <focus>dialpre|contact</focus>
        <confidence>79|100</confidence>
        <object>
            <dialpre id="10001">打电话给</dialpre>
            <contact id="65535">丁伟</contact>
        </object>
    </result>
</nlp>
=============================================================

plain格式
=============================================================
confidence=93 grammar=0 input=打电话给丁伟
=============================================================

# 视频教程

视频教程

视频教程,快速入门。

# 常见问题

# 目前安卓平台具体支持安卓版本

答:Android版本SDK目前支持4.4以上版本,React-Native ,QT 等跨平台方案,目前暂不支持

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

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

# 离线命令词sdk如何下载试用?

答:文档中心---快速指引有介绍步骤---根据步骤下载相应平台的离线命令词sdk,离线命令词SDK包有10个装机量,试用期为90天。

# 离线命令词识别支持多少命令词?

答:离线识别的命令词是开发者自己定义,命令词最大长度为16个汉字,需要先构建语法,然后指定使用的语法。
语法文件开发文档请参考识别语法分享--在线语法和离线语法编写指南(http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=7595)

在这篇文章中: