#ifndef AFE_WAKE_WORD_H #define AFE_WAKE_WORD_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include "audio_codec.h" #include "wake_word.h" class AfeWakeWord : public WakeWord { public: AfeWakeWord(); ~AfeWakeWord(); bool Initialize(AudioCodec* codec, srmodel_list_t* models_list); void Feed(const std::vector& data); void OnWakeWordDetected(std::function callback); void OnOfflineCommandDetected(std::function callback); void Start(); void Stop(); void ReleaseRuntime() override; bool EnsureRuntime() override; void ClearWakeBuffers() override; void AbortWakeWordEncode() override; size_t GetFeedSize(); void EncodeWakeWordData(); bool GetWakeWordOpus(std::vector& opus); const std::string& GetLastDetectedWakeWord() const { return last_detected_wake_word_; } private: srmodel_list_t *models_ = nullptr; const esp_afe_sr_iface_t* afe_iface_ = nullptr; esp_afe_sr_data_t* afe_data_ = nullptr; char* wakenet_model_ = NULL; char* multinet_model_ = NULL; esp_mn_iface_t* multinet_ = nullptr; model_iface_data_t* multinet_data_ = nullptr; std::vector wake_words_; EventGroupHandle_t event_group_; std::function wake_word_detected_callback_; std::function offline_command_detected_callback_; AudioCodec* codec_ = nullptr; std::string last_detected_wake_word_; std::vector input_buffer_; std::vector multinet_input_buffer_; std::mutex input_buffer_mutex_; TaskHandle_t wake_word_encode_task_ = nullptr; StaticTask_t* wake_word_encode_task_buffer_ = nullptr; StackType_t* wake_word_encode_task_stack_ = nullptr; TaskHandle_t detection_task_handle_ = nullptr; StaticTask_t* detection_task_buffer_ = nullptr; StackType_t* detection_task_stack_ = nullptr; std::deque> wake_word_pcm_; std::deque> wake_word_opus_; std::mutex wake_word_mutex_; std::condition_variable wake_word_cv_; bool detection_task_started_ = false; bool CreateAfe(); bool EnsureDetectionTask(); void StoreWakeWordData(const int16_t* data, size_t size); void AudioDetectionTask(); }; #endif