以下描述了如何使用灵云ASR录音机功能。
1. ASR录音机简介
ASR录音机封装了系统的录音接口及灵云sdk的ASR接口,其目标是将输入的语音信号转换为相应的文本或命令。
2. ASR能力
ASR录音机封装了灵云SDK的ASR能力,其许多概念仍然是基于ASR基础API的。建议在使用灵云ASR录音机之前, 先熟悉 ASR能力 的相关内容。
在使用灵云ASR录音机之前,需要选择合适的ASR模块和能力以及音频编解码库, 具体请参见 选择模块和能力 和 音频编解码库。
3. 初始化
在使用录音机之前,仍然需要先初始化系统模块,请参见 系统模块的初始化/终止。
3.1 创建录音机对象
在初始化系统模块之后,就可以使用 hci_asr_recorder_init() 创建录音机对象,同时需要设置初始化参数和回调函数参数。
3.2 设置初始化参数
初始化参数主要是设置本地资源库的路径等:
recorderCallbackParam.pfnEventChange = RecorderEventChangeCallback;
recorderCallbackParam.pfnSdkErr = RecorderErrorCallback;
recorderCallbackParam.
pfnRecording = RecorderRecordingCallback;
recorderCallbackParam.pvEventChangeUsrParam = NULL;
recorderCallbackParam.pvSdkErrorUsrParam = NULL;
const char* pszConfig = "initCapKeys=asr.local.grammar.v4,dataPath=/mount/myapp/Document";
如果是只使用云端能力,可以直接指定初始化配置串为空或者NULL。
- 注解
- 使用ASR录音机模块,并不需要调用ASR基础API的初始化操作,也即无需调用 HciCloudAsr.hciAsrInit()。
3.3 设置回调函数
为了能接收录音机内部信息,如状态信息、识别情况及错误信息等,应用层需要实现录音机的回调函数接口。 回调函数通过 PLAYER_CALLBACK_PARAM 参数传递给 hci_asr_recorder_init() 函数。 下面的代码示例实现了回调函数接口的写法:
void RecorderEventChangeCallback(
RECORDER_EVENT eRecorderEvent,
void * pUsrParam )
{
switch (eRecorderEvent) {
}
}
{
}
void RecorderErrorCallback(eRecorderEvent,
HCI_ERR_CODE eErrorCode,
void * pUsrParam )
{
switch (eErrorCode) {
}
}
void RecorderRecordingCallback(void *pVoiceData, unsigned int uiVoiceLen, int nVolume, void * pUsrParam )
{
}
4. 启动录音机
使用 hci_asr_recorder_start() 来启动录音机,启动后录音机就自动开始了录音、端点检测、识别的过程。 以进行自由说识别为例:
const char * pszConfig = "capKey=asr.cloud.freetalk,audioformat=pcm16k16bit");
const char * pszGrammarData = NULL;
具体识别过程的概念、参数设置和注意事项请参见和 语法识别 和 自由说识别。
这里的配置项pszConfig包括了初始化会话的配置项(capKey和realtime)、识别选项、端点检测选项以及录音设备ID(deviceId)选项。
- capKey选项请参见 ASR能力描述 。
- deviceId选项用于指定录音设备的ID,不指定则为系统自动匹配(WAVE_MAPPER) 。
当使用本地语法识别,可以把语法数据通过 pszGrammarData 直接传入 hci_asr_recorder_start() 中,并指明grammarType的配置项为wordlist或者jsgf。 但这种方式每次识别的时候都会重新加载语法,识别完后卸载语法,因此效率低下,不推荐使用。 本地语法识别时建议先使用 hci_asr_recorder_load_grammar() 方式加载语法,获得语法ID, 在 hci_asr_recorder_start() 的时候指明grammarType为id来进行识别。示例如下:
char * pszWordList = "播放\r\n暂停\r\n停止\r\n\打开\r\n下一首\r\n上一首\r\n";
int nGrammarId = 0;
char szRecogConfig[1000] = {0};
sprintf(szRecogConfig, "capKey=asr.local.grammar.v4,audioFormat=pcm16k16bit,encode=none,grammarType=id,grammarId=%d", nGrammarId);
char * pszGrammarData = NULL;
hci_asr_recroder_unload_gammar(nGrammarId);
5. 端点检测
端点检测功能可以在传入的音频中检测到开始说话和停止说话的位置。录音机内部实现了端点检测能力, 无须开发者调用,但可以在调用 hci_asr_recorder_start() 时的配置项中设置相关参数,相关参数请参见ASR基础API 。
6. 结束录音
- 调用 hci_asr_recorder_start() 后录音机会自动进行端点检测,检测到末端后会自动启动识别。通过回调函数 pfnRecogFinish 返回结果后,自动停止。
- 通过 hci_asr_recorder_stop_and_recog(), 也可以不等端点检测检测到末端,直接结束录音,启动识别。通过回调函数 pfnRecogFinish 返回结果后,自动停止。
- 在录音过程中可以随时使用 hci_asr_recorder_cancel() 来结束录音或取消识别。
录音结束后,可以再使用 hci_asr_recorder_start() 函数进行下一轮的录音识别工作。
7. 获取录音机状态
可以使用 hci_asr_recorder_get_state() 来获取录音机的当前状态:
RECORDER_STATE recorderState = hci_asr_recorder_get_state();
switch(recorderState)
{
...
}
8. 反初始化
当不再使用ASR录音机的时候,需要反初始化ASR录音机,示例如下:
当不再使用其它灵云能力时,需要反初始化系统模块,请参见 系统模块的初始化/终止。
9. 实时识别
录音机支持 实时识别 功能,只需在初始化时将realtime配置项设为yes即可。