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

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

Issue 2718063003: POLQA evaluation score. (Closed)
Patch Set: rebase Created 3 years, 9 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/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)}

Powered by Google App Engine
This is Rietveld 408576698