Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(973)

Unified Diff: webrtc/modules/audio_processing/test/py_quality_assessment/quality_assessment/noise_generation.py

Issue 2793903006: Style fix and docstring for the APM QA Python tool (Closed)
Patch Set: _ prefix for internal use functions Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/modules/audio_processing/test/py_quality_assessment/quality_assessment/noise_generation.py
diff --git a/webrtc/modules/audio_processing/test/py_quality_assessment/quality_assessment/noise_generation.py b/webrtc/modules/audio_processing/test/py_quality_assessment/quality_assessment/noise_generation.py
index 9bfce34db25e851770ac2ed6dc5fa589c1cf3eda..090d3506ab8cb78bb319083a90d706fa9469e652 100644
--- a/webrtc/modules/audio_processing/test/py_quality_assessment/quality_assessment/noise_generation.py
+++ b/webrtc/modules/audio_processing/test/py_quality_assessment/quality_assessment/noise_generation.py
@@ -47,23 +47,34 @@ class NoiseGenerator(object):
signal.
A noise generator generates one or more input-reference pairs.
+
+ TODO(alessiob): Rename from NoiseGenerator to InputReferencePairGenerator.
"""
NAME = None
REGISTERED_CLASSES = {}
def __init__(self):
- # Input
+ # Init dictionaries with one entry for each noise generator configuration
+ # (e.g., different SNRs).
+ # Noisy audio track files (stored separately in a cache folder).
self._noisy_signal_filepaths = None
- self._output_paths = None
+ # Path to be used for the APM simulation output files.
+ self._apm_output_paths = None
+ # Reference audio track files (stored separately in a cache folder).
self._reference_signal_filepaths = None
- self.clear()
+ self.Clear()
@classmethod
- def register_class(cls, class_to_register):
- """Register an NoiseGenerator implementation.
+ def RegisterClass(cls, class_to_register):
+ """Registers an NoiseGenerator implementation.
Decorator to automatically register the classes that extend NoiseGenerator.
+ Example usage:
+
+ @NoiseGenerator.RegisterClass
+ class IdentityGenerator(NoiseGenerator):
+ pass
"""
cls.REGISTERED_CLASSES[class_to_register.NAME] = class_to_register
return class_to_register
@@ -77,37 +88,44 @@ class NoiseGenerator(object):
return self._noisy_signal_filepaths
@property
- def output_paths(self):
- return self._output_paths
+ def apm_output_paths(self):
+ return self._apm_output_paths
@property
def reference_signal_filepaths(self):
return self._reference_signal_filepaths
- def generate(
+ def Generate(
self, input_signal_filepath, input_noise_cache_path, base_output_path):
- """Generate a set of noisy input and reference audiotrack file pairs.
+ """Generates a set of noisy input and reference audiotrack file pairs.
- This method initializes an empty set of pairs and calls the _generate()
+ This method initializes an empty set of pairs and calls the _Generate()
method implemented in a concrete class.
+
+ Args:
+ input_signal_filepath: path to the clean input audio track file.
+ input_noise_cache_path: path to the cache of noisy audio track files.
+ base_output_path: base path where output is written.
"""
- self.clear()
- return self._generate(
+ self.Clear()
+ self._Generate(
input_signal_filepath, input_noise_cache_path, base_output_path)
- def clear(self):
+ def Clear(self):
+ """Clears the generated output path dictionaries.
+ """
self._noisy_signal_filepaths = {}
- self._output_paths = {}
+ self._apm_output_paths = {}
self._reference_signal_filepaths = {}
- def _generate(
+ def _Generate(
self, input_signal_filepath, input_noise_cache_path, base_output_path):
- """This is an abstract method to be implemented in each concrete class.
+ """Abstract method to be implemented in each concrete class.
"""
raise NotImplementedError()
- def _add_noise_snr_pairs(self, base_output_path, noisy_mix_filepaths,
- snr_value_pairs):
+ def _AddNoiseSnrPairs(self, base_output_path, noisy_mix_filepaths,
+ snr_value_pairs):
"""Adds noisy-reference signal pairs.
Args:
@@ -120,8 +138,8 @@ class NoiseGenerator(object):
for snr_noisy, snr_refence in snr_value_pairs:
config_name = '{0}_{1:d}_{2:d}_SNR'.format(
noise_track_name, snr_noisy, snr_refence)
- output_path = self._make_dir(base_output_path, config_name)
- self._add_noise_reference_files_pair(
+ output_path = self._MakeDir(base_output_path, config_name)
+ self._AddNoiseReferenceFilesPair(
config_name=config_name,
noisy_signal_filepath=noisy_mix_filepaths[
noise_track_name][snr_noisy],
@@ -129,30 +147,38 @@ class NoiseGenerator(object):
noise_track_name][snr_refence],
output_path=output_path)
- def _add_noise_reference_files_pair(self, config_name, noisy_signal_filepath,
- reference_signal_filepath, output_path):
+ def _AddNoiseReferenceFilesPair(self, config_name, noisy_signal_filepath,
+ reference_signal_filepath, output_path):
+ """Adds one noisy-reference signal pair.
+
+ Args:
+ config_name: name of the APM configuration.
+ noisy_signal_filepath: path to noisy audio track file.
+ reference_signal_filepath: path to reference audio track file.
+ output_path: APM output path.
+ """
assert config_name not in self._noisy_signal_filepaths
self._noisy_signal_filepaths[config_name] = os.path.abspath(
noisy_signal_filepath)
- self._output_paths[config_name] = os.path.abspath(output_path)
+ self._apm_output_paths[config_name] = os.path.abspath(output_path)
self._reference_signal_filepaths[config_name] = os.path.abspath(
reference_signal_filepath)
# Save noisy and reference file paths.
- data_access.Metadata.save_audio_in_ref_paths(
+ data_access.Metadata.SaveAudioInRefPaths(
output_path=output_path,
audio_in_filepath=self._noisy_signal_filepaths[config_name],
audio_ref_filepath=self._reference_signal_filepaths[config_name])
@classmethod
- def _make_dir(cls, base_output_path, noise_generator_config_name):
+ def _MakeDir(cls, base_output_path, noise_generator_config_name):
output_path = os.path.join(base_output_path, noise_generator_config_name)
- data_access.make_directory(output_path)
+ data_access.MakeDirectory(output_path)
return output_path
# Identity generator.
-@NoiseGenerator.register_class
+@NoiseGenerator.RegisterClass
class IdentityGenerator(NoiseGenerator):
"""Generator that adds no noise.
@@ -164,18 +190,18 @@ class IdentityGenerator(NoiseGenerator):
def __init__(self):
NoiseGenerator.__init__(self)
- def _generate(
+ def _Generate(
self, input_signal_filepath, input_noise_cache_path, base_output_path):
CONFIG_NAME = 'default'
- output_path = self._make_dir(base_output_path, CONFIG_NAME)
- self._add_noise_reference_files_pair(
+ output_path = self._MakeDir(base_output_path, CONFIG_NAME)
+ self._AddNoiseReferenceFilesPair(
config_name=CONFIG_NAME,
noisy_signal_filepath=input_signal_filepath,
reference_signal_filepath=input_signal_filepath,
output_path=output_path)
-@NoiseGenerator.register_class
+@NoiseGenerator.RegisterClass
class WhiteNoiseGenerator(NoiseGenerator):
"""Additive white noise generator.
"""
@@ -197,18 +223,18 @@ class WhiteNoiseGenerator(NoiseGenerator):
def __init__(self):
NoiseGenerator.__init__(self)
- def _generate(
+ def _Generate(
self, input_signal_filepath, input_noise_cache_path, base_output_path):
# Load the input signal.
- input_signal = signal_processing.SignalProcessingUtils.load_wav(
+ input_signal = signal_processing.SignalProcessingUtils.LoadWav(
input_signal_filepath)
- input_signal = signal_processing.SignalProcessingUtils.normalize(
+ input_signal = signal_processing.SignalProcessingUtils.Normalize(
input_signal)
# Create the noise track.
- noise_signal = signal_processing.SignalProcessingUtils.generate_white_noise(
+ noise_signal = signal_processing.SignalProcessingUtils.GenerateWhiteNoise(
input_signal)
- noise_signal = signal_processing.SignalProcessingUtils.normalize(
+ noise_signal = signal_processing.SignalProcessingUtils.Normalize(
noise_signal)
# Create the noisy mixes (once for each unique SNR value).
@@ -222,11 +248,11 @@ class WhiteNoiseGenerator(NoiseGenerator):
# Create and save if not done.
if not os.path.exists(noisy_signal_filepath):
# Create noisy signal.
- noisy_signal = signal_processing.SignalProcessingUtils.mix_signals(
+ noisy_signal = signal_processing.SignalProcessingUtils.MixSignals(
input_signal, noise_signal, snr)
# Save.
- signal_processing.SignalProcessingUtils.save_wav(
+ signal_processing.SignalProcessingUtils.SaveWav(
noisy_signal_filepath, noisy_signal)
# Add file to the collection of mixes.
@@ -235,8 +261,8 @@ class WhiteNoiseGenerator(NoiseGenerator):
# Add all the noisy-reference signal pairs.
for snr_noisy, snr_refence in self._SNR_VALUE_PAIRS:
config_name = '{0:d}_{1:d}_SNR'.format(snr_noisy, snr_refence)
- output_path = self._make_dir(base_output_path, config_name)
- self._add_noise_reference_files_pair(
+ output_path = self._MakeDir(base_output_path, config_name)
+ self._AddNoiseReferenceFilesPair(
config_name=config_name,
noisy_signal_filepath=noisy_mix_filepaths[snr_noisy],
reference_signal_filepath=noisy_mix_filepaths[snr_refence],
@@ -244,7 +270,7 @@ class WhiteNoiseGenerator(NoiseGenerator):
# TODO(alessiob): remove comment when class implemented.
-# @NoiseGenerator.register_class
+# @NoiseGenerator.RegisterClass
class NarrowBandNoiseGenerator(NoiseGenerator):
"""Additive narrow-band noise generator.
"""
@@ -254,13 +280,13 @@ class NarrowBandNoiseGenerator(NoiseGenerator):
def __init__(self):
NoiseGenerator.__init__(self)
- def _generate(
+ def _Generate(
self, input_signal_filepath, input_noise_cache_path, base_output_path):
# TODO(alessiob): implement.
pass
-@NoiseGenerator.register_class
+@NoiseGenerator.RegisterClass
class EnvironmentalNoiseGenerator(NoiseGenerator):
"""Additive environmental noise generator.
"""
@@ -290,27 +316,22 @@ class EnvironmentalNoiseGenerator(NoiseGenerator):
def __init__(self):
NoiseGenerator.__init__(self)
- def _generate(
+ def _Generate(
self, input_signal_filepath, input_noise_cache_path, base_output_path):
- """Generate environmental noise.
+ """Generates environmental noise.
- For each noise track and pair of SNR values, the following 2 audio tracks
+ For each noise track and pair of SNR values, the following two audio tracks
are created: the noisy signal and the reference signal. The former is
obtained by mixing the (clean) input signal to the corresponding noise
track enforcing the target SNR.
-
- Args:
- input_signal_filepath: (clean) input signal file path.
- input_noise_cache_path: path for the cached noise track files.
- base_output_path: base output path.
"""
# Init.
snr_values = set([snr for pair in self._SNR_VALUE_PAIRS for snr in pair])
# Load the input signal.
- input_signal = signal_processing.SignalProcessingUtils.load_wav(
+ input_signal = signal_processing.SignalProcessingUtils.LoadWav(
input_signal_filepath)
- input_signal = signal_processing.SignalProcessingUtils.normalize(
+ input_signal = signal_processing.SignalProcessingUtils.Normalize(
input_signal)
noisy_mix_filepaths = {}
@@ -323,9 +344,9 @@ class EnvironmentalNoiseGenerator(NoiseGenerator):
logging.error('cannot find the <%s> noise track', noise_track_filename)
raise exceptions.FileNotFoundError()
- noise_signal = signal_processing.SignalProcessingUtils.load_wav(
+ noise_signal = signal_processing.SignalProcessingUtils.LoadWav(
noise_track_filepath)
- noise_signal = signal_processing.SignalProcessingUtils.normalize(
+ noise_signal = signal_processing.SignalProcessingUtils.Normalize(
noise_signal)
# Create the noisy mixes (once for each unique SNR value).
@@ -338,24 +359,26 @@ class EnvironmentalNoiseGenerator(NoiseGenerator):
# Create and save if not done.
if not os.path.exists(noisy_signal_filepath):
# Create noisy signal.
- noisy_signal = signal_processing.SignalProcessingUtils.mix_signals(
+ noisy_signal = signal_processing.SignalProcessingUtils.MixSignals(
input_signal, noise_signal, snr)
# Save.
- signal_processing.SignalProcessingUtils.save_wav(
+ signal_processing.SignalProcessingUtils.SaveWav(
noisy_signal_filepath, noisy_signal)
# Add file to the collection of mixes.
noisy_mix_filepaths[noise_track_name][snr] = noisy_signal_filepath
# Add all the noise-SNR pairs.
- self._add_noise_snr_pairs(
+ self._AddNoiseSnrPairs(
base_output_path, noisy_mix_filepaths, self._SNR_VALUE_PAIRS)
-@NoiseGenerator.register_class
+@NoiseGenerator.RegisterClass
class EchoNoiseGenerator(NoiseGenerator):
"""Echo noise generator.
+
+ TODO(alessiob): Rename from echo to reverberation.
"""
NAME = 'echo'
@@ -381,7 +404,7 @@ class EchoNoiseGenerator(NoiseGenerator):
NoiseGenerator.__init__(self)
self._aechen_ir_database_path = aechen_ir_database_path
- def _generate(
+ def _Generate(
self, input_signal_filepath, input_noise_cache_path, base_output_path):
"""Generates echo noise.
@@ -390,17 +413,12 @@ class EchoNoiseGenerator(NoiseGenerator):
created: the noisy signal and the reference signal. The former is
obtained by mixing the (clean) input signal to the corresponding noise
track enforcing the target SNR.
-
- Args:
- input_signal_filepath: (clean) input signal file path.
- input_noise_cache_path: path for the cached noise track files.
- base_output_path: base output path.
"""
# Init.
snr_values = set([snr for pair in self._SNR_VALUE_PAIRS for snr in pair])
# Load the input signal.
- input_signal = signal_processing.SignalProcessingUtils.load_wav(
+ input_signal = signal_processing.SignalProcessingUtils.LoadWav(
input_signal_filepath)
noisy_mix_filepaths = {}
@@ -412,14 +430,14 @@ class EchoNoiseGenerator(NoiseGenerator):
noise_signal = None
try:
# Load noise track.
- noise_signal = signal_processing.SignalProcessingUtils.load_wav(
+ noise_signal = signal_processing.SignalProcessingUtils.LoadWav(
noise_track_filepath)
except IOError: # File not found.
# Generate noise track by applying the impulse response.
impulse_response_filepath = os.path.join(
self._aechen_ir_database_path,
self._IMPULSE_RESPONSES[impulse_response_name])
- noise_signal = self._generate_noise_track(
+ noise_signal = self._GenerateNoiseTrack(
noise_track_filepath, input_signal, impulse_response_filepath)
assert noise_signal is not None
@@ -434,21 +452,21 @@ class EchoNoiseGenerator(NoiseGenerator):
# Create and save if not done.
if not os.path.exists(noisy_signal_filepath):
# Create noisy signal.
- noisy_signal = signal_processing.SignalProcessingUtils.mix_signals(
+ noisy_signal = signal_processing.SignalProcessingUtils.MixSignals(
input_signal, noise_signal, snr, bln_pad_shortest=True)
# Save.
- signal_processing.SignalProcessingUtils.save_wav(
+ signal_processing.SignalProcessingUtils.SaveWav(
noisy_signal_filepath, noisy_signal)
# Add file to the collection of mixes.
noisy_mix_filepaths[impulse_response_name][snr] = noisy_signal_filepath
# Add all the noise-SNR pairs.
- self._add_noise_snr_pairs(base_output_path, noisy_mix_filepaths,
- self._SNR_VALUE_PAIRS)
+ self._AddNoiseSnrPairs(base_output_path, noisy_mix_filepaths,
+ self._SNR_VALUE_PAIRS)
- def _generate_noise_track(self, noise_track_filepath, input_signal,
+ def _GenerateNoiseTrack(self, noise_track_filepath, input_signal,
impulse_response_filepath):
"""Generates noise track.
@@ -459,6 +477,9 @@ class EchoNoiseGenerator(NoiseGenerator):
noise_track_filepath: output file path for the noise track.
input_signal: (clean) input signal samples.
impulse_response_filepath: impulse response file path.
+
+ Returns:
+ AudioSegment instance.
"""
# Load impulse response.
data = scipy.io.loadmat(impulse_response_filepath)
@@ -470,11 +491,11 @@ class EchoNoiseGenerator(NoiseGenerator):
# Apply impulse response.
processed_signal = (
- signal_processing.SignalProcessingUtils.apply_impulse_response(
+ signal_processing.SignalProcessingUtils.ApplyImpulseResponse(
input_signal, impulse_response))
# Save.
- signal_processing.SignalProcessingUtils.save_wav(
+ signal_processing.SignalProcessingUtils.SaveWav(
noise_track_filepath, processed_signal)
return processed_signal

Powered by Google App Engine
This is Rietveld 408576698