asr.c 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. #include "include.h"
  2. #include "asr.h"
  3. #if ASR_EN
  4. void asr_prefetch_init(void);
  5. bool asr_huart_putcs(const void *buf, uint len);
  6. extern u8 asr_prefetch_kisck;
  7. #define TRACE_EN 1
  8. #define DEBUG_EN 0
  9. #if TRACE_EN
  10. #define TRACE(...) printf(__VA_ARGS__)
  11. #else
  12. #define TRACE(...)
  13. #endif
  14. #define ASR_2_LEVEL_DEAL_EN 0 //唤醒词是否分两级处理
  15. #define ASR_WARNNINGS_EN 0 //是否打开唤醒的提示音 注意:TWS模式下,语音识别算法跑在副耳,而部分提示音是不能由副耳发起同步播放的
  16. #define ASR_CMD_LEN 20 //唤醒词的最大长度(字节)
  17. #define ASR_WAKE_UP_WORD_NUM 3
  18. #define ASR_WAKE_UP_TICKS_THRESOLD 100//4s
  19. //和asr_cmd_list对应
  20. enum {
  21. ///唤醒词
  22. ASR_WAKE_UP_XIAO_LAN_TONG_XUE,
  23. ASR_WAKE_UP_XIAO_LAN_XIAO_LAN,
  24. ASR_WAKE_UP_NI_HAO_XIAO_LAN,
  25. ASR_WAKE_UP_ANSWER_INCOM,
  26. ASR_WAKE_UP_CALL_TERMINATE,
  27. ///二级命令词
  28. ASR_CMD_VOL_UP,
  29. ASR_CMD_VOL_DOWN,
  30. ASR_CMD_MUSIC_PLAY,
  31. ASR_CMD_MUSIC_PAUSE,
  32. ASR_CMD_MUSIC_STOP,
  33. ASR_CMD_MUSIC_NEXT,
  34. ASR_CMD_MUSIC_PREV,
  35. ASR_CMD_ANC_MODE,
  36. ASR_CMD_TRANSPARENCY_MODE,
  37. ASR_CMD_NORMAL_MODE,
  38. ASR_CMD_LIGHT_TURN_ON,
  39. ASR_CMD_LIGHT_TURN_OFF,
  40. ASR_CMD_VOICE_ASSISTANT,
  41. ASR_CMD_COLLECT_MUSIC,
  42. ASR_CMD_GAME_MODE,
  43. ASR_CMD_MUSIC_MODE,
  44. ASR_RESPONSE_RESULT_INDEX
  45. };
  46. const char asr_cmd_list[ASR_RESPONSE_RESULT_INDEX][ASR_CMD_LEN] = {
  47. ///唤醒词
  48. "小蓝同学",
  49. "小蓝小蓝",
  50. "你好小蓝",
  51. "接听电话",
  52. "挂断电话",
  53. ///二级命令词
  54. "增大音量",
  55. "减小音量",
  56. "播放歌曲",
  57. "暂停播放",
  58. "停止播放",
  59. "下一曲",
  60. "上一曲",
  61. "降噪模式",
  62. "通透模式",
  63. "普通模式",
  64. "打开灯光",
  65. "关闭灯光",
  66. "打开语音助手",
  67. "收藏音乐",
  68. "游戏模式",
  69. "音乐模式",
  70. };
  71. #if ASR_WARNNINGS_EN
  72. static void asr_warning_play(u16 num)
  73. {
  74. #if BT_TWS_EN
  75. bsp_res_play(num);
  76. #else
  77. bsp_piano_warning_play(WARNING_TONE, num);
  78. #endif // BT_TWS_EN
  79. }
  80. #endif // ASR_WARNNINGS_EN
  81. #if ASR_2_LEVEL_DEAL_EN ///唤醒词分两级处理
  82. static u8 asr_wake_up_flag = 0;
  83. static u32 asr_wake_ticks = 0;
  84. static void asr_2_level_deal(const char *result)
  85. {
  86. uint32_t item = 0;
  87. for (; item < ASR_RESPONSE_RESULT_INDEX; item++) {
  88. if (strcmp(result, (const char *)&asr_cmd_list[item]) == 0) {
  89. break;
  90. }
  91. }
  92. TRACE("asr_deal %d\n", item);
  93. //wake up word
  94. if (item < ASR_WAKE_UP_WORD_NUM) {
  95. asr_wake_up_flag = 1;
  96. asr_wake_ticks = 0;
  97. #if ASR_WARNNINGS_EN
  98. asr_warning_play(2);
  99. #endif // ASR_WARNNINGS_EN
  100. return;
  101. }
  102. //incoming
  103. if (f_bt.disp_status == BT_STA_INCOMING) {
  104. if (item == ASR_WAKE_UP_ANSWER_INCOM) {
  105. bt_call_answer_incoming();
  106. } else if (item == ASR_WAKE_UP_CALL_TERMINATE) {
  107. bt_call_terminate();
  108. }
  109. asr_wake_up_flag = 0;
  110. asr_wake_ticks = 0;
  111. return;
  112. }
  113. if (asr_wake_up_flag) {
  114. switch (item) {
  115. case ASR_CMD_VOL_UP:
  116. msg_enqueue(KU_VOL_UP);
  117. break;
  118. case ASR_CMD_VOL_DOWN:
  119. msg_enqueue(KU_VOL_DOWN);
  120. break;
  121. case ASR_CMD_MUSIC_PLAY:
  122. bt_music_play();
  123. break;
  124. case ASR_CMD_MUSIC_PAUSE:
  125. bt_music_pause();
  126. break;
  127. case ASR_CMD_MUSIC_STOP:
  128. bt_music_stop();
  129. break;
  130. case ASR_CMD_MUSIC_NEXT:
  131. bt_music_next();
  132. break;
  133. case ASR_CMD_MUSIC_PREV:
  134. bt_music_prev();
  135. break;
  136. case ASR_CMD_ANC_MODE:
  137. break;
  138. case ASR_CMD_TRANSPARENCY_MODE:
  139. break;
  140. case ASR_CMD_NORMAL_MODE:
  141. break;
  142. case ASR_CMD_LIGHT_TURN_ON:
  143. break;
  144. case ASR_CMD_LIGHT_TURN_OFF:
  145. break;
  146. case ASR_CMD_VOICE_ASSISTANT:
  147. bt_hfp_siri_switch();
  148. break;
  149. case ASR_CMD_COLLECT_MUSIC:
  150. break;
  151. case ASR_CMD_GAME_MODE:
  152. if (!bt_is_low_latency()) {
  153. bsp_res_play(TWS_RES_GAME_MODE);
  154. }
  155. break;
  156. case ASR_CMD_MUSIC_MODE:
  157. if (bt_is_low_latency()) {
  158. bsp_res_play(TWS_RES_MUSIC_MODE);
  159. }
  160. break;
  161. default:
  162. break;
  163. }
  164. asr_wake_up_flag = 0;
  165. asr_wake_ticks = 0;
  166. #if ASR_WARNNINGS_EN
  167. asr_warning_play(3);
  168. #endif // ASR_WARNNINGS_EN
  169. }
  170. }
  171. #else ///唤醒词一级处理
  172. void asr_deal(const char *result)
  173. {
  174. uint32_t item = 0;
  175. for (; item < ASR_RESPONSE_RESULT_INDEX; item++) {
  176. if (strcmp(result, (const char *)&asr_cmd_list[item]) == 0) {
  177. break;
  178. }
  179. }
  180. TRACE("asr_deal %d\n", item);
  181. switch (item) {
  182. case ASR_WAKE_UP_XIAO_LAN_TONG_XUE:
  183. case ASR_WAKE_UP_XIAO_LAN_XIAO_LAN:
  184. case ASR_WAKE_UP_NI_HAO_XIAO_LAN:
  185. bt_hfp_siri_switch();
  186. break;
  187. case ASR_WAKE_UP_ANSWER_INCOM:
  188. if (f_bt.disp_status == BT_STA_INCOMING) {
  189. bt_call_answer_incoming();
  190. }
  191. break;
  192. case ASR_WAKE_UP_CALL_TERMINATE:
  193. if (f_bt.disp_status == BT_STA_INCOMING) {
  194. bt_call_terminate();
  195. }
  196. break;
  197. case ASR_CMD_VOL_UP:
  198. msg_enqueue(KU_VOL_UP);
  199. break;
  200. case ASR_CMD_VOL_DOWN:
  201. msg_enqueue(KU_VOL_DOWN);
  202. break;
  203. case ASR_CMD_MUSIC_PLAY:
  204. bt_music_play();
  205. break;
  206. case ASR_CMD_MUSIC_PAUSE:
  207. bt_music_pause();
  208. break;
  209. case ASR_CMD_MUSIC_STOP:
  210. bt_music_stop();
  211. break;
  212. case ASR_CMD_MUSIC_NEXT:
  213. bt_music_next();
  214. break;
  215. case ASR_CMD_MUSIC_PREV:
  216. bt_music_prev();
  217. break;
  218. case ASR_CMD_ANC_MODE:
  219. break;
  220. case ASR_CMD_TRANSPARENCY_MODE:
  221. break;
  222. case ASR_CMD_NORMAL_MODE:
  223. break;
  224. case ASR_CMD_LIGHT_TURN_ON:
  225. break;
  226. case ASR_CMD_LIGHT_TURN_OFF:
  227. break;
  228. case ASR_CMD_VOICE_ASSISTANT:
  229. bt_hfp_siri_switch();
  230. break;
  231. case ASR_CMD_COLLECT_MUSIC:
  232. break;
  233. case ASR_CMD_GAME_MODE:
  234. if (!bt_is_low_latency()) {
  235. bsp_res_play(TWS_RES_GAME_MODE);
  236. }
  237. break;
  238. case ASR_CMD_MUSIC_MODE:
  239. if (bt_is_low_latency()) {
  240. bsp_res_play(TWS_RES_MUSIC_MODE);
  241. }
  242. break;
  243. default:
  244. break;
  245. }
  246. #if ASR_WARNNINGS_EN
  247. if (item == ASR_CMD_VOICE_ASSISTANT || item == ASR_CMD_GAME_MODE || item == ASR_CMD_MUSIC_MODE || (item <= ASR_WAKE_UP_CALL_TERMINATE)) {
  248. return;
  249. }
  250. asr_warning_play(2);
  251. #endif // ASR_WARNNINGS_EN
  252. }
  253. #endif // ASR_2_LEVEL_DEAL_EN
  254. u32 asr_alg_process(short *ptr)
  255. {
  256. const char *text;
  257. float score;
  258. ///asr recog
  259. int ret = 0;
  260. #if DEBUG_EN
  261. GPIOESET = BIT(11);
  262. #endif // DEBUG_EN
  263. ret = Wanson_ASR_Recog(ptr, 400, &text, &score);
  264. #if DEBUG_EN
  265. GPIOECLR = BIT(11);
  266. #endif // DEBUG_EN
  267. #if ASR_PREFETCH_EN
  268. if (asr_prefetch_kisck) {
  269. asr_prefetch_kisck --;
  270. }
  271. #endif
  272. #if ASR_2_LEVEL_DEAL_EN
  273. if (asr_wake_up_flag) {
  274. if (asr_wake_ticks < ASR_WAKE_UP_TICKS_THRESOLD) {
  275. asr_wake_ticks++;
  276. } else {
  277. asr_wake_up_flag = 0;
  278. asr_wake_ticks = 0;
  279. #if ASR_WARNNINGS_EN
  280. asr_warning_play(3);
  281. #endif // ASR_WARNNINGS_EN
  282. }
  283. }
  284. #endif // ASR_2_LEVEL_DEAL_EN
  285. if (ret == 1) {
  286. TRACE("ASR Result: %s\n", text);
  287. #if ASR_2_LEVEL_DEAL_EN
  288. asr_2_level_deal(text);
  289. #else
  290. asr_deal(text);
  291. #endif // ASR_2_LEVEL_DEAL_EN
  292. #if ASR_PREFETCH_EN
  293. asr_prefetch_kisck = 5;
  294. #endif
  295. }
  296. return ret;
  297. }
  298. void asr_alg_stop(void)
  299. {
  300. Wanson_ASR_Release();
  301. TRACE("Wanson_ASR_Release!\n");
  302. }
  303. void asr_alg_init(void)
  304. {
  305. #if DEBUG_EN
  306. GPIOBDE |= BIT(1);
  307. GPIOBCLR = BIT(1);
  308. GPIOBDIR &= ~BIT(1);
  309. GPIOEDE |= BIT(2);
  310. GPIOECLR = BIT(2);
  311. GPIOEDIR &= ~BIT(2);
  312. GPIOEDE |= BIT(11);
  313. GPIOECLR = BIT(11);
  314. GPIOEDIR &= ~BIT(11);
  315. GPIOEDE |= BIT(12);
  316. GPIOECLR = BIT(12);
  317. GPIOEDIR &= ~BIT(12);
  318. GPIOADE |= BIT(14);
  319. GPIOACLR = BIT(14);
  320. GPIOADIR &= ~BIT(14);
  321. GPIOEDE |= BIT(4);
  322. GPIOECLR = BIT(4);
  323. GPIOEDIR &= ~BIT(4);
  324. #endif // DEBUG_EN
  325. }
  326. void asr_alg_start(void)
  327. {
  328. if (Wanson_ASR_Init() < 0) {
  329. TRACE("Wanson_ASR_Init Failed!\n");
  330. while (1) WDT_CLR();
  331. }
  332. Wanson_ASR_Reset();
  333. TRACE("Wanson_ASR_Init OK!\n");
  334. #if ASR_PREFETCH_EN
  335. asr_prefetch_init();
  336. TRACE("asr_prefetch_init OK!\n");
  337. #endif
  338. }
  339. #endif