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.

71 lines
3.0 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. #include "wakeup_processer.hpp"
  2. using namespace std;
  3. using namespace iflytop;
  4. using namespace core;
  5. #define WAKEUP_MODULE_INIT_TIMEOUT_S 8
  6. void WakeupProcesser::initialize(string precise_engine, string wakeupmodulepath, string chunksize) {
  7. logger->info("initialize precise_engine:{}, wakeupmodulepath:{}, chunksize:{}", precise_engine, wakeupmodulepath,
  8. chunksize);
  9. wakeupProcesser.reset(new MycroftPreciseWapper());
  10. wakeupProcesser->initialize(precise_engine.c_str(), wakeupmodulepath.c_str(), chunksize.c_str());
  11. m_chucksize = atoi(chunksize.c_str());
  12. uint16_t s_zerovoicebuf[m_chucksize] = {0};
  13. wakeupProcesser->processVoice((uint8_t*)&s_zerovoicebuf[0], m_chucksize * 2);
  14. wakeupProcesser->processVoice((uint8_t*)&s_zerovoicebuf[0], m_chucksize * 2);
  15. for (size_t i = 0; i < WAKEUP_MODULE_INIT_TIMEOUT_S; i++) {
  16. logger->info("wait for wakeup module init {}/{}", i, WAKEUP_MODULE_INIT_TIMEOUT_S);
  17. sleep(1);
  18. }
  19. }
  20. int WakeupProcesser::getChunkSize() { return m_chucksize; }
  21. void WakeupProcesser::dumpwakeup_info(float source) {
  22. if (source > 0.9) {
  23. logger->info("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++{}", source);
  24. } else if (source > 0.8) {
  25. logger->info("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ {}", source);
  26. } else if (source > 0.7) {
  27. logger->info("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ {}", source);
  28. } else if (source > 0.6) {
  29. logger->info("++++++++++++++++++++++++++++++++++++++++++++++++++ {}", source);
  30. } else if (source > 0.4) {
  31. logger->info("++++++++++++++++++++++++++++++++++++++++ {}", source);
  32. } else if (source > 0.3) {
  33. logger->info("++++++++++++++++++++++++++++++ {}", source);
  34. } else if (source > 0.2) {
  35. logger->info("++++++++++++++++++++ {}", source);
  36. } else if (source > 0.1) {
  37. logger->info("++++++++++ {}", source);
  38. }
  39. }
  40. void WakeupProcesser::processVoice(uint8_t* voice, size_t voiceLen) {
  41. if (!voice) return;
  42. ZCHECK(voiceLen == m_chucksize, "voiceLen != m_chucksize");
  43. // logger->info("before processVoice {}", voiceLen);
  44. wakeupProcesser->processVoice(voice, voiceLen);
  45. // logger->info("end processVoice");
  46. wakeupProcesser->regWakeupCB([&](float wakeupscore) {
  47. if (!wakeupflag) {
  48. if (wakeupscore > 0.1) {
  49. dumpwakeup_info(wakeupscore);
  50. }
  51. if (!wakeupflag && wakeupscore > 0.60) {
  52. wakeupflag = true;
  53. logger->info("detect wakeup signal {}", wakeupscore);
  54. last_wakeup_timepoint = tu_steady().now();
  55. onWakeupSignal(wakeupscore);
  56. }
  57. } else {
  58. if (wakeupscore < 0.5 && tu_steady().elapsedTimeMs(last_wakeup_timepoint) >= 1500) {
  59. wakeupflag = false;
  60. }
  61. }
  62. });
  63. }