Add private voice detection instance to replace public voice detector
This adds a second (!) VoiceDetection instance in APM, activated via webrtc::AudioProcessing::Config and which reports its values in the webrtc::AudioProcessingStats struct.
The alternative is to reuse the existing instance, but that would require adding a proxy interface returned by AudioProcessing::voice_detection() to update the internal config of AudioProcessingImpl when calling voice_detection()->Enable().
Complexity-wise, no reasonable client will enable both interfaces simultaneously, so the footprint is negligible.
Bug: webrtc:9947
Change-Id: I7d8e28b9bf06abab8f9c6822424bdb9d803b987d
Reviewed-on: https://webrtc-review.googlesource.com/c/115243
Commit-Queue: Sam Zackrisson <saza@webrtc.org>
Reviewed-by: Ivo Creusen <ivoc@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#26101}
diff --git a/modules/audio_processing/audio_processing_unittest.cc b/modules/audio_processing/audio_processing_unittest.cc
index d01333a..5bd2fae 100644
--- a/modules/audio_processing/audio_processing_unittest.cc
+++ b/modules/audio_processing/audio_processing_unittest.cc
@@ -2696,7 +2696,7 @@
// Set up an audioframe.
AudioFrame frame;
frame.num_channels_ = 1;
- SetFrameSampleRate(&frame, AudioProcessing::NativeRate::kSampleRate48kHz);
+ SetFrameSampleRate(&frame, AudioProcessing::NativeRate::kSampleRate32kHz);
// Fill the audio frame with a sawtooth pattern.
int16_t* ptr = frame.mutable_data();
@@ -2755,7 +2755,7 @@
// Set up an audioframe.
AudioFrame frame;
frame.num_channels_ = 1;
- SetFrameSampleRate(&frame, AudioProcessing::NativeRate::kSampleRate48kHz);
+ SetFrameSampleRate(&frame, AudioProcessing::NativeRate::kSampleRate32kHz);
// Fill the audio frame with a sawtooth pattern.
int16_t* ptr = frame.mutable_data();
@@ -2809,7 +2809,7 @@
// Set up an audioframe.
AudioFrame frame;
frame.num_channels_ = 1;
- SetFrameSampleRate(&frame, AudioProcessing::NativeRate::kSampleRate48kHz);
+ SetFrameSampleRate(&frame, AudioProcessing::NativeRate::kSampleRate32kHz);
// Fill the audio frame with a sawtooth pattern.
int16_t* ptr = frame.mutable_data();
@@ -2838,4 +2838,41 @@
EXPECT_EQ(apm->ProcessStream(&frame), 0);
EXPECT_FALSE(apm->GetStatistics(false).output_rms_dbfs);
}
+
+TEST(ApmStatistics, ReportHasVoice) {
+ ProcessingConfig processing_config = {
+ {{32000, 1}, {32000, 1}, {32000, 1}, {32000, 1}}};
+ AudioProcessing::Config config;
+
+ // Set up an audioframe.
+ AudioFrame frame;
+ frame.num_channels_ = 1;
+ SetFrameSampleRate(&frame, AudioProcessing::NativeRate::kSampleRate32kHz);
+
+ // Fill the audio frame with a sawtooth pattern.
+ int16_t* ptr = frame.mutable_data();
+ for (size_t i = 0; i < frame.kMaxDataSizeSamples; i++) {
+ ptr[i] = 10000 * ((i % 3) - 1);
+ }
+
+ std::unique_ptr<AudioProcessing> apm(AudioProcessingBuilder().Create());
+ apm->Initialize(processing_config);
+
+ // If not enabled, no metric should be reported.
+ EXPECT_EQ(apm->ProcessStream(&frame), 0);
+ EXPECT_FALSE(apm->GetStatistics(false).voice_detected);
+
+ // If enabled, metrics should be reported.
+ config.voice_detection.enabled = true;
+ apm->ApplyConfig(config);
+ EXPECT_EQ(apm->ProcessStream(&frame), 0);
+ auto stats = apm->GetStatistics(false);
+ EXPECT_TRUE(stats.voice_detected);
+
+ // If re-disabled, the value is again not reported.
+ config.voice_detection.enabled = false;
+ apm->ApplyConfig(config);
+ EXPECT_EQ(apm->ProcessStream(&frame), 0);
+ EXPECT_FALSE(apm->GetStatistics(false).voice_detected);
+}
} // namespace webrtc