当前位置:   article > 正文

【聆思CSK6语音大模型AI开发套件试用】语音控制电梯功能的设备端处理

csk6

目录

任务简介

终端处理的基本逻辑

代码修改

测试


任务简介

上一篇博文中,我们介绍了聆思大模型平台的在线编排能力,利用其出色的低代码能力,我们可以在云平台上完成语音识别、语音合成以及对用户的语言的理解。开发板主要负责语音的采集、上传、接收云平台的处理结果。今天来介绍一下,如何修改LLM_control示例来实现对云平台返回的结果进行处理。

终端处理的基本逻辑

前面的博文中,已经介绍了LLM_control示例的架构流程,其中main.c文件的consumer_thread线程是端侧处理的核心代码,该函数负责对云端返回的数据处理。

在介绍云端编排时,我们在处理代码中给出了如下的数据模板,这个模板就是开发板收到的数据的基本格式,每次的差别主要是其中value字段。

  1. //数据模版,不建议直接修改
  2. const intentTemplate = {
  3. "text": "",
  4. "rc": 0,
  5. "data": {
  6. "result": [{
  7. "id": "xxx",
  8. "type": "Decimal",
  9. "value": "1"
  10. }]
  11. },
  12. "answer": {
  13. "text": "已完成设置",
  14. "type": "T"
  15. },
  16. "service": "floor",
  17. "service_pkg": "media",
  18. "category": "LISTENAI.floor"

我们所提供的电梯服务和厂商所提供的其他服务的差别主要在于service字段,我们的服务中这个字段为floor。所以我们可以对厂商提供的代码可以基本不做修改,只是添加一个服务处理的分支。

代码修改

在代码中我们只关注AIUI_ZBUS_NLP这部分,其他的代码都是处理语音识别和语音播放的,我们可以保留不变。在这部分,我们判断service字段,如果为floor就进入我们的代码分支。

  1. ZBUS_SUBSCRIBER_DEFINE(main_sub, 4);
  2. static void consumer_thread(void)
  3. {
  4. // int ret = 0;
  5. zbus_chan_add_obs(&wifi_zbus_channel, &main_sub, K_FOREVER);
  6. zbus_chan_add_obs(&aiui_zbus_channel, &main_sub, K_FOREVER);
  7. const struct zbus_channel *chan;
  8. wifi_zbus_msg_t wifi_msg = {};
  9. aiui_zbus_msg_t aiui_msg = {};
  10. while (!zbus_sub_wait(&main_sub, &chan, K_FOREVER)) {
  11. LOG_INF("Channel %s", zbus_chan_name(chan));
  12. if (&wifi_zbus_channel == chan) {
  13. zbus_chan_read(&wifi_zbus_channel, &wifi_msg, K_MSEC(500));
  14. LOG_INF("------------get wifi evt: %x", wifi_msg.event);
  15. switch(wifi_msg.event){
  16. case WIFI_ZBUS_CONNECTED:
  17. is_wifi_connected = true;
  18. break;
  19. case WIFI_ZBUS_DISCONNECTED:
  20. is_wifi_connected = false;
  21. if(is_aiui_initialized){
  22. aiui_disconnect(aiui_handle);
  23. }
  24. break;
  25. case WIFI_ZBUS_GOT_IP:
  26. if(is_aiui_initialized){
  27. k_timer_start(&aiui_reconnect_timer, K_NO_WAIT, K_NO_WAIT);
  28. }
  29. break;
  30. default:
  31. break;
  32. }
  33. } else if (&aiui_zbus_channel == chan) {
  34. zbus_chan_read(&aiui_zbus_channel, &aiui_msg, K_MSEC(500));
  35. LOG_INF("------------get aiui evt: %x", aiui_msg.event);
  36. if (aiui_msg.event == AIUI_ZBUS_GOT_VAD) {
  37. // 此处代码省略
  38. } else if (aiui_msg.event == AIUI_ZBUS_NLP) {
  39. cJSON *root = cJSON_Parse(aiui_msg.data);
  40. if(root != NULL) {
  41. cJSON *intent = cJSON_GetObjectItem(root, "intent");
  42. if(intent != NULL) {
  43. cJSON *service = cJSON_GetObjectItem(intent, "service");
  44. if(service != NULL){
  45. if(!strcmp(service->valuestring, "LLMDrawing")){
  46. // 此处代码省略
  47. }
  48. }else if(!strcmp(service->valuestring, "bgColor")){
  49. // 此处代码省略
  50. }
  51. }else if(!strcmp(service->valuestring, "floor")){
  52. cJSON *data = cJSON_GetObjectItem(intent, "data");
  53. if(data != NULL){
  54. cJSON *result = cJSON_GetObjectItem(data, "result");
  55. if(result != NULL){
  56. // int size = cJSON_GetArraySize(result);
  57. cJSON *item = cJSON_GetArrayItem(result, 0);
  58. cJSON *type = cJSON_GetObjectItem(item, "type");
  59. cJSON *value = cJSON_GetObjectItem(item, "value");
  60. LOG_INF("service=%s: type=%s, value=%s",
  61. service->valuestring,
  62. type->valuestring,
  63. value->valuestring);
  64. int32_t floor = 0;
  65. sscanf(value->valuestring, "%d", &floor);
  66. LOG_INF("floor value: %d", floor);
  67. ui_set_layer(floor);
  68. }
  69. }
  70. }else {
  71. LOG_ERR("Unknown service: %s", service->valuestring);
  72. }
  73. }else{
  74. LOG_ERR("func: %s, line: %d", __FUNCTION__, __LINE__);
  75. }
  76. }else{
  77. LOG_ERR("func: %s, line: %d", __FUNCTION__, __LINE__);
  78. }
  79. cJSON_Delete(root);
  80. }else{
  81. LOG_ERR("func: %s, line: %d", __FUNCTION__, __LINE__);
  82. }
  83. csk_free(aiui_msg.data);
  84. } else if (aiui_msg.event == AIUI_ZBUS_INVALID_TOKEN) {
  85. is_invalid_token = true;
  86. }
  87. }
  88. }
  89. }

在这部分代码中,我们主要是提取并解析了value字段的值,通过在控制台输出可以方便地看到云端返回的结果。

完整的代码参见

https://download.csdn.net/download/bit_mike/88959552icon-default.png?t=N7T8https://download.csdn.net/download/bit_mike/88959552

测试

我们可以使用下面的命令编译程序:

lisa zep build -b csk6_duomotai_devkit apps\LLM_control

这里我们没有加-p参数,这样工具会进行增量编译,从而节省编译的时间。

下载后就可以提供串口观察程序运行的结果。


通过我们用红框标出的三个关键点可以看出,当我们说出“到5层”后,云端争取地返回了处理结果,我们也在开发板上正确地实现了数据解析。

在下一篇博文中介绍如何修改程序的显示部分,使得这个结果可以正确地在屏幕上进行显示。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/905192
推荐阅读
相关标签
  

闽ICP备14008679号