| Index: webrtc/modules/audio_processing/test/py_quality_assessment/quality_assessment/simulation.py
|
| diff --git a/webrtc/modules/audio_processing/test/py_quality_assessment/quality_assessment/simulation.py b/webrtc/modules/audio_processing/test/py_quality_assessment/quality_assessment/simulation.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0132c751c36691722284c5709fdaabc14a49bd3d
|
| --- /dev/null
|
| +++ b/webrtc/modules/audio_processing/test/py_quality_assessment/quality_assessment/simulation.py
|
| @@ -0,0 +1,115 @@
|
| +# Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
|
| +#
|
| +# Use of this source code is governed by a BSD-style license
|
| +# that can be found in the LICENSE file in the root of the source
|
| +# tree. An additional intellectual property rights grant can be found
|
| +# in the file PATENTS. All contributing project authors may
|
| +# be found in the AUTHORS file in the root of the source tree.
|
| +
|
| +import logging
|
| +import os
|
| +
|
| +from . import data_access
|
| +from . import eval_scores
|
| +from . import noise_generation
|
| +
|
| +class ApmModuleSimulator(object):
|
| +
|
| + _NOISE_GENERATOR_CLASSES = noise_generation.NoiseGenerator.REGISTERED_CLASSES
|
| + _EVAL_SCORE_WORKER_CLASSES = eval_scores.EvaluationScore.REGISTERED_CLASSES
|
| +
|
| + def __init__(self):
|
| + # TODO(alessio): instance when implementation is ready.
|
| + self._audioproc_wrapper = None
|
| + self._evaluator = None
|
| +
|
| + self._base_output_path = None
|
| + self._noise_generators = None
|
| + self._evaluation_score_workers = None
|
| + self._config_filepaths = None
|
| + self._input_filepaths = None
|
| +
|
| + def run(self, config_filepaths, input_filepaths, noise_generator_names,
|
| + eval_score_names, output_dir):
|
| + """
|
| + Initializes paths and required instances, then runs all the simulations.
|
| + """
|
| + self._base_output_path = os.path.abspath(output_dir)
|
| +
|
| + # Instance noise generators.
|
| + self._noise_generators = [
|
| + self._NOISE_GENERATOR_CLASSES[name]() for name in noise_generator_names]
|
| +
|
| + # Instance evaluation score workers.
|
| + self._evaluation_score_workers = [
|
| + self._EVAL_SCORE_WORKER_CLASSES[name]() for name in eval_score_names]
|
| +
|
| + # Set APM configuration file paths.
|
| + self._config_filepaths = self._get_paths_collection(config_filepaths)
|
| +
|
| + # Set probing signal file paths.
|
| + self._input_filepaths = self._get_paths_collection(input_filepaths)
|
| +
|
| + self._simulate_all()
|
| +
|
| + def _simulate_all(self):
|
| + """
|
| + Iterates over the combinations of APM configurations, probing signals, and
|
| + noise generators.
|
| + """
|
| + # Try different APM config files.
|
| + for config_name in self._config_filepaths:
|
| + config_filepath = self._config_filepaths[config_name]
|
| +
|
| + # Try different probing signal files.
|
| + for input_name in self._input_filepaths:
|
| + input_filepath = self._input_filepaths[input_name]
|
| +
|
| + # Try different noise generators.
|
| + for noise_generator in self._noise_generators:
|
| + logging.info('config: <%s>, input: <%s>, noise: <%s>',
|
| + config_name, input_name, noise_generator.NAME)
|
| +
|
| + # Output path for the input-noise pairs. It is used to cache the noisy
|
| + # copies of the probing signals (shared across some simulations).
|
| + input_noise_cache_path = os.path.join(
|
| + self._base_output_path,
|
| + '_cache',
|
| + 'input_{}-noise_{}'.format(input_name, noise_generator.NAME))
|
| + data_access.make_directory(input_noise_cache_path)
|
| + logging.debug('input-noise cache path: <%s>', input_noise_cache_path)
|
| +
|
| + # Full output path.
|
| + output_path = os.path.join(
|
| + self._base_output_path,
|
| + 'cfg-{}'.format(config_name),
|
| + 'input-{}'.format(input_name),
|
| + 'noise-{}'.format(noise_generator.NAME))
|
| + data_access.make_directory(output_path)
|
| + logging.debug('output path: <%s>', output_path)
|
| +
|
| + self._simulate(noise_generator, input_filepath,
|
| + input_noise_cache_path, output_path, config_filepath)
|
| +
|
| + def _simulate(self, noise_generator, input_filepath, input_noise_cache_path,
|
| + output_path, config_filepath):
|
| + """
|
| + Simulates a given combination of APM configurations, probing signals, and
|
| + noise generators. It iterates over the noise generator internal
|
| + configurations.
|
| + """
|
| + # TODO(alessio): implement.
|
| + pass
|
| +
|
| + @classmethod
|
| + def _get_paths_collection(cls, filepaths):
|
| + """
|
| + Given a list of file paths, makes a collection with one pair for each item
|
| + in the list where the key is the file name without extension and the value
|
| + is the path.
|
| + """
|
| + filepaths_collection = {}
|
| + for filepath in filepaths:
|
| + name = os.path.splitext(os.path.split(filepath)[1])[0]
|
| + filepaths_collection[name] = os.path.abspath(filepath)
|
| + return filepaths_collection
|
|
|