[voice_assistant] Write less data to speaker each loop (#6877)

This commit is contained in:
Jesse Hills 2024-06-10 15:22:55 +12:00 committed by GitHub
parent 6de79d6cfb
commit dceab6ce29
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -428,14 +428,15 @@ void VoiceAssistant::loop() {
#ifdef USE_SPEAKER #ifdef USE_SPEAKER
void VoiceAssistant::write_speaker_() { void VoiceAssistant::write_speaker_() {
if (this->speaker_buffer_size_ > 0) { if (this->speaker_buffer_size_ > 0) {
size_t written = this->speaker_->play(this->speaker_buffer_, this->speaker_buffer_size_); size_t write_chunk = std::min<size_t>(this->speaker_buffer_size_, 4 * 1024);
size_t written = this->speaker_->play(this->speaker_buffer_, write_chunk);
if (written > 0) { if (written > 0) {
memmove(this->speaker_buffer_, this->speaker_buffer_ + written, this->speaker_buffer_size_ - written); memmove(this->speaker_buffer_, this->speaker_buffer_ + written, this->speaker_buffer_size_ - written);
this->speaker_buffer_size_ -= written; this->speaker_buffer_size_ -= written;
this->speaker_buffer_index_ -= written; this->speaker_buffer_index_ -= written;
this->set_timeout("speaker-timeout", 5000, [this]() { this->speaker_->stop(); }); this->set_timeout("speaker-timeout", 5000, [this]() { this->speaker_->stop(); });
} else { } else {
ESP_LOGD(TAG, "Speaker buffer full, trying again next loop"); ESP_LOGV(TAG, "Speaker buffer full, trying again next loop");
} }
} }
} }
@ -798,7 +799,7 @@ void VoiceAssistant::on_audio(const api::VoiceAssistantAudio &msg) {
this->speaker_buffer_index_ += msg.data.length(); this->speaker_buffer_index_ += msg.data.length();
this->speaker_buffer_size_ += msg.data.length(); this->speaker_buffer_size_ += msg.data.length();
this->speaker_bytes_received_ += msg.data.length(); this->speaker_bytes_received_ += msg.data.length();
ESP_LOGD(TAG, "Received audio: %d bytes from API", msg.data.length()); ESP_LOGV(TAG, "Received audio: %" PRId32 " bytes from API", msg.data.length());
} else { } else {
ESP_LOGE(TAG, "Cannot receive audio, buffer is full"); ESP_LOGE(TAG, "Cannot receive audio, buffer is full");
} }