BNF语音识别文件格式简介

本文介绍离线语音识别中的BNF文件结构及应用,包括文档标识头、语法名称、槽声明、主规则等内容,并提供了一个智能家电控制系统的BNF配置实例。

此文分析离线语音识别的语义规则文件,即BNF文件,一般放在Android Studio的Assets文件夹下。本大侠使用的是科大讯飞的语音识别SDK,所以以下所有规则在此SDK下实测有效

1、结构

简单的说,BNF文件分为五个部分:

  1. 文档标示头;(不要去改就对了)
  2. 语法名称;
  3. 槽声明;
  4. 主规则(可引用子规则);
  5. 文档主体(具体的定义槽、引用规则)

2、定义

2.1 文档标示头

这个不细说,按默认来就好,它定义了文档的版本和编码格式,注意文档的内容必须和这里声明的编码格式统一。

#BNF+IAT 1.0 UTF-8;
  • 1

2.2、 语法名称

一个文件只能有一个语法名称,作为这个BNF文件的一个识别名称。 
(借助此名称可通过名称识别接口在不同的场景调用不同的语法规则,此功能未实测)

!grammar name;//定义语法名称
  • 1

2.3、 槽声明

就是一个个坑,理解为活字印刷时的那些小坑,里面必须填入各种文字才行,非常方便动态修改识别命令。声明完槽后在文档底部的底部部分具体去定义每个声明过的槽的具体内容。这样语音识别引擎就会根据槽的内容去动态匹配你的指令。

!slot <name>;
  • 1

2.4、 主规则

首先声明一个主规则名称

!start <ruleName>
  • 1

然后为这个规则定义详细的识别规则,注意名称要和刚才声明的一样。

<ruleName>:<controlTV>|<controlAir>|<controlLight>;
//冒号后面都是一些引用规则,引用规则由一系列槽组成。
  • 1
  • 2

2.5、 文档主体

这个地方放两样东西,引用规则和槽定义。 
看例子:

<controlTV>:<open><TV>;//引用规则

<TV>:电视|电视机;//槽的具体定义
<open>:打开|开了|开起来|开|开一下;
  • 1
  • 2
  • 3
  • 4
  • 5

结构很简单,基本就这五个部分,比较麻烦的是规则定义部分。文档规定只能定义一个主规则,所以可以在主规则中引用子规则来减少代码量。

特别注意:名称不能超过15个字符,命名不能重复。

最后上一个完整的例子

#BNF+IAT 1.0 UTF-8;
!grammar call;//定义语法名称
!slot <TV>;//被控制的物体和物体的某种属性
!slot <airCondition>;
!slot <temperature>;
!slot <vol>;
!slot <hold>;
!slot <open>;
!slot <shutDown>;
//以下是想要让物体达到的状态
!slot <close>;
!slot <tempUp>;
!slot <tempDown>;
!slot <volTurnUp>;
!slot <volTurnDown>;

!start <smartHome>;//定义开始规则,下面一行为规则的具体内容
//主规则,系统只认主规则
<smartHome>:<controlTV>|<controlAir>;
//被引用的子规则,注意变量命名不能超过15个字符
<controlTV>:<open><TV>|[<hold>]<TV><open>|<close><TV>|[<hold>]<TV><close>;
<controlAir>:<open><airCondition>|[<hold>]<airCondition><open>|<close><airCondition>|[<hold>]<airCondition><close>;
<controlLight>:<open><light>|[<hold>]<light><open>|<close><light>|[<hold>]<light><close>;
<volControl>:[<vol>]<volTurnDown>|[<vol>]<volTurnUp>|[<hold>]<vol><close>;
<tempControl>:<temperature><tempUp>|<temperature><tempDown>;

//为声明过的槽,定义具体的名称
<TV>:电视|电视机;
<airCondition>:空调;
<temperature>:温度;
<vol>:声音|音量;
<hold>:把;
<open>:打开|开了|开起来|开|开一下;
<close>:关闭|关掉|关了|关|关一下;
<tempUp>:高点|调高;
<tempDown>:低点|调高;
<volTurnUp>:重点|重点|重一点|重一点|大点|大一点;
<volTurnDown>:轻点|小点|小一点|轻一点;
<shutDown>:关闭系统|退出;
讯飞离线命令词识别功能可以通过BNF(Backus-Naur Form)文件来定义语法规则,从而实现高效的本地语音识别BNF文件是语法识别的核心,它描述了允许的语音命令格式,设备将根据该文件内容对语音进行匹配和识别。以下是使用BNF文件进行讯飞离线识别的步骤和方法。 ### 1. 编写BNF语法文件 BNF文件用于定义语音命令的语法规则,其格式应符合讯飞SDK的要求。例如,一个简单的BNF文件可以定义如下内容: ```bnf # 语法文件 example.bnf !start <command> !grammar command <command> = 开启 空调 | 关闭 灯光 | 调高 温度 ; ``` 上述示例中定义了三条语音命令,分别用于控制空调、灯光和温度。BNF文件需保存为UTF-8编码格式,并确保语法结构正确,以便后续编译使用。 ### 2. 调用QISRBuildGrammar接口编译语法文件 在程序中,需要通过调用`QISRBuildGrammar`接口来加载并编译BNF文件,生成语法ID。该ID将在后续语音识别过程中被使用。以下是接口调用的基本流程(以C/C++为例): ```cpp const char* grammarList = "example.bnf"; // BNF文件路径 int grammarCount = 1; const char* grammarIDs[1]; // 存储生成的语法ID // 调用接口构建语法 int ret = QISRBuildGrammar(grammarList, grammarCount, grammarIDs); if (ret != MSP_SUCCESS) { // 错误处理 } ``` 成功调用后,`grammarIDs`数组中将包含生成的语法ID,该ID将在语音识别会话中作为参数传入。 ### 3. 启动语音识别会话并使用语法ID 在语音识别过程中,需要将上一步生成的语法ID传入识别接口,以限定识别范围为BNF文件中定义的内容。以下是一个简化版的识别流程示例: ```cpp // 启动语音识别会话,传入语法ID const char* sessionID = QISRSessionBegin(grammarIDs[0], NULL, &ret); if (ret != MSP_SUCCESS) { // 错误处理 } // 向会话中写入音频数据 ret = QISRAudioWrite(sessionID, audioData, audioDataSize, MSP_AUDIO_STAT_BEGIN, NULL); if (ret != MSP_SUCCESS) { // 错误处理 } // 获取识别结果 const char* result = QISRGetResult(sessionID, &ret, 0, NULL); if (ret == MSP_SUCCESS && result != NULL) { // 输出识别结果 printf("识别结果: %s\n", result); } // 结束会话 QISRSessionEnd(sessionID, NULL); ``` ### 4. 处理识别结果 识别结果将以文本形式返回,并携带置信度信息。应用层可根据置信度阈值判断结果是否有效。例如,若置信度低于设定阈值,则可忽略该识别结果,防止误操作。 ### 5. 文件结构与资源准备 在实际工程中,BNF文件和相关资源文件应放置在指定目录中。例如: - `bin/`:存放编译后的语法文件(`.bnf`)和目标文件。 - `res/asr/common.jet`:官方提供的资源文件,用于支持识别引擎运行。 - `wav/`:存储待识别的音频文件,音频需为16K采样率、16bit、单声道格式[^4]。 此外,录音时应确保音频格式符合要求,使用16K、16bit、单声道的PCM格式进行录制,以确保识别效果[^4]。 ### 6. 调试与优化 在调试过程中,可使用官方提供的Demo进行测试,确保BNF文件编写无误,并验证识别效果。若识别失败,应检查语法文件格式、音频输入质量以及语法ID是否正确传入。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值