diff --git a/demo/aiui_service/res/test.wav b/demo/aiui_service/res/test.wav new file mode 100644 index 0000000..b4fecd6 Binary files /dev/null and b/demo/aiui_service/res/test.wav differ diff --git a/demo/aiui_service/test_aiui.cpp b/demo/aiui_service/test_aiui.cpp new file mode 100644 index 0000000..dc8e839 --- /dev/null +++ b/demo/aiui_service/test_aiui.cpp @@ -0,0 +1,124 @@ +#include "configs/gconfig.hpp" +#include "iflytop/components/aiui_ws/aiui_service.hpp" +#include "iflytop/components/alsaplayer/smart_soundbox_player.hpp" +#include "iflytop/core/core.hpp" +#include "iflytoplinuxsdk/src/iflytop/components/zclicpp/clipp.h" + +using namespace iflytop; +using namespace core; +using namespace std; +using namespace clipp; + +unique_ptr m_thread; +/*************************************************************************************/ +shared_ptr aiuiService; + +void processAIUIRX(json &rxjson) { + auto logger = GET_LOGGER(main); + + string action = rxjson["action"]; + if (action == "started") { + logger->info("rx started:{}", rxjson.dump()); + } + // + else if (action == "result") { + string sub = rxjson["data"]["sub"]; + if (sub == "nlp") { + logger->info("rx nlp:{}", rxjson.dump()); + } else if (sub == "tts") { + logger->info("rx tts:frame {}", rxjson["data"]["json_args"]["frame_id"].get()); + bool isendFrame = false; + string ttsurl; + aiuiService->parseTTSContent(rxjson, isendFrame, ttsurl); + if (isendFrame) { + logger->info("rx tts end,url={}", ttsurl); + } + } else if (sub == "iat") { + logger->info("rx iat:{}", rxjson.dump()); + } else if (sub == "vad") { + logger->info("rx vad:{}", rxjson.dump()); + } else { + logger->info("rx {}:{}", sub, rxjson.dump()); + } + } + // + else if (action == "error") { + logger->info("rx error:{}", rxjson.dump()); + } + // + else if (action == "vad") { + } else { + logger->info("rx unkown:{}", rxjson.dump()); + } + + try { + if (rxjson["data"]["is_finish"].get()) { + logger->info("end tx"); + } + } catch (...) { + } +} + +int main(int argc, char *argv[]) { + spdlog::flush_on(spdlog::level::debug); + auto logger = GET_LOGGER(main); + + aiuiService = make_shared(); + + string appid; + string appkey; + string inputwav; + auto cli = ( // + (value("input wav file", inputwav)), (required("--appid") & value("aiui appid", appid)).doc("aiui appid,find it on https://aiui.xfyun.cn/"), // + (required("--appkey") & value("aiui appkey", appkey)).doc("aiui appkey,find it on https://aiui.xfyun.cn/") // + ); + if (!parse(argc, argv, cli)) { + cout << make_man_page(cli, argv[0]); + return -1; + } + + json paramj; + paramj["result_level"] = "plain"; + paramj["auth_id"] = "ac30105366ea460f9ff08ddac0c4f71e"; // 相当于设备ID,设备唯一 + paramj["data_type"] = "audio"; + paramj["aue"] = "raw"; + paramj["vad_info"] = "end"; + paramj["cloud_vad_eos"] = "700"; + paramj["close_delay"] = "200"; + paramj["scene"] = "main_box"; + paramj["sample_rate"] = "16000"; + paramj["context"] = R"({"sdk_support":["nlp","tts","vad","iat"]})"; + + aiuiService->initialize(appid, appkey, paramj.dump()); + aiuiService->aiuiInit(); + aiuiService->onMessage.connect([&](json rxjson) { processAIUIRX(rxjson); }); + + /** + * @brief 读取并发送文件 + */ + FILE *fp = fopen(inputwav.c_str(), "rb"); + if (!fp) { + printf("cant not find test.pcm !!!\n"); + exit(-1); + } + char buff[1280]; + memset(buff, '\0', 1280); + fread(buff, sizeof(char), 44, fp); + while (fread(buff, sizeof(char), 1280, fp) > 0) { + logger->info("write audio data {}", 1280); + aiuiService->aiuiWrite(buff, 1280); + usleep(40 * 1000); + memset(buff, '\0', 1280); + } + logger->info("write audio data end"); + aiuiService->aiuiFinished(); + fclose(fp); + + sleep(5); + + logger->info("aiui_destroy"); + aiuiService->aiuiDestroy(); + logger->info("aiui_destroy end"); + + while (true) sleep(1000); +} \ No newline at end of file