98 lines
3.9 KiB
Python
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())
|