Compare commits

..

No commits in common. "e512f7a64315ce3c1880253fd1bba4dd7feea0ea" and "0bf8134feb2c66b28f046107e38d3dfc717bda30" have entirely different histories.

15 changed files with 220 additions and 256 deletions

View File

@ -1,21 +0,0 @@
AQuA:
mode: files
# src: file test_audio/jane_8k.wav
# tstf: test_audio/jane_8k_40.wav
avlp: off
smtnrm: off
decor: off
mprio: off
acr: auto
npnt: auto
voip: on
enorm: rms
g711: off
spfrcor: on
grad: off
tmc: on
miter: 1
ratem: "%%m"
trim: "r 15"
output: json

BIN
bin/linux/aqua-wb Executable file

Binary file not shown.

BIN
bin/linux/pjsua Executable file

Binary file not shown.

BIN
bin/linux/pvqa Executable file

Binary file not shown.

BIN
bin/linux/silence_eraser Executable file

Binary file not shown.

BIN
bin/linux/speech_detector Executable file

Binary file not shown.

1
bin/macos/README.txt Normal file
View File

@ -0,0 +1 @@
This pjsua requires 10.14 at least!

BIN
bin/macos/aqua-wb Executable file

Binary file not shown.

BIN
bin/macos/pjsua Executable file

Binary file not shown.

BIN
bin/macos/pvqa Executable file

Binary file not shown.

View File

@ -1,232 +1,226 @@
Common: BOF Common
IntervalLength: 0.68 IntervalLength = 0.68
IsUseUncertain: no IsUseUncertain = false
IsUseMixMode: yes IsUseMixMode = true
IsUseDistance: no IsUseDistance = false
AllWeight: 1.0 AllWeight = 1.0
SilWeight: 1.0 SilWeight = 1
VoiWeight: 1.0 VoiWeight = 1
AllCoefficient: 1.0 AllCoefficient = 1.0
SilCoefficient: 1.0 SilCoefficient = 1.0
VoiCoefficient: 1.0 VoiCoefficient = 1.0
SilThreshold: -37.50 SilThreshold = -37.50
IsOnePointSil: no IsOnePointSil = false
IsNormResult: yes IsNormResult = true
IsMapScore: yes IsMapScore = true
NormalizeByRms: yes EOF Common
SilenceEraser: BOF Detector
Enabled: no Name = SNR
Options: DetectorType = SNR
IntThresh = 0.10
FrameThresh = 14
DetThresh = 0.10
PVQA-Flag = true
PVQA-Weight = 1.0
DetMode = Both
EOF Detector
Detector: BOF Detector
- Name: SNR Name = DeadAir-00
DetectorType: SNR DetectorType = DeadAir
IntThresh: 0.10 IntThresh = 0.60
FrameThresh: 14 DetThresh = 0.60
DetThresh: 0.10 PVQA-Flag = true
PVQA-Flag: yes PVQA-Weight = 1.0
PVQA-Weight: 1.0 DetMode = Both
DetMode: both EOF Detector
- Name: Noise BOF Detector
DetectorType: Noise Name = DeadAir-01
IntThresh: 0.99 DetectorType = DeadAir
DetThresh: 0.99 IntThresh = 0.5
# This is still experimental detector so its values are not participating in MOS calculation DetThresh = 0.5
PVQA-Flag: false PVQA-Flag = true
PVQA-Weight: 1.0 PVQA-Weight = 1.0
DetMode: both DetMode = Both
EOF Detector
- Name: DTMF BOF Detector
DetectorType: DTMF Name = Click
IntThresh: 0.99 DetectorType = Clicking
DetThresh: 0.99 IntThresh = 0.10
DetThresh = 0.10
PVQA-Flag = true
PVQA-Weight = 1.0
DetMode = Both
EOF Detector
# There is no sense to use detected DTMF signal in MOS calculation in the current config BOF Detector
PVQA-Flag: no Name = VAD-Clipping
PVQA-Weight: 0.0 DetectorType = VADClipping
DetMode: both IntThresh = 0.0
FrameThresh = 0.0
DetThresh = 0.0
PVQA-Flag = true
PVQA-Weight = 1.0
DetMode = Both
EOF Detector
- Name: DeadAir-00 BOF Detector
DetectorType: DeadAir Name = Amplitude-Clipping
IntThresh: 0.60 DetectorType = AmpClipping
DetThresh: 0.60 IntThresh = 0.00
PVQA-Flag: true FrameThresh = 1.00
PVQA-Weight: 1.0 DetThresh = 0.00
DetMode: both PVQA-Flag = true
PVQA-Weight = 1.00
DetMode = Both
EOF Detector
- Name: DeadAir-01 BOF Detector
DetectorType: DeadAir Name = Dynamic-Clipping
IntThresh: 0.5 DetectorType = AmpClipping
DetThresh: 0.5 IntThresh = 0.05
PVQA-Flag: yes FrameThresh = 1.50
PVQA-Weight: 1.0 DetThresh = 0
DetMode: both PVQA-Flag = true
Override: PVQA-Weight = 0.0
MinLevelThreshold: 0 DetMode = Voice
EOF Detector
BOF Base EchoMono
SamplesType = UnKnownCodec
StepLengthSec = 0.5
MinDelayMs = 50
MaxLengthMs = 2800
WindowFunckID = 0
SpanLengthMs = 50
EOF Base EchoMono
BOF Detector
Name = ECHO
DetectorType = EchoMono
IntThresh = 0.00
FrameThresh = -40.0
DetThresh = 0.00
PVQA-Flag = true
PVQA-Weight = 1.0
DetMode = Voice
STAT-Flag = true
SpanLengthMs = 50
EOF Detector
BOF Detector
Name = Silent-Call-Detection
DetectorType = DeadAir
IntThresh = 0.99
DetThresh = 0.99
PVQA-Flag = false
PVQA-Weight = 1.0
EOF Detector
BOF Base SNR
MinPowerThresh = 1.0000
LogEnergyCoefficient = 10.0000
MinSignalLevel = 40.0000
MinSNRDelta = 0.0001
MinEnergyDisp = 3.0000
MinEnergyDelta = 1.0000
SamplesType = UnKnownCodec
EOF Base SNR
BOF Base AmpClipping
FlyAddingCoefficient = 0.1000
IsUseDynamicClipping = false
SamplesType = UnKnownCodec
EOF Base AmpClipping
BOF Base Clicking
SamplesType = UnKnownCodec
EOF Base Clicking
BOF Base DeadAir
StuckDeltaThreshold = 6
MinNonStuckTime = 80
MinStuckTime = 80
MinStartNonStuckTime = 1920
MinLevelThreshold = 256
SamplesType = UnKnownCodec
EOF Base DeadAir
- Name: Click BOF Base VADClipping
DetectorType: Clicking SamplesType = UnKnownCodec
IntThresh: 0.10 EOF Base VADClipping
DetThresh: 0.10
PVQA-Flag: true
PVQA-Weight: 1.0
DetMode: both
- Name: VAD-Clipping BOF DeadAir-01
DetectorType: VADClipping MinLevelThreshold = 0
IntThresh: 0.0 EOF DeadAir-01
FrameThresh: 0.0
DetThresh: 0.0
PVQA-Flag: true
PVQA-Weight: 1.0
DetMode: both
- Name: AmpClipping BOF Silent-Call-Detection
DetectorType: AmpClipping MinLevelThreshold = 0
IntThresh: 0.00 IsUseRMSPower = true
FrameThresh: 1.00 MinRMSThreshold = -70
DetThresh: 0.00 EOF Silent-Call-Detection
PVQA-Flag: true
PVQA-Weight: 1.00
DetMode: both
- Name: DynClipping BOF Dynamic-Clipping
DetectorType: AmpClipping FlyAddingCoefficient = 0.1000
IntThresh: 0.05 SamplesType = UnKnownCodec
FrameThresh: 1.50 IsUseDynamicClipping = true
DetThresh: 0 EOF Dynamic-Clipping
PVQA-Flag: true
PVQA-Weight: 0.0
DetMode: voice
Override:
FlyAddingCoefficient: 0.1000
SamplesType: UnKnownCodec
IsUseDynamicClipping: yes
- Name: Echo BOF Correction
DetectorType: EchoMono IntStart = 5.0
IntThresh: 0.00 IntEnd = 4.2
FrameThresh: -40.0 Mult = 1.0
DetThresh: 0.00 #Shift = -1.7
PVQA-Flag: true Shift = 0
PVQA-Weight: 1.0 EOF Correction
DetMode: voice
STAT-Flag: true
SpanLengthMs: 50
- Name: SilentCall BOF Correction
DetectorType: DeadAir IntStart = 4.2
IntThresh: 0.99 IntEnd = 3.5
DetThresh: 0.99 Mult = 1.0
PVQA-Flag: false #Shift = -0.85
PVQA-Weight: 1.0 Shift = 0
Override: EOF Correction
MinLevelThreshold: 0
IsUseRMSPower: yes
MinRMSThreshold: -70
BOF SR Correction
SampleRate = 11000.0
Shift = 0.05
EOF SR Correction
BOF SR Correction
SampleRate = 16000.0
Shift = 0.1
EOF SR Correction
Base EchoMono: BOF SR Correction
SamplesType: UnKnownCodec SampleRate = 22000.0
StepLengthSec: 0.5 Shift = 0.2
MinDelayMs: 50 EOF SR Correction
MaxLengthMs: 2800
WindowFunckID: 0
SpanLengthMs: 50
Base SNR: BOF SR Correction
MinPowerThresh: 1.0000 SampleRate = 32000.0
LogEnergyCoefficient: 10.0000 Shift = 0.3
MinSignalLevel: 40.0000 EOF SR Correction
MinSNRDelta: 0.0001
MinEnergyDisp: 3.0000
MinEnergyDelta: 1.0000
SamplesType: UnKnownCodec
Base DTMF: BOF SR Correction
SamplesType: UnKnownCodec SampleRate = 48000.0
Shift = 0.45
EOF SR Correction
Base AmpClipping: BOF SR Correction
FlyAddingCoefficient: 0.1000 SampleRate = 96000.0
IsUseDynamicClipping: no Shift = 0.5
SamplesType: UnKnownCodec EOF SR Correction
Base Clicking: BOF SR Correction
SamplesType: UnKnownCodec SampleRate = 192000.0
Shift = 0.6
EOF SR Correction
Base DeadAir: BOF Scores Map
StuckDeltaThreshold: 6 ScoresLine = 4;3.027000;2.935000;2.905000;2.818000;2.590000;2.432000;2.310000;1.665000;1.000000;
MinNonStuckTime: 80 EOF Scores Map
MinStuckTime: 80
MinStartNonStuckTime: 1920
MinLevelThreshold: 256
SamplesType: UnKnownCodec
Base VADClipping:
SamplesType: UnKnownCodec
Base Noise:
Interval: 0.1 # Seconds
DetectorType: RMS # This can be FFT as well
NoiseThreshold: 20
SignalThreshold: 80
Normalize: no
RemoveBias: no
ResultDb: yes
WindowType: Hann
WindowWidth: 3
# Moved to Override: sections
# DeadAir-01:
# MinLevelThreshold: 0
# SilentCall:
# MinLevelThreshold: 0
# IsUseRMSPower: yes
# MinRMSThreshold: -70
# Dynamic-Clipping:
# FlyAddingCoefficient: 0.1000
# SamplesType: UnKnownCodec
# IsUseDynamicClipping: yes
Correction:
- IntStart: 5.0
IntEnd: 4.2
Mult: 1.0
Shift: 0
- IntStart: 4.2
IntEnd: 3.5
Mult: 1.0
Shift: 0
SR Correction:
- SampleRate: 11000.0
Shift: 0.05
- SampleRate: 16000.0
Shift: 0.1
- SampleRate: 22000.0
Shift: 0.2
- SampleRate: 32000.0
Shift: 0.3
- SampleRate: 48000.0
Shift: 0.45
- SampleRate: 96000.0
Shift: 0.5
- SampleRate: 192000.0
Shift: 0.6
Scores Map:
ScoresLine: 4;3.027000;2.935000;2.905000;2.818000;2.590000;2.432000;2.310000;1.665000;1.000000;

Binary file not shown.

Binary file not shown.

View File

@ -152,20 +152,17 @@ def run_analyze(file_test: str, file_reference: str, number: str) -> bool:
return False return False
try: try:
bounds_signal : SignalBoundaries = None bounds_signal : SignalBoundaries = detect_degraded_signal(Path(file_test), Path(file_reference))
if is_caller: # bounds_signal.offset_start = 0
bounds_signal.offset_start = 10.0 # Skip ringtones # bounds_signal.offset_finish = 0
bounds_signal.offset_finish = 1.0 # Eat possible end tone print(f'Found signal bounds: {bounds_signal}')
elif is_answerer:
bounds_signal.offset_start = 0.0
bounds_signal.offset_finish = 1.0 # Eat possible end tone
# PVQA report # PVQA report
pvqa_mos, pvqa_report, pvqa_rfactor = utils_sevana.find_pvqa_mos(file_test, bounds_signal.offset_start, bounds_signal.offset_finish) pvqa_mos, pvqa_report, pvqa_rfactor = utils_sevana.find_pvqa_mos(file_test, bounds_signal.offset_start, bounds_signal.offset_finish)
utils.log(f'PVQA MOS: {pvqa_mos}, PVQA R-factor: {pvqa_rfactor}') utils.log(f'PVQA MOS: {pvqa_mos}, PVQA R-factor: {pvqa_rfactor}')
# AQuA report # AQuA report
bounds_reference : SignalBoundaries = SignalBoundaries() bounds_reference : SignalBoundaries = detect_reference_signal(Path(file_reference))
bounds_reference.offset_start = 0 bounds_reference.offset_start = 0
bounds_reference.offset_finish = 0 bounds_reference.offset_finish = 0
@ -261,7 +258,7 @@ def make_call(target: str):
timelimit_seconds=ref_time_length, timelimit_seconds=ref_time_length,
target=target) target=target)
run_analyze(CONFIG.RecordFile, CONFIG.PreparedReferenceAudio, target) run_analyze(CONFIG.RecordFile, CONFIG.ReferenceAudio, target)
except Exception as e: except Exception as e:
utils.log_error(f'BT I/O failed finally. Error: {str(e)}') utils.log_error(f'BT I/O failed finally. Error: {str(e)}')

View File

@ -12,6 +12,8 @@ import time
import urllib import urllib
from pathlib import Path from pathlib import Path
from colorama import Fore, Style
from utils_cache import InfoCache
PVQA_CMD = "{pvqa} --license {pvqa_lic} --config {pvqa_cfg} --mode analysis --channel 0 " \ PVQA_CMD = "{pvqa} --license {pvqa_lic} --config {pvqa_cfg} --mode analysis --channel 0 " \
"--report {output} --input {input} --cut-begin {cut_begin} --cut-end {cut_end}" "--report {output} --input {input} --cut-begin {cut_begin} --cut-end {cut_end}"
@ -19,8 +21,10 @@ PVQA_CMD = "{pvqa} --license {pvqa_lic} --config {pvqa_cfg} --mode analysis --ch
PVQA_CMD_LIC_SERVER = "{pvqa} --license-server {pvqa_lic} --config {pvqa_cfg} --mode analysis --channel 0 " \ PVQA_CMD_LIC_SERVER = "{pvqa} --license-server {pvqa_lic} --config {pvqa_cfg} --mode analysis --channel 0 " \
"--report {output} --input {input}" "--report {output} --input {input}"
AQUA_CMD = ("{aqua} {aqua_lic} -mode files -src file \"{reference}\" -tstf \"{input}\" -config {aqua_config} " AQUA_CMD = ("{aqua} {aqua_lic} -mode files -src file \"{reference}\" -tstf \"{input}\" -avlp off -smtnrm on "
"-specp 32 {spectrum} -fau {faults} -cut-tst {cut_begin} {cut_end} -cut-src {cut_begin_src} {cut_end_src}") "-decor off -mprio off -acr auto -npnt auto -voip on -enorm rms -g711 off "
"-spfrcor on -grad off -tmc on -hist-pitch on on -hist-levels on on on -miter 1 -specp 32 {spectrum} "
"-ratem %%m -fau {faults} -output json -trim r 15 -cut-tst {cut_begin} {cut_end} -cut-src {cut_begin_src} {cut_end_src}")
PVQA_PATH = "" PVQA_PATH = ""
PVQA_LIC_PATH = "pvqa.lic" PVQA_LIC_PATH = "pvqa.lic"
@ -28,7 +32,6 @@ PVQA_CFG_PATH = "pvqa.cfg"
AQUA_PATH = "" AQUA_PATH = ""
AQUA_LIC_PATH = "aqua-wb.lic" AQUA_LIC_PATH = "aqua-wb.lic"
AQUA_CFG_PATH = "aqua.cfg"
SILER_PATH = "" SILER_PATH = ""
@ -75,11 +78,9 @@ def load_config_and_licenses(server: str):
load_file(utils.join_host_and_path(server, '/deploy/pvqa.cfg'), PVQA_CFG_PATH) load_file(utils.join_host_and_path(server, '/deploy/pvqa.cfg'), PVQA_CFG_PATH)
load_file(utils.join_host_and_path(server, '/deploy/pvqa.lic'), PVQA_LIC_PATH) load_file(utils.join_host_and_path(server, '/deploy/pvqa.lic'), PVQA_LIC_PATH)
load_file(utils.join_host_and_path(server, '/deploy/aqua-wb.lic'), AQUA_LIC_PATH) load_file(utils.join_host_and_path(server, '/deploy/aqua-wb.lic'), AQUA_LIC_PATH)
load_file(utils.join_host_and_path(server, '/deploy/aqua.cfg'), AQUA_CFG_PATH)
except Exception as e: except Exception as e:
utils.log_error(f'Failed to fetch new licenses and config. Skipping it.') utils.log_error(f'Failed to fetch new licenses and config. Skipping it.')
def find_binaries(bin_directory: Path, license_server: str = None) -> bool: def find_binaries(bin_directory: Path, license_server: str = None) -> bool:
# Update path to pvqa/aqua-wb # Update path to pvqa/aqua-wb
global PVQA_CFG_PATH, PVQA_LIC_PATH, AQUA_LIC_PATH, PVQA_PATH, AQUA_PATH, PVQA_CMD, AQUA_CMD, SILER_PATH, SPEECH_DETECTOR_PATH global PVQA_CFG_PATH, PVQA_LIC_PATH, AQUA_LIC_PATH, PVQA_PATH, AQUA_PATH, PVQA_CMD, AQUA_CMD, SILER_PATH, SPEECH_DETECTOR_PATH
@ -93,7 +94,6 @@ def find_binaries(bin_directory: Path, license_server: str = None) -> bool:
PVQA_LIC_PATH = bin_directory / PVQA_LIC_PATH PVQA_LIC_PATH = bin_directory / PVQA_LIC_PATH
PVQA_CFG_PATH = bin_directory / PVQA_CFG_PATH PVQA_CFG_PATH = bin_directory / PVQA_CFG_PATH
AQUA_PATH = bin_directory / platform_prefix / AQUA_PATH AQUA_PATH = bin_directory / platform_prefix / AQUA_PATH
AQUA_CFG_PATH = bin_directory / AQUA_CFG_PATH
AQUA_LIC_PATH = bin_directory / AQUA_LIC_PATH AQUA_LIC_PATH = bin_directory / AQUA_LIC_PATH
SILER_PATH = bin_directory / platform_prefix / SILER_PATH SILER_PATH = bin_directory / platform_prefix / SILER_PATH
SPEECH_DETECTOR_PATH = bin_directory / platform_prefix / SPEECH_DETECTOR_PATH SPEECH_DETECTOR_PATH = bin_directory / platform_prefix / SPEECH_DETECTOR_PATH
@ -109,16 +109,9 @@ def find_binaries(bin_directory: Path, license_server: str = None) -> bool:
PVQA_CFG_PATH = Path(utils.get_script_path()) / 'pvqa.cfg' PVQA_CFG_PATH = Path(utils.get_script_path()) / 'pvqa.cfg'
if not PVQA_CFG_PATH.exists(): if not PVQA_CFG_PATH.exists():
utils.log_error(f'Failed to find PVQA config file.') utils.log_error(f'Failed to find pvqa config.')
return False return False
if not AQUA_CFG_PATH.exists():
AQUA_CFG_PATH = Path(utils.get_script_path()) / 'aqua.cfg'
if not AQUA_CFG_PATH.exists():
utils.log_error(f'Failed to find AQuA config file.')
return False
if not AQUA_PATH.exists(): if not AQUA_PATH.exists():
utils.log_error(f'Failed to find aqua-wb binary.') utils.log_error(f'Failed to find aqua-wb binary.')
return False return False
@ -245,7 +238,7 @@ def find_aqua_mos(good_path, test_path, test_file_offset_begin: float = 0.0, tes
good_file_offset_begin: float = 0.0, good_file_offset_end: float = 0.0): good_file_offset_begin: float = 0.0, good_file_offset_end: float = 0.0):
try: try:
out_data = "" out_data = ""
cmd = AQUA_CMD.format(aqua=AQUA_PATH, aqua_lic=AQUA_LIC_PATH, aqua_config = AQUA_CFG_PATH, cmd = AQUA_CMD.format(aqua=AQUA_PATH, aqua_lic=AQUA_LIC_PATH,
reference=good_path, input=test_path, spectrum=AQUA_SPECTRUM, reference=good_path, input=test_path, spectrum=AQUA_SPECTRUM,
faults=AQUA_FAULTS, faults=AQUA_FAULTS,
cut_begin=int(test_file_offset_begin * 1000), cut_end=int(test_file_offset_end * 1000), cut_begin=int(test_file_offset_begin * 1000), cut_end=int(test_file_offset_end * 1000),