Index: webrtc/modules/audio_processing/test/py_quality_assessment/apm_quality_assessment_export.py |
diff --git a/webrtc/modules/audio_processing/test/py_quality_assessment/apm_quality_assessment_export.py b/webrtc/modules/audio_processing/test/py_quality_assessment/apm_quality_assessment_export.py |
index dcfea944a7223977c08db754215a19926f7fdc0a..d3d3a83a6fe47b6d7ac9174a75be4e13ad477193 100755 |
--- a/webrtc/modules/audio_processing/test/py_quality_assessment/apm_quality_assessment_export.py |
+++ b/webrtc/modules/audio_processing/test/py_quality_assessment/apm_quality_assessment_export.py |
@@ -6,154 +6,3 @@ |
# 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. |
- |
-"""Export the scores computed by the apm_quality_assessment.py script into an |
- HTML file. |
-""" |
- |
-import argparse |
-import collections |
-import logging |
-import glob |
-import os |
-import re |
-import sys |
- |
-import quality_assessment.audioproc_wrapper as audioproc_wrapper |
-import quality_assessment.data_access as data_access |
-import quality_assessment.export as export |
- |
-# Regular expressions used to derive score descriptors from file paths. |
-RE_CONFIG_NAME = re.compile(r'cfg-(.+)') |
-RE_INPUT_NAME = re.compile(r'input-(.+)') |
-RE_NOISE_NAME = re.compile(r'noise-(.+)') |
-RE_SCORE_NAME = re.compile(r'score-(.+)\.txt') |
- |
-def _InstanceArgumentsParser(): |
- parser = argparse.ArgumentParser(description=( |
- 'Exports pre-computed APM module quality assessment results into HTML ' |
- 'tables.')) |
- |
- parser.add_argument('-o', '--output_dir', required=True, |
- help=('the same base path used with the ' |
- 'apm_quality_assessment tool')) |
- |
- parser.add_argument('-f', '--filename_suffix', |
- help=('suffix of the exported file')) |
- |
- parser.add_argument('-c', '--config_names', type=re.compile, |
- help=('regular expression to filter the APM configuration' |
- ' names')) |
- |
- parser.add_argument('-i', '--input_names', type=re.compile, |
- help=('regular expression to filter the probing signal ' |
- 'names')) |
- |
- parser.add_argument('-n', '--noise_generators', type=re.compile, |
- help=('regular expression to filter the noise generator ' |
- 'names')) |
- |
- parser.add_argument('-e', '--eval_scores', type=re.compile, |
- help=('regular expression to filter the evaluation score ' |
- 'names')) |
- |
- return parser |
- |
- |
-def _GetScoreDescriptors(score_filepath): |
- """ |
- Extract a score descriptors from the score file path. |
- """ |
- config_name, input_name, noise_name, noise_params, score_name = ( |
- score_filepath.split(os.sep)[-5:]) |
- config_name = RE_CONFIG_NAME.match(config_name).groups(0)[0] |
- input_name = RE_INPUT_NAME.match(input_name).groups(0)[0] |
- noise_name = RE_NOISE_NAME.match(noise_name).groups(0)[0] |
- score_name = RE_SCORE_NAME.match(score_name).groups(0)[0] |
- return config_name, input_name, noise_name, noise_params, score_name |
- |
- |
-def _ExcludeScore(config_name, input_name, noise_name, score_name, args): |
- """ |
- Given a score descriptor, encoded in config_name, input_name, noise_name, and |
- score_name, use the corresponding regular expressions to determine if the |
- score should be excluded. |
- """ |
- value_regexpr_pairs = [ |
- (config_name, args.config_names), |
- (input_name, args.input_names), |
- (noise_name, args.noise_generators), |
- (score_name, args.eval_scores), |
- ] |
- |
- # Score accepted if each value matches the corresponding regular expression. |
- for value, regexpr in value_regexpr_pairs: |
- if regexpr is None: |
- continue |
- if not regexpr.match(value): |
- return True |
- |
- return False |
- |
- |
-def _GetOutputFilename(filename_suffix): |
- """ |
- Build the filename for the exported file. |
- """ |
- if filename_suffix is None: |
- return 'results.html' |
- return 'results-{}.html'.format(filename_suffix) |
- |
- |
-def main(): |
- # Init. |
- logging.basicConfig(level=logging.DEBUG) # TODO(alessio): INFO once debugged. |
- parser = _InstanceArgumentsParser() |
- nested_dict = lambda: collections.defaultdict(nested_dict) |
- scores = nested_dict() # Organize the scores in a nested dictionary. |
- |
- # Parse command line arguments. |
- args = parser.parse_args() |
- |
- # Find score files in the output path. |
- src_path = os.path.join( |
- args.output_dir, 'cfg-*', 'input-*', 'noise-*', '*', 'score-*.txt') |
- logging.debug(src_path) |
- for score_filepath in glob.iglob(src_path): |
- # Extract score descriptors from the path. |
- config_name, input_name, noise_name, noise_params, score_name = ( |
- _GetScoreDescriptors(score_filepath)) |
- |
- # Ignore the score if required. |
- if _ExcludeScore(config_name, input_name, noise_name, score_name, args): |
- logging.info('ignored score: %s %s %s %s', |
- config_name, input_name, noise_name, score_name) |
- continue |
- |
- # Get metadata. |
- score_path, _ = os.path.split(score_filepath) |
- audio_in_filepath, audio_ref_filepath = ( |
- data_access.Metadata.load_audio_in_ref_paths(score_path)) |
- audio_out_filepath = os.path.join( |
- score_path, audioproc_wrapper.AudioProcWrapper.OUTPUT_FILENAME) |
- |
- # Add the score to the nested dictionary. |
- scores[score_name][config_name][input_name][noise_name][noise_params] = { |
- 'score': data_access.ScoreFile.load(score_filepath), |
- 'audio_in_filepath': audio_in_filepath, |
- 'audio_out_filepath': audio_out_filepath, |
- 'audio_ref_filepath': audio_ref_filepath, |
- } |
- |
- # Export. |
- exporter = export.HtmlExport( |
- output_path=args.output_dir, |
- output_filename=_GetOutputFilename(args.filename_suffix)) |
- output_filepath = exporter.export(scores) |
- |
- logging.info('output file successfully written in %s', output_filepath) |
- sys.exit(0) |
- |
- |
-if __name__ == '__main__': |
- main() |