mirror of
https://github.com/78/xiaozhi-esp32.git
synced 2026-07-20 09:45:55 +00:00
feat: enhance BoxAudioCodec with input gain and reference channel support
- Updated BoxAudioCodec constructor to include parameters for input gain, reference gain channel, and reference gain. - Modified EnableInput method to set gain for the reference channel if applicable. - Adjusted CustomAudioCodec initialization to utilize new gain parameters for improved audio processing.
This commit is contained in:
@@ -7,14 +7,18 @@
|
||||
#define TAG "BoxAudioCodec"
|
||||
|
||||
BoxAudioCodec::BoxAudioCodec(void* i2c_master_handle, int input_sample_rate, int output_sample_rate,
|
||||
gpio_num_t mclk, gpio_num_t bclk, gpio_num_t ws, gpio_num_t dout, gpio_num_t din,
|
||||
gpio_num_t pa_pin, uint8_t es8311_addr, uint8_t es7210_addr, bool input_reference) {
|
||||
duplex_ = true; // 是否双工
|
||||
input_reference_ = input_reference; // 是否使用参考输入,实现回声消除
|
||||
input_channels_ = input_reference_ ? 2 : 1; // 输入通道数
|
||||
gpio_num_t mclk, gpio_num_t bclk, gpio_num_t ws, gpio_num_t dout,
|
||||
gpio_num_t din, gpio_num_t pa_pin, uint8_t es8311_addr,
|
||||
uint8_t es7210_addr, bool input_reference, float input_gain,
|
||||
int reference_gain_channel, float reference_gain) {
|
||||
duplex_ = true; // 是否双工
|
||||
input_reference_ = input_reference; // 是否使用参考输入,实现回声消除
|
||||
input_channels_ = input_reference_ ? 2 : 1; // 输入通道数
|
||||
input_sample_rate_ = input_sample_rate;
|
||||
output_sample_rate_ = output_sample_rate;
|
||||
input_gain_ = 30;
|
||||
input_gain_ = input_gain;
|
||||
reference_gain_channel_ = reference_gain_channel;
|
||||
reference_gain_ = reference_gain;
|
||||
|
||||
CreateDuplexChannels(mclk, bclk, ws, dout, din);
|
||||
|
||||
@@ -203,7 +207,15 @@ void BoxAudioCodec::EnableInput(bool enable) {
|
||||
fs.channel_mask |= ESP_CODEC_DEV_MAKE_CHANNEL_MASK(1);
|
||||
}
|
||||
ESP_ERROR_CHECK(esp_codec_dev_open(input_dev_, &fs));
|
||||
ESP_ERROR_CHECK(esp_codec_dev_set_in_channel_gain(input_dev_, ESP_CODEC_DEV_MAKE_CHANNEL_MASK(0), input_gain_));
|
||||
ESP_ERROR_CHECK(esp_codec_dev_set_in_channel_gain(
|
||||
input_dev_, ESP_CODEC_DEV_MAKE_CHANNEL_MASK(0), input_gain_));
|
||||
if (input_reference_ && reference_gain_channel_ >= 0) {
|
||||
// ES7210 gain masks use physical MIC numbering, which differs
|
||||
// from the TDM slot order (MIC1, MIC3, MIC2, MIC4).
|
||||
ESP_ERROR_CHECK(esp_codec_dev_set_in_channel_gain(
|
||||
input_dev_, ESP_CODEC_DEV_MAKE_CHANNEL_MASK(reference_gain_channel_),
|
||||
reference_gain_));
|
||||
}
|
||||
} else {
|
||||
ESP_ERROR_CHECK(esp_codec_dev_close(input_dev_));
|
||||
}
|
||||
@@ -244,4 +256,4 @@ int BoxAudioCodec::Write(const int16_t* data, int samples) {
|
||||
ESP_ERROR_CHECK_WITHOUT_ABORT(esp_codec_dev_write(output_dev_, (void*)data, samples * sizeof(int16_t)));
|
||||
}
|
||||
return samples;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,16 +20,21 @@ private:
|
||||
esp_codec_dev_handle_t output_dev_ = nullptr;
|
||||
esp_codec_dev_handle_t input_dev_ = nullptr;
|
||||
std::mutex data_if_mutex_;
|
||||
int reference_gain_channel_ = -1;
|
||||
float reference_gain_ = 0.0f;
|
||||
|
||||
void CreateDuplexChannels(gpio_num_t mclk, gpio_num_t bclk, gpio_num_t ws, gpio_num_t dout, gpio_num_t din);
|
||||
void CreateDuplexChannels(gpio_num_t mclk, gpio_num_t bclk, gpio_num_t ws, gpio_num_t dout,
|
||||
gpio_num_t din);
|
||||
|
||||
virtual int Read(int16_t* dest, int samples) override;
|
||||
virtual int Write(const int16_t* data, int samples) override;
|
||||
|
||||
public:
|
||||
BoxAudioCodec(void* i2c_master_handle, int input_sample_rate, int output_sample_rate,
|
||||
gpio_num_t mclk, gpio_num_t bclk, gpio_num_t ws, gpio_num_t dout, gpio_num_t din,
|
||||
gpio_num_t pa_pin, uint8_t es8311_addr, uint8_t es7210_addr, bool input_reference);
|
||||
gpio_num_t mclk, gpio_num_t bclk, gpio_num_t ws, gpio_num_t dout, gpio_num_t din,
|
||||
gpio_num_t pa_pin, uint8_t es8311_addr, uint8_t es7210_addr, bool input_reference,
|
||||
float input_gain = 30.0f, int reference_gain_channel = -1,
|
||||
float reference_gain = 0.0f);
|
||||
virtual ~BoxAudioCodec();
|
||||
|
||||
virtual void SetOutputVolume(int volume) override;
|
||||
|
||||
@@ -126,14 +126,14 @@ bool AfeAudioEngine::Initialize(AudioCodec* codec, int frame_duration_ms, srmode
|
||||
? nullptr
|
||||
: esp_srmodel_filter(models_, ESP_VADN_PREFIX, nullptr);
|
||||
afe_config_t* afe_config = afe_config_init(
|
||||
input_format.c_str(), models_, AFE_TYPE_FD, AFE_MODE_LOW_COST);
|
||||
input_format.c_str(), models_, AFE_TYPE_VC, AFE_MODE_HIGH_PERF);
|
||||
if (afe_config == nullptr) {
|
||||
ESP_LOGE(TAG, "Failed to create AFE configuration");
|
||||
return false;
|
||||
}
|
||||
|
||||
afe_config->aec_init = codec_->input_reference();
|
||||
afe_config->aec_mode = AEC_MODE_FD_LOW_COST;
|
||||
afe_config->aec_mode = AEC_MODE_VOIP_HIGH_PERF;
|
||||
afe_config->aec_nlp_level = AEC_NLP_LEVEL_VERYAGGR;
|
||||
afe_config->ns_init = false;
|
||||
afe_config->vad_init = kUseAfeForVoiceProcessing;
|
||||
|
||||
@@ -39,21 +39,15 @@ private:
|
||||
Pca9557* pca9557_;
|
||||
|
||||
public:
|
||||
CustomAudioCodec(i2c_master_bus_handle_t i2c_bus, Pca9557* pca9557)
|
||||
: BoxAudioCodec(i2c_bus,
|
||||
AUDIO_INPUT_SAMPLE_RATE,
|
||||
AUDIO_OUTPUT_SAMPLE_RATE,
|
||||
AUDIO_I2S_GPIO_MCLK,
|
||||
AUDIO_I2S_GPIO_BCLK,
|
||||
AUDIO_I2S_GPIO_WS,
|
||||
AUDIO_I2S_GPIO_DOUT,
|
||||
AUDIO_I2S_GPIO_DIN,
|
||||
GPIO_NUM_NC,
|
||||
AUDIO_CODEC_ES8311_ADDR,
|
||||
AUDIO_CODEC_ES7210_ADDR,
|
||||
AUDIO_INPUT_REFERENCE),
|
||||
pca9557_(pca9557) {
|
||||
}
|
||||
CustomAudioCodec(i2c_master_bus_handle_t i2c_bus, Pca9557* pca9557)
|
||||
: BoxAudioCodec(i2c_bus, AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE,
|
||||
AUDIO_I2S_GPIO_MCLK, AUDIO_I2S_GPIO_BCLK, AUDIO_I2S_GPIO_WS,
|
||||
AUDIO_I2S_GPIO_DOUT, AUDIO_I2S_GPIO_DIN, GPIO_NUM_NC,
|
||||
AUDIO_CODEC_ES8311_ADDR, AUDIO_CODEC_ES7210_ADDR, AUDIO_INPUT_REFERENCE,
|
||||
28.0f, // Physical MIC1 gain
|
||||
2, // Physical MIC3 is the playback reference input
|
||||
0.0f),
|
||||
pca9557_(pca9557) {}
|
||||
|
||||
virtual void EnableOutput(bool enable) override {
|
||||
BoxAudioCodec::EnableOutput(enable);
|
||||
|
||||
Reference in New Issue
Block a user