bsp_asr.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. #include "include.h"
  2. #include "asr.h"
  3. #if !ASR_EN
  4. ///自定义asr mic buff,如果不使用asr功能,但需要改动mic的samples和地址的话,
  5. ///只能在这两个函数修改,bsp_audio.c那边修改无效
  6. //u32 asr_get_adc_buff_addr(void)
  7. //{
  8. // return DMA_ADR(); //返回地址自定义地址
  9. //}
  10. //
  11. //u32 asr_get_adc_buff_len(void)
  12. //{
  13. // return 0; //返回样点数,即上面自定义buf的总长度/2
  14. //}
  15. #else
  16. #define ASR_DUMP_EN 0 //是否dump mic数据
  17. #define TRACE_EN 1
  18. #if TRACE_EN
  19. #define TRACE(...) printf(__VA_ARGS__)
  20. #else
  21. #define TRACE(...)
  22. #endif
  23. #define SDADC_DMA_BUF_IDX 3
  24. #define SDADC_MIC_NUM_MAX 5
  25. #define SDADC_DMA_SIZE 256
  26. void huart_wait_txdone(void);
  27. void load_asr_comm_code(void);
  28. void asr_kick_start(void);
  29. extern u8 sdadc_buf[SDADC_DMA_BUF_IDX][SDADC_DMA_SIZE * 4];
  30. extern struct asr_buf_t asr_buf;
  31. static volatile u8 asr_sta = 0;
  32. #if !VAD_EN
  33. AT(.vad.mic_buf)
  34. short sdadc_buf_asr[3*640];
  35. static u8 asr_wprt, asr_rptr;
  36. #endif
  37. #if ASR_DUMP_EN
  38. static u8 asr_dump_header[8] AT(.vad.dump.header);
  39. static s16 asr_dump_buffer[640] AT(.vad.dump.buffer);
  40. void asr_huart_init(void)
  41. {
  42. asr_dump_header[0] = 0x36;
  43. asr_dump_header[1] = 0xAD;
  44. asr_dump_header[2] = 0xf9;
  45. asr_dump_header[3] = 0x54;
  46. }
  47. AT(.com_text.asr_dump)
  48. static bool asr_huart_putcs_do(const void *buf, uint len)
  49. {
  50. memcpy(asr_dump_buffer, buf, len);
  51. huart_tx(asr_dump_buffer, len);
  52. return true;
  53. }
  54. AT(.com_text.asr_dump)
  55. bool asr_huart_putcs(const void *buf, uint len)
  56. {
  57. static u8 frame_num = 0;
  58. bool ret;
  59. asr_dump_header[4] = 2; //type
  60. asr_dump_header[5] = (u8)(len >> 8);
  61. asr_dump_header[6] = (u8)(len >> 0);
  62. asr_dump_header[7] = frame_num++;
  63. ret = asr_huart_putcs_do(asr_dump_header, 8);
  64. huart_wait_txdone();
  65. if (!ret) {
  66. return false;
  67. }
  68. ret = asr_huart_putcs_do(buf, len);
  69. return ret;
  70. }
  71. #endif
  72. ///语音识别回调函数
  73. void asr_callback_process(short *ptr)
  74. {
  75. #if ASR_DUMP_EN
  76. #if !VAD_EN
  77. asr_huart_putcs(ptr,640*2);
  78. #else
  79. #if VAD_MODE_SEL == VAD_MODE_1
  80. asr_huart_putcs(ptr,512*2);
  81. #else
  82. asr_huart_putcs(ptr,ASR_PCM_NUM*2);
  83. #endif
  84. #endif
  85. #endif
  86. asr_alg_process(ptr);
  87. }
  88. uint8_t sysclk_get_spiflash_clkdiv(u32 sys_clk)
  89. {
  90. if (sys_clk == SYS_160M) {
  91. return 1;
  92. } else {
  93. return 0;
  94. }
  95. }
  96. ///自定义asr mic buff
  97. u32 asr_get_adc_buff_addr(void)
  98. {
  99. #if VAD_MODE_SEL == VAD_MODE_1 && VAD_EN
  100. extern u16 vad_sdadc_buf[VAD_DMA_SIZE];
  101. return DMA_ADR(vad_sdadc_buf);
  102. #else
  103. return DMA_ADR(sdadc_buf);
  104. #endif
  105. }
  106. #if VAD_MODE_SEL == VAD_MODE_1 && VAD_EN
  107. u32 asr_get_adc_buff_len(void)
  108. {
  109. return VAD_DMA_SIZE;
  110. }
  111. #endif
  112. void asr_kws_process(void)
  113. {
  114. if (bsp_asr_get_statue() == 0) return;
  115. #if VAD_EN
  116. vad_kws_process();
  117. #else
  118. asr_callback_process(&sdadc_buf_asr[asr_rptr * 640]);
  119. asr_rptr++;
  120. if (asr_rptr == 3) asr_rptr = 0;
  121. #endif
  122. }
  123. AT(.com_text.vad.proc)
  124. void asr_sdadc_process(u8 *ptr, u32 samples, int ch_mode)
  125. {
  126. #if VAD_EN
  127. vad_sdadc_process(ptr, samples, ch_mode);
  128. #else
  129. memcpy(&sdadc_buf_asr[asr_wprt * 640],ptr,640 * 2);
  130. asr_wprt++;
  131. asr_kick_start();
  132. if (asr_wprt == 3) asr_wprt = 0;
  133. #endif
  134. }
  135. void bsp_asr_start(void)
  136. {
  137. if (asr_sta == 1) {
  138. return;
  139. }
  140. #if BT_MUSIC_EFFECT_EN
  141. music_effect_alg_suspend(MUSIC_EFFECT_SUSPEND_FOR_ASR);
  142. #endif
  143. npu_matrix_init();
  144. asr_alg_start();
  145. audio_path_init(AUDIO_PATH_ASR);
  146. audio_path_start(AUDIO_PATH_ASR);
  147. #if VAD_EN
  148. bsp_vad_start();
  149. #else
  150. asr_wprt = 0;
  151. asr_rptr = 0;
  152. sys_clk_req(INDEX_KARAOK,SYS_160M);
  153. #endif
  154. asr_sta = 1;
  155. TRACE("bsp_asr_start\n");
  156. }
  157. void bsp_asr_stop(void)
  158. {
  159. if (asr_sta == 0) {
  160. return;
  161. }
  162. TRACE("bsp_asr_stop\n");
  163. asr_sta = 0;
  164. #if VAD_EN
  165. bsp_vad_stop();
  166. #endif
  167. audio_path_exit(AUDIO_PATH_ASR);
  168. asr_alg_stop();
  169. npu_matrix_exit();
  170. sys_clk_free(INDEX_KARAOK);
  171. }
  172. AT(.com_text.asr.sta)
  173. u8 bsp_asr_get_statue(void)
  174. {
  175. return asr_sta;
  176. }
  177. void asr_bt_evt_notice(uint evt, void *params)
  178. {
  179. switch (evt) {
  180. case BT_NOTICE_TWS_CONNECTED:
  181. if (bt_tws_is_slave()) {
  182. msg_enqueue(EVT_ASR_STOP);
  183. }
  184. break;
  185. case BT_NOTICE_TWS_ROLE_CHANGE:
  186. if (bt_tws_is_slave()) {
  187. msg_enqueue(EVT_ASR_STOP);
  188. } else {
  189. msg_enqueue(EVT_ASR_START);
  190. }
  191. break;
  192. }
  193. }
  194. #endif