You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

246 lines
7.8 KiB

2 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
3 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
2 years ago
2 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
2 years ago
2 years ago
2 years ago
3 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
3 years ago
3 years ago
  1. #include <curl/curl.h>
  2. #include <iostream>
  3. #include <string>
  4. #include "zlinuxcomponents/aiui_ws/aiui_service.hpp"
  5. #include "zlinuxcomponents/alsaplayer/AudioPlayerAlsaImpl.hpp"
  6. #include "zlinuxcomponents/alsaplayer/smart_soundbox_player.hpp"
  7. #include "zlinuxcomponents/zmainhelper.hpp"
  8. //
  9. #include "configs/gconfig.hpp"
  10. #include "iflytopcpp/core/spdlogfactory/logger.hpp"
  11. #include "iflytopcpp/core/thread/thread.hpp"
  12. #include "version.hpp"
  13. #include "zlinuxcomponents/rootfs_auto_update/rootfs_auto_update.hpp"
  14. #include "zservice_container/zservice_container.hpp"
  15. #include "zwebservice/zwebservice.hpp"
  16. //
  17. #include "iflytopvoicecpp/soundbox4mic_voice_pre_process.hpp"
  18. #include "service/device_io_service.hpp"
  19. #include "service/device_io_service_mock.hpp"
  20. #include "service/light_control_service.hpp"
  21. #include "service/main_control_service.hpp"
  22. #include "service/report_service.hpp"
  23. #include "service/voiceprocess/audio_logging_service.hpp"
  24. #include "service/voiceprocess/audio_recoder_service.hpp"
  25. #include "service/voiceprocess/beforeasr_voiceprocesser.hpp"
  26. #include "service/voiceprocess/beforewakeup_voiceprocesser.hpp"
  27. #include "service/voiceprocess/common_voiceprocesser.hpp"
  28. #include "service/voiceprocess/wakeup_processer.hpp"
  29. //
  30. using namespace iflytop;
  31. using namespace core;
  32. using namespace std;
  33. using namespace clipp;
  34. class Main {
  35. ENABLE_LOGGER(Main);
  36. private:
  37. unique_ptr<Thread> thread;
  38. private:
  39. int main(int argc, char *argv[]);
  40. public:
  41. Main(/* args */) {}
  42. ~Main() {}
  43. void run(int argc, char *argv[]) {
  44. thread.reset(new Thread("main", [&]() { exit(main(argc, argv)); }));
  45. while (true) sleep(1000);
  46. }
  47. void appSetup(int argc, char *argv[]);
  48. void updateRootfs();
  49. void buildDeviceIOService();
  50. void buildVoiceProcessService();
  51. void onSIGINT();
  52. void dosystem(string order, bool dump) {
  53. if (dump) {
  54. logger->info("{}", order);
  55. }
  56. system(order.c_str());
  57. }
  58. };
  59. Main *g_main;
  60. void onsignal(int signo) { g_main->onSIGINT(); }
  61. int main(int argc, char *argv[]) {
  62. Main main;
  63. g_main = &main;
  64. ::signal(SIGINT, onsignal);
  65. main.run(argc, argv);
  66. }
  67. /***********************************************************************************************************************
  68. * =======================================================Main======================================================== *
  69. ***********************************************************************************************************************/
  70. void Main::onSIGINT() { exit(0); }
  71. void Main::appSetup(int argc, char *argv[]) {
  72. string g_host_server_ip;
  73. string device_id;
  74. string aiui_auth_id;
  75. #if 1
  76. auto cli = ((required("-device_id") & value("device_id", device_id)).doc("device_id"),
  77. (required("-aiui_auth_id") & value("aiui_auth_id", aiui_auth_id)).doc("aiui_auth_id") //
  78. );
  79. if (!parse(argc, argv, cli)) {
  80. cout << make_man_page(cli, argv[0]);
  81. exit(-1);
  82. }
  83. #endif
  84. logger->info("system setup start.");
  85. spdlog::flush_on(spdlog::level::debug);
  86. logger->info("#");
  87. logger->info("# company:{}", "ifytop");
  88. logger->info("# version:{}", VERSION);
  89. logger->info("#");
  90. // BUILD_AND_REG_SERRVICE(Config);
  91. logger->info("build {}.....", "Config");
  92. BUILD_AND_REG_SERRVICE(GConfig);
  93. GET_SERVICE(GConfig)->initialize();
  94. if (!device_id.empty()) GET_SERVICE(GConfig)->set_deviceId(device_id);
  95. if (!aiui_auth_id.empty()) GET_SERVICE(GConfig)->set_aiui_auth_id(aiui_auth_id);
  96. }
  97. void Main::updateRootfs() {
  98. /**
  99. * @brief rootfs目录中的文件和系统中对应路径的文件是否一致
  100. *
  101. *
  102. * ./rootfs/etc/asound.conf /etc/asound.conf
  103. *
  104. */
  105. auto rootfsAutoUpdate = make_shared<RootfsAutoUpdate>();
  106. rootfsAutoUpdate->compareAndReplace();
  107. logger->info("rootfs changed:{}", rootfsAutoUpdate->isChanged() ? "yes" : "no");
  108. if (rootfsAutoUpdate->isChanged()) {
  109. logger->info("reboot system.");
  110. logger->warn("not auto reboot, please reboot manually.");
  111. // system("reboot");
  112. }
  113. }
  114. void Main::buildDeviceIOService() {
  115. /**
  116. * @brief DeviceIOService初始化
  117. */
  118. auto config = GET_SERVICE(GConfig);
  119. /**
  120. * @brief
  121. */
  122. logger->info("enable speaker ctrl ic");
  123. dosystem(fmt::format("echo {} >/sys/class/gpio/export", config->get_speaker_driver_ic_ctrl_pin()), true);
  124. dosystem(fmt::format("echo out >/sys/class/gpio/gpio{}/direction", config->get_speaker_driver_ic_ctrl_pin()), true);
  125. dosystem(fmt::format("echo 1 >/sys/class/gpio/gpio{}/value", config->get_speaker_driver_ic_ctrl_pin()), true);
  126. #if 1
  127. BUILD_AND_REG_SERRVICE(DeviceIOService);
  128. #else
  129. BUILD_AND_REG_MOCK_SERRVICE(DeviceIOService, DeviceIOServiceMock);
  130. #endif
  131. GET_SERVICE(DeviceIOService)->initialize(config->get_device_io_uart_path(), config->get_device_io_uart_baundrate());
  132. }
  133. void Main::buildVoiceProcessService() {
  134. /**
  135. * @brief
  136. */
  137. auto config = GET_SERVICE(GConfig);
  138. BUILD_AND_REG_SERRVICE(Soundbox4micVoicePreProcess);
  139. GET_SERVICE(Soundbox4micVoicePreProcess)->initialize();
  140. // AudioLoggingService
  141. BUILD_AND_REG_SERRVICE(AudioLoggingService);
  142. GET_SERVICE(AudioLoggingService)->initialize(config->get_voice_logger_enable());
  143. // 音频采集
  144. BUILD_AND_REG_SERRVICE(AudioRecoderService);
  145. GET_SERVICE(AudioRecoderService)
  146. ->initialize(config->get_recoder_device_name().c_str(), //
  147. config->get_recoder_ch_number(), //
  148. config->get_recoder_sample_rate(), //
  149. SND_PCM_FORMAT_S16_LE, //
  150. config->get_recoder_period_time_ms());
  151. // BfWakeupVProcesser
  152. BUILD_AND_REG_SERRVICE(BfWakeupVProcesser);
  153. GET_SERVICE(BfWakeupVProcesser)->initialize();
  154. // BeforeAsrVoiceProcesser
  155. BUILD_AND_REG_SERRVICE(BfAsrVProcesser);
  156. GET_SERVICE(BfAsrVProcesser)->initialize();
  157. BUILD_AND_REG_SERRVICE(CommonVoiceProcesser);
  158. GET_SERVICE(CommonVoiceProcesser)->initialize(5 /*总通道数*/, 4 /*参考通道通道INDEX*/);
  159. // WakeupProcesser
  160. BUILD_AND_REG_SERRVICE(WakeupProcesser);
  161. GET_SERVICE(WakeupProcesser)
  162. ->initialize(config->get_wakeup_lib_module(), //
  163. config->get_wakeup_module_path(), //
  164. config->get_wakeup_chunk_length());
  165. // AsrProcesser
  166. const char *appid = config->get_aiui_appid().c_str();
  167. const char *appkey = config->get_aiui_appkey().c_str();
  168. json paramj;
  169. paramj["result_level"] = "plain";
  170. paramj["auth_id"] = config->get_aiui_auth_id();
  171. paramj["data_type"] = "audio";
  172. paramj["aue"] = "raw";
  173. paramj["vad_info"] = "end";
  174. paramj["cloud_vad_eos"] = "700";
  175. paramj["close_delay"] = "200";
  176. paramj["scene"] = config->get_aiui_scene();
  177. paramj["sample_rate"] = "16000";
  178. paramj["context"] = R"({"sdk_support":["nlp","tts","vad","iat"]})";
  179. BUILD_AND_REG_SERRVICE(AiuiService);
  180. logger->info("appid {}", appid);
  181. logger->info("param {}", paramj.dump(0));
  182. GET_SERVICE(AiuiService)->initialize(appid, appkey, paramj.dump());
  183. }
  184. int Main::main(int argc, char *argv[]) {
  185. appSetup(argc, argv);
  186. updateRootfs();
  187. buildDeviceIOService();
  188. buildVoiceProcessService();
  189. // while (true) sleep(1000);
  190. // 播放器-SmartSoundBoxPlayer
  191. BUILD_AND_REG_SERRVICE(SmartSoundBoxPlayer);
  192. GET_SERVICE(SmartSoundBoxPlayer)->initialize(100, 30);
  193. /**
  194. * @brief
  195. */
  196. BUILD_AND_REG_SERRVICE(ZWebService);
  197. GET_SERVICE(ZWebService)->initialize();
  198. BUILD_AND_REG_SERRVICE(LightControlService);
  199. GET_SERVICE(LightControlService)->initialize();
  200. GET_SERVICE(LightControlService)->start();
  201. BUILD_AND_REG_SERRVICE(ReportService);
  202. GET_SERVICE(ReportService)->initialize();
  203. GET_SERVICE(ReportService)->start();
  204. BUILD_AND_REG_SERRVICE(MainControlService);
  205. GET_SERVICE(MainControlService)->initialize();
  206. logger->info("system setup end.");
  207. while (true) sleep(1000);
  208. }