speech_probability_buffer_unittest.cc (8289B)
1 /* 2 * Copyright (c) 2022 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include "modules/audio_processing/agc2/speech_probability_buffer.h" 12 13 #include "test/gtest.h" 14 15 namespace webrtc { 16 namespace { 17 18 constexpr float kAbsError = 0.001f; 19 constexpr float kActivityThreshold = 0.9f; 20 constexpr float kLowProbabilityThreshold = 0.2f; 21 constexpr int kNumAnalysisFrames = 100; 22 23 } // namespace 24 25 TEST(SpeechProbabilityBufferTest, CheckSumAfterInitialization) { 26 SpeechProbabilityBuffer buffer(kLowProbabilityThreshold); 27 28 EXPECT_EQ(buffer.GetSumProbabilities(), 0.0f); 29 } 30 31 TEST(SpeechProbabilityBufferTest, CheckSumAfterUpdate) { 32 SpeechProbabilityBuffer buffer(kLowProbabilityThreshold); 33 34 buffer.Update(0.7f); 35 36 EXPECT_NEAR(buffer.GetSumProbabilities(), 0.7f, kAbsError); 37 38 buffer.Update(0.6f); 39 40 EXPECT_NEAR(buffer.GetSumProbabilities(), 1.3f, kAbsError); 41 42 for (int i = 0; i < kNumAnalysisFrames - 1; ++i) { 43 buffer.Update(1.0f); 44 } 45 46 EXPECT_NEAR(buffer.GetSumProbabilities(), 99.6f, kAbsError); 47 } 48 49 TEST(SpeechProbabilityBufferTest, CheckSumAfterReset) { 50 SpeechProbabilityBuffer buffer(kLowProbabilityThreshold); 51 52 buffer.Update(0.7f); 53 buffer.Update(0.6f); 54 buffer.Update(0.3f); 55 56 EXPECT_GT(buffer.GetSumProbabilities(), 0.0f); 57 58 buffer.Reset(); 59 60 EXPECT_EQ(buffer.GetSumProbabilities(), 0.0f); 61 } 62 63 TEST(SpeechProbabilityBufferTest, CheckSumAfterTransientNotRemoved) { 64 SpeechProbabilityBuffer buffer(kLowProbabilityThreshold); 65 66 buffer.Update(1.0f); 67 buffer.Update(1.0f); 68 buffer.Update(1.0f); 69 buffer.Update(1.0f); 70 buffer.Update(1.0f); 71 buffer.Update(1.0f); 72 buffer.Update(1.0f); 73 buffer.Update(1.0f); 74 buffer.Update(1.0f); 75 76 buffer.Update(0.0f); 77 78 EXPECT_NEAR(buffer.GetSumProbabilities(), 9.0f, kAbsError); 79 80 buffer.Update(0.0f); 81 82 EXPECT_NEAR(buffer.GetSumProbabilities(), 9.0f, kAbsError); 83 } 84 85 TEST(SpeechProbabilityBufferTest, CheckSumAfterTransientRemoved) { 86 SpeechProbabilityBuffer buffer(kLowProbabilityThreshold); 87 88 buffer.Update(0.0f); 89 buffer.Update(0.0f); 90 buffer.Update(0.0f); 91 buffer.Update(0.0f); 92 buffer.Update(0.0f); 93 buffer.Update(0.0f); 94 buffer.Update(1.0f); 95 buffer.Update(1.0f); 96 buffer.Update(1.0f); 97 98 EXPECT_NEAR(buffer.GetSumProbabilities(), 3.0f, kAbsError); 99 100 buffer.Update(0.0f); 101 102 EXPECT_NEAR(buffer.GetSumProbabilities(), 0.0f, kAbsError); 103 } 104 105 TEST(SpeechProbabilityBufferTest, CheckSegmentIsNotActiveAfterNoUpdates) { 106 SpeechProbabilityBuffer buffer(kLowProbabilityThreshold); 107 108 EXPECT_FALSE(buffer.IsActiveSegment()); 109 } 110 111 TEST(SpeechProbabilityBufferTest, CheckSegmentIsActiveChangesFromFalseToTrue) { 112 SpeechProbabilityBuffer buffer(kLowProbabilityThreshold); 113 114 // Add low probabilities until the buffer is full. That's not enough 115 // to make `IsActiveSegment()` to return true. 116 for (int i = 0; i < kNumAnalysisFrames; ++i) { 117 buffer.Update(0.0f); 118 } 119 120 EXPECT_FALSE(buffer.IsActiveSegment()); 121 122 // Add high probabilities until `IsActiveSegment()` returns true. 123 for (int i = 0; i < kActivityThreshold * kNumAnalysisFrames - 1; ++i) { 124 buffer.Update(1.0f); 125 } 126 127 EXPECT_FALSE(buffer.IsActiveSegment()); 128 129 buffer.Update(1.0f); 130 131 EXPECT_TRUE(buffer.IsActiveSegment()); 132 } 133 134 TEST(SpeechProbabilityBufferTest, CheckSegmentIsActiveChangesFromTrueToFalse) { 135 SpeechProbabilityBuffer buffer(kLowProbabilityThreshold); 136 137 // Add high probabilities until the buffer is full. That's enough to 138 // make `IsActiveSegment()` to return true. 139 for (int i = 0; i < kNumAnalysisFrames; ++i) { 140 buffer.Update(1.0f); 141 } 142 143 EXPECT_TRUE(buffer.IsActiveSegment()); 144 145 // Add low probabilities until `IsActiveSegment()` returns false. 146 for (int i = 0; i < (1.0f - kActivityThreshold) * kNumAnalysisFrames - 1; 147 ++i) { 148 buffer.Update(0.0f); 149 } 150 151 EXPECT_TRUE(buffer.IsActiveSegment()); 152 153 buffer.Update(1.0f); 154 155 EXPECT_TRUE(buffer.IsActiveSegment()); 156 } 157 158 TEST(SpeechProbabilityBufferTest, 159 CheckSegmentIsActiveAfterUpdatesWithHighProbabilities) { 160 SpeechProbabilityBuffer buffer(kLowProbabilityThreshold); 161 162 for (int i = 0; i < kNumAnalysisFrames - 1; ++i) { 163 buffer.Update(1.0f); 164 } 165 166 EXPECT_FALSE(buffer.IsActiveSegment()); 167 168 buffer.Update(1.0f); 169 170 EXPECT_TRUE(buffer.IsActiveSegment()); 171 } 172 173 TEST(SpeechProbabilityBufferTest, 174 CheckSegmentIsNotActiveAfterUpdatesWithLowProbabilities) { 175 SpeechProbabilityBuffer buffer(kLowProbabilityThreshold); 176 177 for (int i = 0; i < kNumAnalysisFrames - 1; ++i) { 178 buffer.Update(0.3f); 179 } 180 181 EXPECT_FALSE(buffer.IsActiveSegment()); 182 183 buffer.Update(0.3f); 184 185 EXPECT_FALSE(buffer.IsActiveSegment()); 186 } 187 188 TEST(SpeechProbabilityBufferTest, CheckSegmentIsActiveAfterBufferIsFull) { 189 SpeechProbabilityBuffer buffer(kLowProbabilityThreshold); 190 191 for (int i = 0; i < kNumAnalysisFrames - 1; ++i) { 192 buffer.Update(1.0f); 193 } 194 195 EXPECT_FALSE(buffer.IsActiveSegment()); 196 197 buffer.Update(1.0f); 198 199 EXPECT_TRUE(buffer.IsActiveSegment()); 200 201 buffer.Update(1.0f); 202 203 EXPECT_TRUE(buffer.IsActiveSegment()); 204 } 205 206 TEST(SpeechProbabilityBufferTest, CheckSegmentIsNotActiveAfterBufferIsFull) { 207 SpeechProbabilityBuffer buffer(kLowProbabilityThreshold); 208 209 for (int i = 0; i < kNumAnalysisFrames - 1; ++i) { 210 buffer.Update(0.29f); 211 } 212 213 EXPECT_FALSE(buffer.IsActiveSegment()); 214 215 buffer.Update(0.29f); 216 217 EXPECT_FALSE(buffer.IsActiveSegment()); 218 219 buffer.Update(0.29f); 220 221 EXPECT_FALSE(buffer.IsActiveSegment()); 222 } 223 224 TEST(SpeechProbabilityBufferTest, CheckSegmentIsNotActiveAfterReset) { 225 SpeechProbabilityBuffer buffer(kLowProbabilityThreshold); 226 227 for (int i = 0; i < kNumAnalysisFrames; ++i) { 228 buffer.Update(1.0f); 229 } 230 231 EXPECT_TRUE(buffer.IsActiveSegment()); 232 233 buffer.Reset(); 234 235 EXPECT_FALSE(buffer.IsActiveSegment()); 236 } 237 238 TEST(SpeechProbabilityBufferTest, 239 CheckSegmentIsNotActiveAfterTransientRemovedAfterFewUpdates) { 240 SpeechProbabilityBuffer buffer(kLowProbabilityThreshold); 241 242 buffer.Update(0.4f); 243 buffer.Update(0.4f); 244 buffer.Update(0.0f); 245 246 EXPECT_FALSE(buffer.IsActiveSegment()); 247 } 248 249 TEST(SpeechProbabilityBufferTest, 250 CheckSegmentIsActiveAfterTransientNotRemoved) { 251 SpeechProbabilityBuffer buffer(kLowProbabilityThreshold); 252 253 for (int i = 0; i < kNumAnalysisFrames; ++i) { 254 buffer.Update(1.0f); 255 } 256 257 buffer.Update(0.7f); 258 buffer.Update(0.8f); 259 buffer.Update(0.9f); 260 buffer.Update(1.0f); 261 262 EXPECT_TRUE(buffer.IsActiveSegment()); 263 264 buffer.Update(0.0f); 265 266 EXPECT_TRUE(buffer.IsActiveSegment()); 267 268 buffer.Update(0.7f); 269 270 EXPECT_TRUE(buffer.IsActiveSegment()); 271 } 272 273 TEST(SpeechProbabilityBufferTest, 274 CheckSegmentIsNotActiveAfterTransientNotRemoved) { 275 SpeechProbabilityBuffer buffer(kLowProbabilityThreshold); 276 277 for (int i = 0; i < kNumAnalysisFrames; ++i) { 278 buffer.Update(0.1f); 279 } 280 281 buffer.Update(0.7f); 282 buffer.Update(0.8f); 283 buffer.Update(0.9f); 284 buffer.Update(1.0f); 285 286 EXPECT_FALSE(buffer.IsActiveSegment()); 287 288 buffer.Update(0.0f); 289 290 EXPECT_FALSE(buffer.IsActiveSegment()); 291 292 buffer.Update(0.7f); 293 294 EXPECT_FALSE(buffer.IsActiveSegment()); 295 } 296 297 TEST(SpeechProbabilityBufferTest, 298 CheckSegmentIsNotActiveAfterTransientRemoved) { 299 SpeechProbabilityBuffer buffer(kLowProbabilityThreshold); 300 301 for (int i = 0; i < kNumAnalysisFrames; ++i) { 302 buffer.Update(0.1f); 303 } 304 305 buffer.Update(0.7f); 306 buffer.Update(0.8f); 307 buffer.Update(0.9f); 308 buffer.Update(1.0f); 309 310 EXPECT_FALSE(buffer.IsActiveSegment()); 311 312 buffer.Update(0.0f); 313 314 EXPECT_FALSE(buffer.IsActiveSegment()); 315 316 buffer.Update(0.7f); 317 318 EXPECT_FALSE(buffer.IsActiveSegment()); 319 } 320 321 TEST(SpeechProbabilityBufferTest, CheckSegmentIsActiveAfterTransientRemoved) { 322 SpeechProbabilityBuffer buffer(kLowProbabilityThreshold); 323 324 for (int i = 0; i < kNumAnalysisFrames; ++i) { 325 buffer.Update(1.0f); 326 } 327 328 buffer.Update(0.7f); 329 buffer.Update(0.8f); 330 buffer.Update(0.9f); 331 buffer.Update(1.0f); 332 333 EXPECT_TRUE(buffer.IsActiveSegment()); 334 335 buffer.Update(0.0f); 336 337 EXPECT_TRUE(buffer.IsActiveSegment()); 338 339 buffer.Update(0.7f); 340 341 EXPECT_TRUE(buffer.IsActiveSegment()); 342 } 343 344 } // namespace webrtc