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 8faa4e265242947176baef42b6be0303a2f5bee0..854b4065cc1f0f7c95b05cfd36ffe02841fad877 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 |
@@ -9,6 +9,7 @@ |
import os |
from . import data_access |
+from .signal_processing import SignalProcessingUtils |
class NoiseGenerator(object): |
"""Abstract class responsible for the generation of noisy signals. |
@@ -144,8 +145,7 @@ class IdentityGenerator(NoiseGenerator): |
output_path=output_path) |
-# TODO(alessiob): remove comment when class implemented. |
-# @NoiseGenerator.register_class |
+@NoiseGenerator.register_class |
class WhiteNoiseGenerator(NoiseGenerator): |
""" |
Additive white noise generator. |
@@ -153,13 +153,63 @@ class WhiteNoiseGenerator(NoiseGenerator): |
NAME = 'white' |
+ # Each pair indicates the clean vs. noisy and reference vs. noisy SNRs. |
+ # Since the implementation below only changes the gain of the noise, the |
+ # values indicate the noise-to-signal ratio. Therefore a higher value means |
+ # larger amount of noise. |
+ # The reference (second value of each pair) always has a lower amount of noise |
+ # - i.e., the SNR is 10 dB higher. |
+ _SNR_VALUE_PAIRS = [ |
+ [0, -10], # Largest noise. |
+ [-5, -15], |
+ [-10, -20], |
+ [-20, -30], # Smallest noise. |
+ ] |
+ |
+ _NOISY_SIGNAL_FILENAME_TEMPLATE = 'noise_{0:d}_SNR.wav' |
+ |
def __init__(self): |
NoiseGenerator.__init__(self) |
def _generate( |
self, input_signal_filepath, input_noise_cache_path, base_output_path): |
- # TODO(alessiob): implement. |
- pass |
+ # Load the input signal. |
+ input_signal = SignalProcessingUtils.load_wav(input_signal_filepath) |
+ input_signal = SignalProcessingUtils.normalize(input_signal) |
+ |
+ # Create the noise track. |
+ noise_signal = SignalProcessingUtils.generate_white_noise(input_signal) |
+ noise_signal = SignalProcessingUtils.normalize(noise_signal) |
+ |
+ # Create the noisy mixes (once for each unique SNR value). |
+ noisy_mix_filepaths = {} |
+ snr_values = set([snr for pair in self._SNR_VALUE_PAIRS for snr in pair]) |
+ for snr in snr_values: |
+ noisy_signal_filepath = os.path.join( |
+ input_noise_cache_path, |
+ self._NOISY_SIGNAL_FILENAME_TEMPLATE.format(snr)) |
+ |
+ # Create and save if not done. |
+ if not os.path.exists(noisy_signal_filepath): |
+ # Create noisy signal. |
+ noisy_signal = SignalProcessingUtils.mix_signals( |
+ noise_signal, input_signal, snr) |
+ |
+ # Save. |
+ SignalProcessingUtils.save_wav(noisy_signal_filepath, noisy_signal) |
+ |
+ # Add file to the collection of mixes. |
+ noisy_mix_filepaths[snr] = noisy_signal_filepath |
+ |
+ # 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( |
+ config_name=config_name, |
+ noisy_signal_filepath=noisy_mix_filepaths[snr_noisy], |
+ reference_signal_filepath=noisy_mix_filepaths[snr_refence], |
+ output_path=output_path) |
# TODO(alessiob): remove comment when class implemented. |