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}
This commit is contained in:
committed by
Commit Bot
parent
d0fce0b1ec
commit
4db667be74
@ -2696,7 +2696,7 @@ TEST(MAYBE_ApmStatistics, AEC2EnabledTest) {
|
||||
// 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 @@ TEST(MAYBE_ApmStatistics, AECMEnabledTest) {
|
||||
// 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 @@ TEST(ApmStatistics, ReportOutputRmsDbfs) {
|
||||
// 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 @@ TEST(ApmStatistics, ReportOutputRmsDbfs) {
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user