From 220e4fab27b7f419b3e89e2f2d28ae789aac09d7 Mon Sep 17 00:00:00 2001
From: wangzhibo <wangzhibo@shsening.com>
Date: 星期四, 08 十月 2026 16:29:55 +0800
Subject: [PATCH] 5种场景模式家长端ok
---
xiaozhi-esp32-2.2.6/main/audio/audio_service.cc | 52 +++++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 47 insertions(+), 5 deletions(-)
diff --git a/xiaozhi-esp32-2.2.6/main/audio/audio_service.cc b/xiaozhi-esp32-2.2.6/main/audio/audio_service.cc
index 209f7fe..78fe720 100644
--- a/xiaozhi-esp32-2.2.6/main/audio/audio_service.cc
+++ b/xiaozhi-esp32-2.2.6/main/audio/audio_service.cc
@@ -1,4 +1,5 @@
#include "audio_service.h"
+#include "processors/audio_debugger.h"
#include <esp_log.h>
#include <cstring>
#include <chrono>
@@ -240,6 +241,9 @@
if (audio_input_need_warmup_) {
audio_input_need_warmup_ = false;
vTaskDelay(pdMS_TO_TICKS(120));
+ if (xEventGroupGetBits(event_group_) & AS_EVENT_AUDIO_PROCESSOR_RUNNING) {
+ audio_processor_->Start();
+ }
continue;
}
@@ -538,6 +542,12 @@
}
}
+void AudioService::AbortWakeWordEncode() {
+ if (wake_word_) {
+ wake_word_->AbortWakeWordEncode();
+ }
+}
+
const std::string& AudioService::GetLastWakeWord() const {
return wake_word_->GetLastDetectedWakeWord();
}
@@ -568,6 +578,9 @@
return;
}
wake_word_initialized_ = true;
+ } else if (!wake_word_->EnsureRuntime()) {
+ ESP_LOGE(TAG, "Failed to restore wake word runtime");
+ return;
}
// Reset input resampler to clear cached data from previous mode (e.g. AudioProcessor)
// This prevents buffer overflow when switching between different feed sizes
@@ -585,13 +598,39 @@
}
}
+void AudioService::ClearWakeWordBuffers() {
+ if (wake_word_) {
+ wake_word_->ClearWakeBuffers();
+ }
+}
+
+void AudioService::ReleaseAfeRuntime() {
+ EnableVoiceProcessing(false);
+ EnableWakeWordDetection(false);
+ if (wake_word_) {
+ wake_word_->ReleaseRuntime();
+ }
+ ReleaseVoiceProcessorRuntime();
+}
+
+void AudioService::ReleaseVoiceProcessorRuntime() {
+ EnableVoiceProcessing(false);
+ if (audio_processor_initialized_ && audio_processor_) {
+ audio_processor_->ReleaseRuntime();
+ }
+}
+
void AudioService::EnsureVoiceProcessorReady() {
- if (audio_processor_initialized_ || audio_processor_ == nullptr) {
+ if (audio_processor_ == nullptr) {
return;
}
- ESP_LOGI(TAG, "Preload voice processor");
- audio_processor_->Initialize(codec_, OPUS_FRAME_DURATION_MS, models_list_);
- audio_processor_initialized_ = true;
+ if (!audio_processor_initialized_) {
+ ESP_LOGI(TAG, "Preload voice processor");
+ audio_processor_->Initialize(codec_, OPUS_FRAME_DURATION_MS, models_list_);
+ audio_processor_initialized_ = true;
+ } else if (!audio_processor_->EnsureRuntime()) {
+ ESP_LOGE(TAG, "Failed to restore voice processor runtime");
+ }
}
void AudioService::EnableVoiceProcessing(bool enable) {
@@ -600,6 +639,9 @@
if (!audio_processor_initialized_) {
audio_processor_->Initialize(codec_, OPUS_FRAME_DURATION_MS, models_list_);
audio_processor_initialized_ = true;
+ } else if (!audio_processor_->EnsureRuntime()) {
+ ESP_LOGE(TAG, "Failed to restore voice processor runtime");
+ return;
}
/* We should make sure no audio is playing */
@@ -613,8 +655,8 @@
esp_ae_rate_cvt_reset(input_resampler_);
}
}
- audio_processor_->Start();
xEventGroupSetBits(event_group_, AS_EVENT_AUDIO_PROCESSOR_RUNNING);
+ // fetch 绛� input warmup 鍚庡啀 Start锛岄伩鍏嶅垰杩涜亞鍚氨 AFE empty / Error -1
} else {
audio_processor_->Stop();
xEventGroupClearBits(event_group_, AS_EVENT_AUDIO_PROCESSOR_RUNNING);
--
Gitblit v1.9.1