#ifndef WAKE_WORD_DETECT_H #define WAKE_WORD_DETECT_H #include #include #include #include #include #include #include #include #include #include #include #include "audio_codec.h" #include "wake_word.h" class WakeWordDetect : public WakeWord { public: WakeWordDetect(); ~WakeWordDetect(); bool Initialize(AudioCodec* codec) override; void Feed(const std::vector& data) override; void OnWakeWordDetected(std::function callback) override; void Start() override; void Stop() override; bool IsRunning() override; size_t GetFeedSize() override; void EncodeWakeWordData() override; bool GetWakeWordOpus(std::vector& opus) override; const std::string& GetLastDetectedWakeWord() const override { return last_detected_wake_word_; } // 保持向后兼容的方法 void StartDetection() { Start(); } void StopDetection() { Stop(); } bool IsDetectionRunning() { return IsRunning(); } private: const esp_afe_sr_iface_t* afe_iface_ = nullptr; esp_afe_sr_data_t* afe_data_ = nullptr; char* wakenet_model_ = NULL; std::vector wake_words_; EventGroupHandle_t event_group_; std::function wake_word_detected_callback_; AudioCodec* codec_ = nullptr; std::string last_detected_wake_word_; TaskHandle_t wake_word_encode_task_ = nullptr; StaticTask_t wake_word_encode_task_buffer_; StackType_t* wake_word_encode_task_stack_ = nullptr; std::list> wake_word_pcm_; std::list> wake_word_opus_; std::mutex wake_word_mutex_; std::condition_variable wake_word_cv_; void StoreWakeWordData(uint16_t* data, size_t size); void AudioDetectionTask(); }; #endif