mycroft-core/test/unittests/client/test_noise_tracker.py

98 lines
3.9 KiB
Python

# Copyright 2020 Mycroft AI Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
from unittest import TestCase
from mycroft.client.speech.mic import NoiseTracker
LOUD_TIME_LIMIT = 2.0 # Must be loud for 2 seconds
SILENCE_TIME_LIMIT = 5.0 # Time out after 5 seconds of silence
SECS_PER_BUFFER = 0.5
MIN_NOISE = 0
MAX_NOISE = 25
class TestNoiseTracker(TestCase):
def test_no_loud_data(self):
"""Check that no loud data generates complete after silence timeout."""
noise_tracker = NoiseTracker(MIN_NOISE, MAX_NOISE, SECS_PER_BUFFER,
LOUD_TIME_LIMIT, SILENCE_TIME_LIMIT)
num_updates_timeout = int(SILENCE_TIME_LIMIT / SECS_PER_BUFFER)
num_low_updates = int(LOUD_TIME_LIMIT / SECS_PER_BUFFER)
for _ in range(num_low_updates):
noise_tracker.update(False)
self.assertFalse(noise_tracker.recording_complete())
remaining_until_low_timeout = num_updates_timeout - num_low_updates
for _ in range(remaining_until_low_timeout):
noise_tracker.update(False)
self.assertFalse(noise_tracker.recording_complete())
noise_tracker.update(False)
self.assertTrue(noise_tracker.recording_complete())
def test_silence_reset(self):
"""Check that no loud data generates complete after silence timeout."""
noise_tracker = NoiseTracker(MIN_NOISE, MAX_NOISE, SECS_PER_BUFFER,
LOUD_TIME_LIMIT, SILENCE_TIME_LIMIT)
num_updates_timeout = int(SILENCE_TIME_LIMIT / SECS_PER_BUFFER)
num_low_updates = int(LOUD_TIME_LIMIT / SECS_PER_BUFFER)
for _ in range(num_low_updates):
noise_tracker.update(False)
# Insert a is_loud=True shall reset the silence tracker
noise_tracker.update(True)
remaining_until_low_timeout = num_updates_timeout - num_low_updates
# Extra is needed for the noise to be reduced down to quiet level
for _ in range(remaining_until_low_timeout + 1):
noise_tracker.update(False)
self.assertFalse(noise_tracker.recording_complete())
# Adding low noise samples to complete the timeout
for _ in range(num_low_updates + 1):
noise_tracker.update(False)
self.assertTrue(noise_tracker.recording_complete())
def test_all_loud_data(self):
"""Check that only loud samples doesn't generate a complete recording.
"""
noise_tracker = NoiseTracker(MIN_NOISE, MAX_NOISE, SECS_PER_BUFFER,
LOUD_TIME_LIMIT, SILENCE_TIME_LIMIT)
num_high_updates = int(LOUD_TIME_LIMIT / SECS_PER_BUFFER) + 1
for _ in range(num_high_updates):
noise_tracker.update(True)
self.assertFalse(noise_tracker.recording_complete())
def test_all_loud_followed_by_silence(self):
"""Check that a long enough high sentence is completed after silence.
"""
noise_tracker = NoiseTracker(MIN_NOISE, MAX_NOISE, SECS_PER_BUFFER,
LOUD_TIME_LIMIT, SILENCE_TIME_LIMIT)
num_high_updates = int(LOUD_TIME_LIMIT / SECS_PER_BUFFER) + 1
for _ in range(num_high_updates):
noise_tracker.update(True)
self.assertFalse(noise_tracker.recording_complete())
while not noise_tracker._quiet_enough():
noise_tracker.update(False)
self.assertTrue(noise_tracker.recording_complete())