linuxOS_AP05/device/rockchip/rk3308/dds_client-rk3308-32-dual-sdk-v0.5.2/demo/main.c

456 lines
17 KiB
C
Raw Permalink Normal View History

2025-06-02 05:59:07 +00:00
/*================================================================
* Copyright (C) 2018 AISPEECH Ltd. All rights reserved.
*
* main.c
* chenjie.gu
* 20180516
*
*
================================================================*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <sys/select.h>
#include <pthread.h>
#include <time.h>
#include "dds_client.h"
#include "cJSON.h"
struct dds_client *dc = NULL;
extern int music_player_init(char *dev);
extern int music_player_start();
extern void play_manager_f(const char *cmd, const char *data, char **user_data);
/*
* 1. volume.set
* 2. play.list.update
* 3. play.list.clear
* 4. play.list.get
* 5. status.set
* 6. change.set
* 7. mode.set
* 8. play.choose.update
* 9. play.collect.choose
* 10. play.uncollect.choose
* 11. player.end
*/
static char cmd_word_hint_map[69][64] = {
{"command://qi ke kong tiao"},
{"command://da kai kong tiao"},
{"command://guan bi kong tiao"},
{"command://da kai sheng yin"},
{"command://zeng da yin liang"},
{"command://jian xiao yin liang"},
{"command://guan bi sheng yin"},
{"command://qie huan nan sheng"},
{"command://qie huan nv sheng"},
{"command://sheng wen cai ji"},
{"command://qing chu cai ji xin xi"},
{"command://zhi leng mo shi"},
{"command://zhi re mo shi"},
{"command://nuan feng mo shi"},
{"command://song feng mo shi"},
{"command://pi ei mu wei mo shi"},
{"command://kong qi qing xin"},
{"command://chu shi mo shi"},
{"command://kong wen chu shi"},
{"command://jie neng mo shi"},
{"command://guan bi jie neng"},
{"command://dian jia re"},
{"command://guan bi dian jia re"},
{"command://feng sui sheng dong"},
{"command://guan bi feng sui sheng dong"},
{"command://feng ni sheng dong"},
{"command://guan bi feng ni sheng dong"},
{"command://ge xing mo shi"},
{"command://guan bi ge xing mo shi"},
{"command://ting zhi bai dong"},
{"command://zuo you bai dong"},
{"command://shang xia bai dong"},
{"command://zui xiao feng"},
{"command://zhong deng feng"},
{"command://zui da feng"},
{"command://zeng da feng su"},
{"command://jian xiao feng su"},
{"command://zi dong feng"},
{"command://shang shu shi feng"},
{"command://xia shu shi feng"},
{"command://quan shu shi feng"},
{"command://sheng gao wen du"},
{"command://jiang di wen du"},
{"command://shi liu du"},
{"command://shi qi du"},
{"command://shi ba du"},
{"command://shi jiu du"},
{"command://er shi du"},
{"command://er shi yi du"},
{"command://er shi er du"},
{"command://er shi san du"},
{"command://er shi si du"},
{"command://er shi wu du"},
{"command://er shi liu du"},
{"command://er shi qi du"},
{"command://er shi ba du"},
{"command://er shi jiu du"},
{"command://san shi du"},
{"command://san shi yi du"},
{"command://san shi er du"},
{"command://kai ji"},
{"command://guan ji"},
{"command://shu shi mo shi"},
{"command://yi shei ou"},
{"command://guan bi yi shei ou"},
{"command://feng da dian"},
{"command://feng xiao dian"},
{"command://tai re le"},
{"command://tai leng le"}
};
void dds_cb(const char *topic, const char *topic_data, void *user) {
static int end_dialog = 0;
static int num = 0;
printf("dds cb receive topic: %s\n", topic);
printf("dds cb receive topic_data: %s\n", topic_data);
if (!strncmp(topic, "command", 7)) {
for (int i = 0; i < 69; i++) {
if (!strcmp(topic, cmd_word_hint_map[i])) {
// do the speak
char wav_name[16] = {0};
sprintf(wav_name, "./audio/%d.wav", i + 1);
char play_cmd[32] = {0};
sprintf(play_cmd, "aplay %s", wav_name);
system(play_cmd);
break;
}
}
}
if (!strcmp(topic, "command://sheng wen cai ji")) {
// 注册声纹
char name[64] = {0};
sprintf(name, "{\"name\":\"%s%d\"}", "test", ++num);
dds_client_vprint_regist(dc, name);
}
else if (!strcmp(topic, "command://qing chu cai ji xin xi")) {
// 删除声纹
//dds_client_vprint_unregist(dc, "test1");
}
else if (!strcmp(topic, "vprint.regist.result")) {
// 收到了声纹注册的消息
cJSON *root = cJSON_Parse(topic_data);
cJSON *operation = cJSON_GetObjectItem(root, "operation");
if (!strcmp(operation->valuestring, "start")) {
printf("====================== 开始注册声纹\n");
dds_client_speak(dc, "请说唤醒词,开始注册声纹");
}
if (!strcmp(operation->valuestring, "nameRepeat")) {
printf("====================== 注册姓名重复\n");
dds_client_speak(dc, "注册姓名重复");
}
else if (!strcmp(operation->valuestring, "vNumLimit")) {
printf("============= 注册数量已满\n");
dds_client_speak(dc, "注册数量已满");
}
else if (!strcmp(operation->valuestring, "unavailable")) {
printf("============= 信噪比不符合要求\n");
dds_client_speak(dc, "信噪比不符合要求");
}
else if (!strcmp(operation->valuestring, "continue")) {
printf("============= 请继续注册声纹\n");
dds_client_speak(dc, "请继续注册声纹");
}
else if (!strcmp(operation->valuestring, "success")) {
printf("============ 声纹注册成功\n");
dds_client_speak(dc, "声纹注册成功");
}
cJSON_Delete(root);
}
else if (!strcmp(topic, "vprint.unregist.result")) {
// 收到了声纹删除的消息
cJSON *root = cJSON_Parse(topic_data);
cJSON *operation = cJSON_GetObjectItem(root, "operation");
if (!strcmp(operation->valuestring, "success")) {
printf("==================== 声纹删除成功");
//dds_client_speak(dc, "声纹删除成功");
}
else if (!strcmp(operation->valuestring, "noSpeaker")) {
printf("==================== 该用户尚未注册");
//dds_client_speak(dc, "该用户尚未注册");
}
cJSON_Delete(root);
}
else if (!strcmp(topic, "vprint.test.result")) {
// 收到了声纹计算的结果,有以下三种情况:
/*
* 1. {"register":"nothing"} // 目前还没有声纹模型
*
*
* // 收到了匹配的声纹计算结果
* 2. {"score":23.286682,"word":"qi ke kong tiao","register":"test0","time":179.679932,"speech":0.880000,"RTF":0.204188}
*
*
* // 收到了不匹配的声纹计算结果
*
* 3. {"score":23.286682,"word":"qi ke kong tiao","register":"others","time":179.679932,"speech":0.880000,"RTF":0.204188}
*
*/
printf("vprint test receive result is %s\n", topic_data);
cJSON *root = cJSON_Parse(topic_data);
cJSON *reg = cJSON_GetObjectItem(root, "register");
if (!strcmp("nothing", reg->valuestring)) {
play_manager_f("status.set", "pause", NULL);
char *hint = "{\"nlg\":\"path:../res/tts/help.mp3\"}";
dds_client_publish(dc, DDS_CLIENT_USER_EXTERNAL_WAKEUP, hint);
}
else {
play_manager_f("status.set", "pause", NULL);
char hint[256] = {0};
snprintf(hint, 256, "{\"nlg\":\"path:../res/tts/help.mp3\"}", reg->valuestring);
dds_client_publish(dc, DDS_CLIENT_USER_EXTERNAL_WAKEUP, hint);
}
cJSON_Delete(root);
}
else if (!strcmp(topic, "dm.output")) {
cJSON *root = cJSON_Parse(topic_data);
assert(root != NULL);
cJSON *dm = cJSON_GetObjectItem(root, "dm");
cJSON *widget = cJSON_GetObjectItem(dm, "widget");
if (widget) {
cJSON *count = cJSON_GetObjectItem(widget, "count");
if (count && count->valueint > 0) {
char *out = cJSON_PrintUnformatted(widget);
play_manager_f("play.list.update", out, NULL);
free(out);
}
}
cJSON *end_session = cJSON_GetObjectItem(dm, "shouldEndSession");
if (end_session->valueint) {
end_dialog = 1;
}
else end_dialog = 0;
cJSON_Delete(root);
}
else if (!strcmp(topic, "doa.result")) {
// doa 结果
}
else if (!strcmp(topic, "command://sys.tts.setspeaker")) {
static char speakers[6][20] = {
{"zhilingf"},
{"gdgm"},
{"geyou"},
{"hyanif"},
{"xijunm"},
{"qianranf"}
};
srand(time(0));
int choose = rand() % 6;
dds_client_set_speaker(dc, speakers[choose]);
//dds_client_speak(dc, "已经为您切换");
}
else if (!strcmp(topic, "command://spk.speaker.close")) {
play_manager_f("play.list.clear", NULL, NULL);
dds_client_resp_nativeapi(dc, topic, "{\"duiWidget\":\"text\", \"extra\":{\"APICommandResult\":\"success\"}}");
}
else if (!strcmp(topic, "native://mediacontrol.media.single")) {
play_manager_f("mode.set", "single", NULL);
dds_client_resp_nativeapi(dc, topic, "{\"duiWidget\":\"text\", \"extra\":{\"APICommandResult\":\"success\"}}");
}
else if (!strcmp(topic, "native://mediacontrol.media.sequence")) {
play_manager_f("mode.set", "sequence", NULL);
dds_client_resp_nativeapi(dc, topic, "{\"duiWidget\":\"text\", \"extra\":{\"APICommandResult\":\"success\"}}");
}
else if (!strcmp(topic, "native://mediacontrol.media.random")) {
play_manager_f("mode.set", "random", NULL);
dds_client_resp_nativeapi(dc, topic, "{\"duiWidget\":\"text\", \"extra\":{\"APICommandResult\":\"success\"}}");
}
else if (!strcmp(topic, "native://mediacontrol.media.loop")) {
play_manager_f("mode.set", "loop", NULL);
dds_client_resp_nativeapi(dc, topic, "{\"duiWidget\":\"text\", \"extra\":{\"APICommandResult\":\"success\"}}");
}
else if (!strcmp(topic, "native://mediacontrol.media.pause")) {
play_manager_f("status.set", "pause", NULL);
dds_client_resp_nativeapi(dc, topic, "{\"duiWidget\":\"text\", \"extra\":{\"APICommandResult\":\"success\"}}");
}
else if (!strcmp(topic, "native://mediacontrol.media.continue")) {
play_manager_f("status.set", "resume", NULL);
dds_client_resp_nativeapi(dc, topic, "{\"duiWidget\":\"text\", \"extra\":{\"APICommandResult\":\"success\"}}");
}
else if (!strcmp(topic, "native://mediacontrol.media.stop")) {
play_manager_f("play.list.clear", NULL, NULL);
dds_client_resp_nativeapi(dc, topic, "{\"duiWidget\":\"text\", \"extra\":{\"APICommandResult\":\"success\"}}");
}
else if (!strcmp(topic, "native://mediacontrol.media.replay")) {
play_manager_f("status.set", "replay", NULL);
dds_client_resp_nativeapi(dc, topic, "{\"duiWidget\":\"text\", \"extra\":{\"APICommandResult\":\"success\"}}");
}
else if (!strcmp(topic, "native://mediacontrol.media.prev")) {
play_manager_f("change.set", "prev", NULL);
dds_client_resp_nativeapi(dc, topic, "{\"duiWidget\":\"text\", \"extra\":{\"count\":\"more\", \"skillName\":\"speakerChinaPlay\", \"title\":\"\"}}");
}
else if (!strcmp(topic, "native://mediacontrol.media.next")) {
play_manager_f("change.set", "next", NULL);
dds_client_resp_nativeapi(dc, topic, "{\"duiWidget\":\"text\", \"extra\":{\"count\":\"more\", \"skillName\":\"speakerChinaPlay\", \"title\":\"\"}}");
}
else if (!strcmp(topic, "native://mediacontrol.media.change")) {
play_manager_f("change.set", "change", NULL);
dds_client_resp_nativeapi(dc, topic, "{\"duiWidget\":\"text\", \"extra\":{\"count\":\"more\", \"skillName\":\"speakerChinaPlay\", \"title\":\"\"}}");
}
else if (!strcmp(topic, "native://query.music.info")) {
char *data = NULL;
play_manager_f("music.info", NULL, &data);
if (data) {
cJSON *root = cJSON_Parse(data);
char resp[512] = {0};
cJSON *title = cJSON_GetObjectItem(root, "title");
cJSON *subTitle = cJSON_GetObjectItem(root, "subTitle");
cJSON *label = cJSON_GetObjectItem(root, "label");
sprintf(resp, "{\"duiWidget\":\"text\", \"extra\":{\"title\":\"%s\", \"subTitle\":\"%s\", \"label\":\"%s\"}}", title->valuestring, subTitle->valuestring, label->valuestring);
dds_client_resp_nativeapi(dc, topic, resp);
free(data);
cJSON_Delete(root);
}
else {
dds_client_resp_nativeapi(dc, topic, "{\"duiWidget\":\"text\", \"extra\":{}}");
}
}
else if (!strcmp(topic, "native://query.story.info")) {
char *data = NULL;
play_manager_f("music.info", NULL, &data);
if (data) {
cJSON *root = cJSON_Parse(data);
char resp[512] = {0};
cJSON *title = cJSON_GetObjectItem(root, "title");
sprintf(resp, "{\"duiWidget\":\"text\", \"extra\":{\"title\":\"%s\"}}", title->valuestring);
dds_client_resp_nativeapi(dc, topic, resp);
free(data);
cJSON_Delete(root);
}
else {
dds_client_resp_nativeapi(dc, topic, "{\"duiWidget\":\"text\", \"extra\":{}}");
}
}
else if (!strcmp(topic, "command://spk.speaker.voice")) {
cJSON *root = cJSON_Parse(topic_data);
cJSON *voice = cJSON_GetObjectItem(root, "voice");
if (voice) {
play_manager_f("volume.set", voice->valuestring, NULL);
}
play_manager_f("status.set", "resume", NULL);
cJSON_Delete(root);
}
else if (!strcmp(topic, "native://alarm.set")) {
dds_client_resp_nativeapi(dc, topic, "{\"duiWidget\":\"text\", \"extra\":{\"text\":\"已为您设置闹钟\"}}");
}
else if (!strcmp(topic, "native://alarm.list")) {
dds_client_resp_nativeapi(dc, topic, "{\"duiWidget\":\"text\", \"extra\":{\"text\":\"您要查的闹钟不存在哦\"}}");
}
else if (!strcmp(topic, "native://alarm.delete")) {
dds_client_resp_nativeapi(dc, topic, "{\"duiWidget\":\"text\", \"extra\":{\"text\":\"已为您删除闹钟\"}}");
}
else if (!strcmp(topic, "native://alarm.close")) {
dds_client_resp_nativeapi(dc, topic, "{\"duiWidget\":\"text\", \"extra\":{\"text\":\"已为您关闭闹钟\"}}");
}
else if (!strcmp(topic, "native://remind.set")) {
dds_client_resp_nativeapi(dc, topic, "{\"duiWidget\":\"text\", \"extra\":{\"text\":\"已为您设置提醒\"}}");
}
else if (!strcmp(topic, "native://remind.list")) {
dds_client_resp_nativeapi(dc, topic, "{\"duiWidget\":\"text\", \"extra\":{\"text\":\"暂时抄不到提醒哦\"}}");
}
else if (!strcmp(topic, "native://remind.delete")) {
dds_client_resp_nativeapi(dc, topic, "{\"duiWidget\":\"text\", \"extra\":{\"text\":\"已为您删除提醒\"}}");
}
else if (!strcmp(topic, "native://remind.close")) {
dds_client_resp_nativeapi(dc, topic, "{\"duiWidget\":\"text\", \"extra\":{\"text\":\"已为您关闭提醒\"}}");
}
else if (!strcmp(topic, "local_wakeup.result")) {
end_dialog = 0;
play_manager_f("status.set", "pause", NULL);
}
else if (!strcmp(topic, "sys.dm.end")) {
// 对话退出
play_manager_f("play.list.check", NULL, NULL);
}
else if (!strcmp(topic, "sys.tts.begin")) {
}
else if (!strcmp(topic, "sys.tts.end")) {
}
else if (!strcmp(topic, "sys.vad.end")) {
}
else if (!strcmp(topic, "sys.asr.begin")) {
}
}
int main () {
int ret;
char config[1024 * 5];
FILE *fp = NULL;
fp = fopen("./config.json", "r");
if (fp) {
fread(config, 1, 1024 * 5, fp);
fclose(fp);
}
else return -1;
// 1. init music player
cJSON *root = cJSON_Parse(config);
cJSON *player = cJSON_GetObjectItem(root, "player");
if (player) {
player = cJSON_GetObjectItem(player, "device");
if (player) music_player_init(player->valuestring);
else music_player_init("default");
}
else music_player_init("default");
// 2. start the music player
music_player_start();
// 3. run the dds client
dc = dds_client_init(config);
assert(dc != NULL);
ret = dds_client_start(dc, dds_cb, NULL);
assert(ret != -1);
select(0, 0, 0, 0, 0);
dds_client_release(dc);
return 0;
}