ROS中接入图灵机器人NLU并语音播报的流程
1、体验在线的图灵机器人聊天对话;
2、注册图灵机器人帐号,熟悉新手教程;
3、准备编写代码,提前安装依赖包
sudo apt install libcurl3 libcurl4-openssl-dev
sudo apt install libjsoncpp0 libjsoncpp-dev(ubuntu14.04 LTS)
1、创建tuling_nlu_node节点
2、创建/voice/tuling_nul_topic话题
——2到1订阅
3、发送httpPost请求,等待图灵服务器返回结果
——组成json格式字符串发送给图灵服务器,返回结果也是json格式
——1到3回调
4、/voice/xf_tts_topic话题
——3到4发布
5、xf_tts_node节点
——4到5订阅
6、科大讯飞在线语音合成,生成wav文件
——5到6回调
7、调用play命令播放合成的wav文件
——6到7调用
8、其他节点
——“明天上海天气”
——8发布2话题
科大讯飞ASR接入ROS
科大讯飞iat_record代码解析——能够实时的将语音转换成对应文本
VAD:voice Activity Detection 语音活动检测,又称语音端点检测或语音边界检测。检测用户有没有说完一句话,何时停止录音返回识别结果。
上传用户词典:可以增加用户自定义的一些较生僻热词的识别率,比如人名,地名等。
1、开始-AppID
2、登陆科大讯飞语音服务器
3、是否上传用户词典
——Y:上传词典用户
——N:本地文件还是麦克风
————本地wav文件
4、sr_init初始化参数
5、开启监听,准备识别语音
6、分段上传语音文件进行识别
7、检测到VAD,开始输出识别结果文本
8、结束
录音接口使用说明:
使用该接口时,一般的函数调用顺序如下
create_recorder 创建录音对象
open_recorder 打开录音机,配置录音格式
start_record 开始录音,录音数据在注册的回调函数中获取
stop_record 停止录音
close_recorder 关闭录音机,对应open_recorder
destroy_recorder 销毁录音对象,对应create_recorder
注:open_recorder后只要没有close_recorder,可以多次start_record和stop_record。
#ifdef _cplusplus
extern “C”{
#endif
..
int function();
…
#ifdef _cplusplus
}
#endif
如果这是一段cpp的代码,那么加入“extern “C” {” 和 “}”处理其中的代码。在c++中,为了支持重载机制,在编译生成的汇编码中,要对函数的名字进行一些处理,加入比如函数的返回类型等等,而在C中,只是简单的函数名字而已,不会加入其他的信息,也就是说:C++和C对产生的函数名字的处理是不一样的,主要是为了在C++中方便调用C编译生成的动态库so文件中的函数。
#define SR_DBGON 1
#if SR_DBGON == 1
#define sr_dbg printf
#else
#define sr_dbg
#endif
示例:
…
sr_dbg(“mem alloc failed\n”);
…
C语音中常用的打印调试开关,通过一个宏定义来打开或关闭指定的调试信息。
ALSA project 编程
将科大讯飞iat_record代码改造成ROS下ASR的流程
1、将iat_record文件下的iat_record_sample.c,speech_recognizer.c复制到catkin_ws的项目源码文件夹中,将所需的头文件formats.h,linuxrec.h,speech_recognizer.h复制到相应的include文件夹中。
~/catkin_ws/src/voice_system/src
cp /SoftWare/voice/samples/iatrecordsample/∗.c. /catkinws/src/voicesystem/include
cp ~/SoftWare/voice/samples/iat_record_sample/*.h .
2、将C文件重命名为cpp文件,iat_record.cpp为语音识别的入口源码文件,因此可以根据需要将其重命名为自己喜欢的名字,方便我们识别主源码文件,例如:xf_asr.cpp。
~/catkin_ws/src/voice_system/src
mviatrecordsample.cxfasr.cpp /catkinws/src/voicesystem/src
mv linuxrec.c linuxrec.cpp
~/catkin_ws/src/voice_system/src$ mv speech_recognizer.c speech_recognizer.cpp
3、修改入口源码文件xf_asr.cpp,修改其中的main函数,增加订阅的话题/voice/xf_asr_topic,并同时增加回调函数,当只有收到指定的开启录音监听指令后才开启麦克风进行监听,方便我们后期与唤醒功能进行结合,当唤醒后向/voice/xf_asr_topic发送进行asr识别的指令即可开启后续的asr功能。
4、增加发布者,准备向/voice/tuling_nlu_topic发布信息。当asr识别完成后,将得到的文本识别结果发送至该话题,即可调用图灵机器人完成语义解析功能。
5、开启ros的spinOnce,只有当检测到有识别结果返回时才向nlu话题发送信息。同时设置asr识别等待时间,默认15秒,若15秒钟内检测到vad则提前结束等待时间进行nlu,若超时15秒,则退出,不进行nlu。
6、修改CMakeList文件,在target_link_libraries中需要增加各种so动态的链接支持,包括:-lmsc -lrt -ldl -lpthread -lasoud。
1、创建xf_asr_node节点
2、创建/voice/xf_asr_topic话题
——消息类型:std_msgs/Int32
——2到1订阅
3、开启麦克风进行ASR识别,等待服务器返回识别结果
——1到3回调
4、/voice/tuling_nlu_topic话题
——消息类型:std_msgs/String
——3到4发布
5、唤醒节点(测试)
——开启ASR指令:“1”
——5到2发布
rostopic pub -1 /voice/xf_asr_topic std_msgs/Int32 1 开启