Index: webrtc/modules/audio_processing/test/py_quality_assessment/quality_assessment/eval_scores.py |
diff --git a/webrtc/modules/audio_processing/test/py_quality_assessment/quality_assessment/eval_scores.py b/webrtc/modules/audio_processing/test/py_quality_assessment/quality_assessment/eval_scores.py |
index 90b88ed44dae683c7165b60f46c48b1e7b90655a..1488b4a126f0ffc1c6f1951a6e20e2bcde9638c3 100644 |
--- a/webrtc/modules/audio_processing/test/py_quality_assessment/quality_assessment/eval_scores.py |
+++ b/webrtc/modules/audio_processing/test/py_quality_assessment/quality_assessment/eval_scores.py |
@@ -11,8 +11,11 @@ |
import logging |
import os |
+import re |
+import subprocess |
from . import data_access |
+from . import exceptions |
from . import signal_processing |
@@ -123,12 +126,62 @@ class PolqaScore(EvaluationScore): |
""" |
NAME = 'polqa' |
+ _BIN_FILENAME = 'PolqaOem64' |
def __init__(self, polqa_tool_path): |
EvaluationScore.__init__(self) |
+ |
+ # Path to the POLQA directory with binary and license files. |
self._polqa_tool_path = polqa_tool_path |
+ # POLQA binary file path. |
+ self._polqa_bin_filepath = os.path.join( |
+ self._polqa_tool_path, self._BIN_FILENAME) |
+ if not os.path.exists(self._polqa_bin_filepath): |
+ logging.error('cannot find POLQA tool binary file') |
+ raise exceptions.FileNotFoundError() |
+ |
def _run(self, output_path): |
- # TODO(alessio): implement. |
- self._score = 0.0 |
+ polqa_out_filepath = os.path.join(output_path, 'polqa.out') |
+ if os.path.exists(polqa_out_filepath): |
+ os.unlink(polqa_out_filepath) |
+ |
+ args = [ |
+ self._polqa_bin_filepath, '-t', '-q', '-Overwrite', |
+ '-Ref', self._reference_signal_filepath, |
+ '-Test', self._tested_signal_filepath, |
+ '-LC', 'NB', |
+ '-Out', polqa_out_filepath, |
+ ] |
+ logging.debug(' '.join(args)) |
+ subprocess.call(args, cwd=self._polqa_tool_path) |
+ |
+ # Parse POLQA tool output and extract the score. |
+ polqa_output = self._parse_output_file(polqa_out_filepath) |
+ self._score = float(polqa_output['PolqaScore']) |
+ |
self._save_score() |
+ |
+ @classmethod |
+ def _parse_output_file(cls, polqa_out_filepath): |
+ """ |
+ Parse the POLQA tool output formatted as a table ('-t' option). |
+ """ |
+ data = [] |
+ with open(polqa_out_filepath) as f: |
+ for line in f: |
+ line = line.strip() |
+ if len(line) == 0 or line.startswith('*'): |
+ # Ignore comments. |
+ continue |
+ # Read fields. |
+ data.append(re.split(r'\t+', line)) |
+ |
+ # Two rows expected (header and values). |
+ assert len(data) == 2, 'Cannot parse POLQA output' |
+ number_of_fields = len(data[0]) |
+ assert number_of_fields == len(data[1]) |
+ |
+ # Build and return a dictionary with field names (header) as keys and the |
+ # corresponding field values as values. |
+ return {data[0][index]: data[1][index] for index in range(number_of_fields)} |