| | |
| | | #include <esp_mn_models.h> |
| | | #include <esp_mn_speech_commands.h> |
| | | #include <cJSON.h> |
| | | #include <chrono> |
| | | |
| | | #define TAG "CustomWakeWord" |
| | | |
| | |
| | | } |
| | | |
| | | void CustomWakeWord::StoreWakeWordData(const std::vector<int16_t>& data) { |
| | | // store audio data to wake_word_pcm_ |
| | | wake_word_pcm_.push_back(data); |
| | | std::vector<int16_t> chunk; |
| | | chunk.reserve(2048); |
| | | chunk.assign(data.begin(), data.end()); |
| | | wake_word_pcm_.push_back(std::move(chunk)); |
| | | // keep about 2 seconds of data, detect duration is 30ms (sample_rate == 16000, chunksize == 512) |
| | | while (wake_word_pcm_.size() > 2000 / 30) { |
| | | wake_word_pcm_.pop_front(); |
| | | } |
| | | } |
| | | |
| | | void CustomWakeWord::ClearWakeBuffers() { |
| | | std::lock_guard<std::mutex> lock(wake_word_mutex_); |
| | | wake_word_pcm_.clear(); |
| | | wake_word_opus_.clear(); |
| | | } |
| | | |
| | | void CustomWakeWord::AbortWakeWordEncode() { |
| | | std::lock_guard<std::mutex> lock(wake_word_mutex_); |
| | | wake_word_pcm_.clear(); |
| | | wake_word_opus_.clear(); |
| | | wake_word_opus_.emplace_back(); |
| | | wake_word_cv_.notify_all(); |
| | | } |
| | | |
| | | void CustomWakeWord::EncodeWakeWordData() { |
| | |
| | | } |
| | | vTaskDelete(NULL); |
| | | }, "encode_wake_word", stack_size, this, 2, wake_word_encode_task_stack_, wake_word_encode_task_buffer_); |
| | | if (wake_word_encode_task_ == nullptr) { |
| | | ESP_LOGE(TAG, "Failed to create encode_wake_word task"); |
| | | std::lock_guard<std::mutex> lock(wake_word_mutex_); |
| | | wake_word_opus_.push_back(std::vector<uint8_t>()); |
| | | wake_word_cv_.notify_all(); |
| | | } |
| | | } |
| | | |
| | | bool CustomWakeWord::GetWakeWordOpus(std::vector<uint8_t>& opus) { |
| | | std::unique_lock<std::mutex> lock(wake_word_mutex_); |
| | | wake_word_cv_.wait(lock, [this]() { |
| | | if (!wake_word_cv_.wait_for(lock, std::chrono::milliseconds(2000), [this]() { |
| | | return !wake_word_opus_.empty(); |
| | | }); |
| | | })) { |
| | | ESP_LOGW(TAG, "wake opus wait timeout"); |
| | | return false; |
| | | } |
| | | opus.swap(wake_word_opus_.front()); |
| | | wake_word_opus_.pop_front(); |
| | | return !opus.empty(); |