esp_wake_word.cc 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #include "esp_wake_word.h"
  2. #include "application.h"
  3. #include <esp_log.h>
  4. #include <model_path.h>
  5. #include <arpa/inet.h>
  6. #include <sstream>
  7. #define DETECTION_RUNNING_EVENT 1
  8. #define TAG "EspWakeWord"
  9. EspWakeWord::EspWakeWord() {
  10. event_group_ = xEventGroupCreate();
  11. }
  12. EspWakeWord::~EspWakeWord() {
  13. if (wakenet_data_ != nullptr) {
  14. wakenet_iface_->destroy(wakenet_data_);
  15. esp_srmodel_deinit(wakenet_model_);
  16. }
  17. vEventGroupDelete(event_group_);
  18. }
  19. bool EspWakeWord::Initialize(AudioCodec* codec) {
  20. codec_ = codec;
  21. wakenet_model_ = esp_srmodel_init("model");
  22. if (wakenet_model_ == nullptr || wakenet_model_->num == -1) {
  23. ESP_LOGE(TAG, "Failed to initialize wakenet model");
  24. return false;
  25. }
  26. if(wakenet_model_->num > 1) {
  27. ESP_LOGW(TAG, "More than one model found, using the first one");
  28. } else if (wakenet_model_->num == 0) {
  29. ESP_LOGE(TAG, "No model found");
  30. return false;
  31. }
  32. char *model_name = wakenet_model_->model_name[0];
  33. wakenet_iface_ = (esp_wn_iface_t*)esp_wn_handle_from_name(model_name);
  34. wakenet_data_ = wakenet_iface_->create(model_name, DET_MODE_95);
  35. int frequency = wakenet_iface_->get_samp_rate(wakenet_data_);
  36. int audio_chunksize = wakenet_iface_->get_samp_chunksize(wakenet_data_);
  37. ESP_LOGI(TAG, "Wake word(%s),freq: %d, chunksize: %d", model_name, frequency, audio_chunksize);
  38. return true;
  39. }
  40. void EspWakeWord::OnWakeWordDetected(std::function<void(const std::string& wake_word)> callback) {
  41. wake_word_detected_callback_ = callback;
  42. }
  43. void EspWakeWord::Start() {
  44. xEventGroupSetBits(event_group_, DETECTION_RUNNING_EVENT);
  45. }
  46. void EspWakeWord::Stop() {
  47. xEventGroupClearBits(event_group_, DETECTION_RUNNING_EVENT);
  48. }
  49. void EspWakeWord::Feed(const std::vector<int16_t>& data) {
  50. int res = wakenet_iface_->detect(wakenet_data_, (int16_t *)data.data());
  51. if (res > 0) {
  52. Stop();
  53. last_detected_wake_word_ = wakenet_iface_->get_word_name(wakenet_data_, res);
  54. if (wake_word_detected_callback_) {
  55. wake_word_detected_callback_(last_detected_wake_word_);
  56. }
  57. }
  58. }
  59. size_t EspWakeWord::GetFeedSize() {
  60. if (wakenet_data_ == nullptr) {
  61. return 0;
  62. }
  63. return wakenet_iface_->get_samp_chunksize(wakenet_data_) * codec_->input_channels();
  64. }
  65. void EspWakeWord::EncodeWakeWordData() {
  66. }
  67. bool EspWakeWord::GetWakeWordOpus(std::vector<uint8_t>& opus) {
  68. return false;
  69. }