From 88bffca6393916f533a9b22dd883d3d5915de2b7 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 9 Sep 2025 18:02:12 +0200 Subject: [PATCH 1/7] pass logger down to all run() functions to help debug executables --- .../audiotools/convert/__init__.py | 10 +++--- .../audiotools/metadata.py | 2 +- .../audiotools/wrappers/bs1770.py | 16 +++++---- .../audiotools/wrappers/dlyerr_2_errpat.py | 16 ++++++--- .../audiotools/wrappers/eid_xor.py | 15 ++++++-- .../audiotools/wrappers/esdru.py | 4 ++- .../audiotools/wrappers/filter.py | 36 +++++++++++-------- .../audiotools/wrappers/gen_patt.py | 8 +++-- .../audiotools/wrappers/masaAnalyzer.py | 6 ++-- .../audiotools/wrappers/masaRenderer.py | 12 ++++--- .../audiotools/wrappers/networkSimulator.py | 4 +-- .../audiotools/wrappers/p50fbmnru.py | 9 +++-- .../audiotools/wrappers/random_seed.py | 4 ++- .../audiotools/wrappers/reverb.py | 28 +++++++++------ .../generation/generate_masa_items.py | 6 ++-- .../generation/generate_mc_items.py | 6 ++-- .../generation/generate_sba_items.py | 6 ++-- .../generation/generate_stereo_items.py | 2 +- ivas_processing_scripts/processing/evs.py | 2 ++ ivas_processing_scripts/processing/ivas.py | 7 +++- .../processing/preprocessing_2.py | 2 +- 21 files changed, 130 insertions(+), 71 deletions(-) diff --git a/ivas_processing_scripts/audiotools/convert/__init__.py b/ivas_processing_scripts/audiotools/convert/__init__.py index c24394d6..7a7235ce 100755 --- a/ivas_processing_scripts/audiotools/convert/__init__.py +++ b/ivas_processing_scripts/audiotools/convert/__init__.py @@ -326,13 +326,13 @@ def process_audio( if mask is not None: if logger: logger.debug("Applying mask filter using ITU STL filter") - x.audio = maskfilter_itu(x, mask) + x.audio = maskfilter_itu(x, mask, logger=logger) """resampling""" if x.fs != fs: if logger: logger.debug(f"Resampling from {x.fs} to {fs} using ITU STL filter") - x.audio = resample_itu(x, fs) + x.audio = resample_itu(x, fs, logger=logger) x.fs = fs """low-pass filtering""" @@ -342,7 +342,7 @@ def process_audio( logger.debug( f"Applying low-pass filter with cutoff {fc}Hz using ITU STL filter" ) - x.audio = lpfilter_itu(x, fc) + x.audio = lpfilter_itu(x, fc, logger=logger) except NotImplementedError: warn( f"Low-pass filter cutoff {fc}Hz not supported by ITU filter. Falling back to python implementation." @@ -357,13 +357,13 @@ def process_audio( if mnru_q is not None: if logger: logger.debug("Applying P.50 Fullband MNRU") - x.audio = p50fbmnru(x, mnru_q) + x.audio = p50fbmnru(x, mnru_q, logger=logger) """ESDRU""" if esdru_alpha is not None: if logger: logger.debug("Applying ESDRU Recommendation ITU-T P.811") - x.audio = esdru(x, esdru_alpha) + x.audio = esdru(x, esdru_alpha, logger=logger) """Spatial distortion""" if ( diff --git a/ivas_processing_scripts/audiotools/metadata.py b/ivas_processing_scripts/audiotools/metadata.py index 9fd202d1..31bec3bf 100755 --- a/ivas_processing_scripts/audiotools/metadata.py +++ b/ivas_processing_scripts/audiotools/metadata.py @@ -721,7 +721,7 @@ def add_masa_metadata_preamble_repeat( num_tc = masa.num_channels - getattr(masa, "num_ism_channels", 0) - masaAnalyzer(sba, num_tc, masa.dirs, tmp_meta) + masaAnalyzer(sba, num_tc, masa.dirs, tmp_meta, logger=logger) if logger: logger.debug(f"Preamble Metadata size {tmp_meta.stat().st_size}") diff --git a/ivas_processing_scripts/audiotools/wrappers/bs1770.py b/ivas_processing_scripts/audiotools/wrappers/bs1770.py index 818adaad..cc183a25 100755 --- a/ivas_processing_scripts/audiotools/wrappers/bs1770.py +++ b/ivas_processing_scripts/audiotools/wrappers/bs1770.py @@ -51,6 +51,7 @@ def bs1770demo( input: audio.Audio, target_loudness: Optional[float] = -26, rms: Optional[bool] = False, + logger: Optional[logging.Logger] = None, ) -> Tuple[float, float]: """ Wrapper for ITU-R BS.1770-4, requires bs1770demo binary @@ -83,7 +84,7 @@ def bs1770demo( binary = find_binary("bs1770demo") # checking if the new binary (with '-rms') is used - result_check = run([str(binary)], check=False) + result_check = run([str(binary)], check=False, logger=logger) if "-rms" not in result_check.stdout: raise RuntimeError( 'A bs1770demo executable without RMS support (cmdl option "-rms") was detected. Please update the bs1770demo executable. See bin/README.md for details.' @@ -98,7 +99,7 @@ def bs1770demo( warn( "ITU-R BS.1770-4 only supports 48kHz sampling rate. Temporarily resampling signal for measurement." ) - tmp_sig = resample_itu(input, 48000) + tmp_sig = resample_itu(input, 48000, logger=logger) else: tmp_sig = input.audio @@ -143,7 +144,7 @@ def bs1770demo( cmd.insert(1, "-rms") # run command - result = run(cmd) + result = run(cmd, logger=logger) # parse output # we are looking for the (floating-point) number after the search string - '( )' around the number denotes the first group @@ -162,6 +163,7 @@ def get_loudness( target_loudness: Optional[float] = -26, loudness_format: Optional[str] = None, rms: Optional[bool] = False, + logger: Optional[logging.Logger] = None, ) -> Tuple[float, float, str]: """ Loudness measurement using ITU-R BS.1770-4 @@ -214,7 +216,9 @@ def get_loudness( convert.format_conversion(input, tmp) else: tmp.audio = input.audio - measured_loudness, scale_factor = bs1770demo(tmp, target_loudness, rms) + measured_loudness, scale_factor = bs1770demo( + tmp, target_loudness, rms, logger=logger + ) return measured_loudness, scale_factor, loudness_format @@ -261,7 +265,7 @@ def loudness_norm( # save loudness before and after scaling for the logger info loudness_before, scale_factor_new, loundness_fmt_used = get_loudness( - scaled_input, target_loudness, loudness_format, rms + scaled_input, target_loudness, loudness_format, rms, logger=logger ) # repeat until convergence of loudness @@ -272,7 +276,7 @@ def loudness_norm( # measure loudness and get scaling factor measured_loudness, scale_factor_new, _ = get_loudness( - scaled_input, target_loudness, loudness_format, rms + scaled_input, target_loudness, loudness_format, rms, logger=logger ) num_iter += 1 diff --git a/ivas_processing_scripts/audiotools/wrappers/dlyerr_2_errpat.py b/ivas_processing_scripts/audiotools/wrappers/dlyerr_2_errpat.py index fe8e133c..624cd28c 100644 --- a/ivas_processing_scripts/audiotools/wrappers/dlyerr_2_errpat.py +++ b/ivas_processing_scripts/audiotools/wrappers/dlyerr_2_errpat.py @@ -30,6 +30,7 @@ # the United Nations Convention on Contracts on the International Sales of Goods. # +import logging from pathlib import Path from typing import Optional, Union from warnings import warn @@ -56,6 +57,7 @@ def dlyerr_2_errpat( flag_word: Optional[bool] = None, flag_lf: Optional[bool] = None, delay: Optional[int] = None, + logger: Optional[logging.Logger] = None, ) -> None: """ Wrapper for dlyerr_2_errpat binary to convert delay and error profiles to frame error patterns for EVS JBM @@ -133,7 +135,7 @@ def dlyerr_2_errpat( cmd.extend(["-d", str(delay)]) # run command - run(cmd) + run(cmd, logger=logger) return @@ -148,6 +150,7 @@ def evs_jbm( errpatt_seed, errpatt_frames_packet, master_seed, + logger: Optional[logging.Logger] = None, ): # convert delay and error profile delay = None @@ -167,7 +170,9 @@ def evs_jbm( dlyerr_pattern = error_pattern # compute offset of error pattern len_pattern = length_pattern(dlyerr_pattern) - shift = random_seed((0, len_pattern - 1), master_seed, errpatt_seed) + shift = random_seed( + (0, len_pattern - 1), master_seed, errpatt_seed, logger=logger + ) elif error_profile is not None: # if error profile number is given @@ -202,7 +207,9 @@ def evs_jbm( # compute offset of error pattern len_pattern = length_pattern(dlyerr_pattern) - shift = random_seed((0, len_pattern - 1), master_seed, error_profile, False) + shift = random_seed( + (0, len_pattern - 1), master_seed, error_profile, False, logger=logger + ) fer_pattern = Path(bitstream).with_suffix(".evs_jbm_fer.192") @@ -215,10 +222,11 @@ def evs_jbm( shift=shift, late_loss_rate=late_loss_rate, length=length, + logger=logger, ) # apply FER pattern with eid-xor - eid_xor(fer_pattern, bitstream, bitstream_processed) + eid_xor(fer_pattern, bitstream, bitstream_processed, logger=logger) def validate_evs_jbm( diff --git a/ivas_processing_scripts/audiotools/wrappers/eid_xor.py b/ivas_processing_scripts/audiotools/wrappers/eid_xor.py index 6040c7e8..95b053d5 100644 --- a/ivas_processing_scripts/audiotools/wrappers/eid_xor.py +++ b/ivas_processing_scripts/audiotools/wrappers/eid_xor.py @@ -30,6 +30,7 @@ # the United Nations Convention on Contracts on the International Sales of Goods. # +import logging import os.path from pathlib import Path from typing import Optional, Union @@ -43,6 +44,7 @@ def eid_xor( error_pattern: Union[str, Path], in_bitstream: Union[str, Path], out_bitstream: Union[str, Path], + logger: Optional[logging.Logger] = None, ) -> None: """ Wrapper for eid-xor binary to apply error patterns for the bitstream processing @@ -87,7 +89,7 @@ def eid_xor( ] # run command - run(cmd) + run(cmd, logger=logger) return @@ -101,6 +103,7 @@ def create_and_apply_error_pattern( preamble: Optional[int] = 0, master_seed: Optional[int] = 0, prerun_seed: Optional[int] = 0, + logger: Optional[logging.Logger] = None, ) -> None: """ Function to create (or use existing) frame error pattern for bitstream processing @@ -132,7 +135,13 @@ def create_and_apply_error_pattern( ".192" ) create_error_pattern( - len_sig, error_pattern, error_rate, preamble, master_seed, prerun_seed + len_sig, + error_pattern, + error_rate, + preamble, + master_seed, + prerun_seed, + logger=logger, ) else: raise ValueError( @@ -144,7 +153,7 @@ def create_and_apply_error_pattern( ) # apply error pattern - eid_xor(error_pattern, in_bitstream, out_bitstream) + eid_xor(error_pattern, in_bitstream, out_bitstream, logger=logger) return diff --git a/ivas_processing_scripts/audiotools/wrappers/esdru.py b/ivas_processing_scripts/audiotools/wrappers/esdru.py index 64a7636f..e7692c76 100755 --- a/ivas_processing_scripts/audiotools/wrappers/esdru.py +++ b/ivas_processing_scripts/audiotools/wrappers/esdru.py @@ -31,6 +31,7 @@ # from copy import deepcopy +import logging from pathlib import Path from tempfile import TemporaryDirectory from typing import Optional @@ -49,6 +50,7 @@ def esdru( sf: Optional[int] = 48000, e_step: Optional[float] = 0.5, seed: Optional[int] = 1, + logger: Optional[logging.Logger] = None, ) -> np.ndarray: """ Wrapper for ESDRU (Ericsson spatial distortion reference unit) Recommendation ITU-T P.811, requires esdru binary @@ -122,7 +124,7 @@ def esdru( write(tmp_input_file, tmp_input_signal, sf) # run command - run(cmd, cwd=tmp_dir) + run(cmd, cwd=tmp_dir, logger=logger) tmp_output_signal, out_fs = read(tmp_output_file, 2, sf) diff --git a/ivas_processing_scripts/audiotools/wrappers/filter.py b/ivas_processing_scripts/audiotools/wrappers/filter.py index 0a6528ef..7821aabd 100755 --- a/ivas_processing_scripts/audiotools/wrappers/filter.py +++ b/ivas_processing_scripts/audiotools/wrappers/filter.py @@ -30,6 +30,7 @@ # the United Nations Convention on Contracts on the International Sales of Goods. # +import logging import re from copy import deepcopy from itertools import repeat @@ -56,6 +57,7 @@ def run_filter( chan: int, skip_channel: list[int], block_size: Optional[int] = None, + logger: Optional[logging.Logger] = None, ): if chan in skip_channel: return audio @@ -72,7 +74,7 @@ def run_filter( cmd.append(str(block_size)) write(tmp_in, audio, fs) - run(cmd) + run(cmd, logger=logger) out, _ = read(tmp_out, nchannels=1, fs=fs) return out @@ -87,6 +89,7 @@ def filter_itu( is_async: Optional[bool] = False, delay: Optional[int] = None, skip_channel: Optional[list[int]] = None, + logger: Optional[logging.Logger] = None, ) -> np.ndarray: """ Low-pass filter a multi-channel audio array @@ -197,7 +200,7 @@ def filter_itu( repeat(skip_channel), repeat(block_size), ), - None, + repeat({"logger": logger}), "mp", show_progress=False, ) @@ -211,6 +214,7 @@ def filter_itu( def lpfilter_itu( x: Audio, fc: int, + logger: Optional[logging.Logger] = None, ) -> np.ndarray: """ Low-pass filter a multi-channel audio array @@ -246,14 +250,14 @@ def lpfilter_itu( f"Filter type {flt_type} only supported for 48kHz samplingrate, not for {x.fs}Hz -> resampling" ) old_fs = x.fs - tmp.audio = resample_itu(tmp, 48000) + tmp.audio = resample_itu(tmp, 48000, logger=logger) tmp.fs = 48000 # pad to avoid loosing samples due to delay tmp.audio = pad_delay(tmp.audio, flt_type=flt_type, fs=tmp.fs) # apply filter - y = filter_itu(tmp, flt_type=flt_type, block_size=960) + y = filter_itu(tmp, flt_type=flt_type, block_size=960, logger=logger) # delay compensation y = delay_compensation(y, flt_type=flt_type) @@ -261,13 +265,14 @@ def lpfilter_itu( # reverse resampling if old_fs: tmp.audio = y - y = resample_itu(tmp, old_fs) + y = resample_itu(tmp, old_fs, logger=logger) return y def hp50filter_itu( x: Audio, + logger: Optional[logging.Logger] = None, ) -> np.ndarray: """ High-pass 50Hz filter a multi-channel audio array @@ -297,7 +302,7 @@ def hp50filter_itu( ) flt_type = "HP50_48KHZ" old_fs = x.fs - tmp.audio = resample_itu(tmp, 48000) + tmp.audio = resample_itu(tmp, 48000, logger=logger) tmp.fs = 48000 # don't apply high-pass filtering to LFE channel @@ -310,7 +315,7 @@ def hp50filter_itu( tmp.audio = pad_delay(tmp.audio, flt_type=flt_type, fs=tmp.fs) # apply filter - y = filter_itu(tmp, flt_type=flt_type, skip_channel=skip_channel) + y = filter_itu(tmp, flt_type=flt_type, skip_channel=skip_channel, logger=logger) # delay compensation y = delay_compensation(y, flt_type=flt_type) @@ -318,13 +323,14 @@ def hp50filter_itu( # reverse resampling if old_fs: tmp.audio = y - y = resample_itu(tmp, old_fs) + y = resample_itu(tmp, old_fs, logger=logger) return y def kbp20filter_itu( x: Audio, + logger: Optional[logging.Logger] = None, ) -> np.ndarray: """ 20Hz to 20kHz bandpass filter for multi-channel audio array @@ -352,7 +358,7 @@ def kbp20filter_itu( ) flt_type = "20KBP" old_fs = x.fs - tmp.audio = resample_itu(tmp, 48000) + tmp.audio = resample_itu(tmp, 48000, logger=logger) tmp.fs = 48000 # don't apply band-pass filtering to LFE channel @@ -365,7 +371,7 @@ def kbp20filter_itu( tmp.audio = pad_delay(tmp.audio, flt_type=flt_type, fs=tmp.fs) # apply filter - y = filter_itu(tmp, flt_type=flt_type, skip_channel=skip_channel) + y = filter_itu(tmp, flt_type=flt_type, skip_channel=skip_channel, logger=logger) # delay compensation y = delay_compensation(y, flt_type=flt_type) @@ -373,7 +379,7 @@ def kbp20filter_itu( # reverse resampling if old_fs: tmp.audio = y - y = resample_itu(tmp, old_fs) + y = resample_itu(tmp, old_fs, logger=logger) return y @@ -381,6 +387,7 @@ def kbp20filter_itu( def maskfilter_itu( x: Audio, mask: str, + logger: Optional[logging.Logger] = None, ) -> np.ndarray: """ Mask filter for multi-channel audio array @@ -399,9 +406,9 @@ def maskfilter_itu( """ if mask == "HP50": - y = hp50filter_itu(x) + y = hp50filter_itu(x, logger=logger) elif mask == "20KBP": - y = kbp20filter_itu(x) + y = kbp20filter_itu(x, logger=logger) else: raise ValueError("Invalid mask filter defined") @@ -411,6 +418,7 @@ def maskfilter_itu( def resample_itu( x: Audio, fs_new: int, + logger: Optional[logging.Logger] = None, ) -> np.ndarray: """ Resampling of multi-channel audio array @@ -471,7 +479,7 @@ def resample_itu( ) # resampling - y.audio = filter_itu(y, flt_type=flt, up=up[i], down=down[i]) + y.audio = filter_itu(y, flt_type=flt, up=up[i], down=down[i], logger=logger) # delay compensation y.audio = delay_compensation(y.audio, flt_type=flt, up=up[i], down=down[i]) diff --git a/ivas_processing_scripts/audiotools/wrappers/gen_patt.py b/ivas_processing_scripts/audiotools/wrappers/gen_patt.py index 6766567f..3899d4f8 100644 --- a/ivas_processing_scripts/audiotools/wrappers/gen_patt.py +++ b/ivas_processing_scripts/audiotools/wrappers/gen_patt.py @@ -30,6 +30,7 @@ # the United Nations Convention on Contracts on the International Sales of Goods. # +import logging from os import getcwd from pathlib import Path from tempfile import TemporaryDirectory @@ -48,6 +49,7 @@ def gen_patt( error_rate: float, start: Optional[int] = 0, working_dir: Optional[Union[Path, str]] = None, + logger: Optional[logging.Logger] = None, ) -> None: """ Wrapper for gen-patt binary to create error patterns for the bitstream processing @@ -99,7 +101,7 @@ def gen_patt( ] # run command - run(cmd, cwd=working_dir) + run(cmd, cwd=working_dir, logger=logger) return @@ -111,6 +113,7 @@ def create_error_pattern( preamble: Optional[int] = 0, master_seed: Optional[int] = 0, prerun_seed: Optional[int] = 0, + logger: Optional[logging.Logger] = None, ) -> None: """ Creates error pattern with desired frame error rate for bitstream processing @@ -148,7 +151,7 @@ def create_error_pattern( tmp_sta_file = tmp_dir.joinpath("sta") # compute seed - seed = random_seed((0, 99999999), master_seed, prerun_seed) + seed = random_seed((0, 99999999), master_seed, prerun_seed, logger=logger) # open file and modify lines = [] @@ -176,6 +179,7 @@ def create_error_pattern( path_pattern=path_pattern, start=preamble, working_dir=tmp_dir, + logger=logger, ) return diff --git a/ivas_processing_scripts/audiotools/wrappers/masaAnalyzer.py b/ivas_processing_scripts/audiotools/wrappers/masaAnalyzer.py index 65f2048e..26310bc1 100644 --- a/ivas_processing_scripts/audiotools/wrappers/masaAnalyzer.py +++ b/ivas_processing_scripts/audiotools/wrappers/masaAnalyzer.py @@ -29,6 +29,7 @@ # accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and # the United Nations Convention on Contracts on the International Sales of Goods. # +import logging from pathlib import Path from tempfile import TemporaryDirectory from typing import Optional @@ -45,6 +46,7 @@ def masaAnalyzer( num_tcs: int, num_dirs: int, metadata_out_filename: Optional[Path] = None, + logger: Optional[logging.Logger] = None, ) -> audio.MetadataAssistedSpatialAudio: """ Wrapper for masaAnalyzer (from MASA reference software) @@ -111,11 +113,11 @@ def masaAnalyzer( cmd[5] = str(tmp_out_pcm) cmd[6] = str(metadata_out_filename.resolve()) - tmp_audio = resample_itu(sba, 48000) + tmp_audio = resample_itu(sba, 48000, logger=logger) write(tmp_in, tmp_audio, 48000) # we need to run in the masaAnalyzer directory to use the .bin files it requires - run(cmd, cwd=binary.resolve().parent) + run(cmd, cwd=binary.resolve().parent, logger=logger) fmt = f"MASA{num_tcs}DIR{num_dirs}" masa = audio.fromfile(fmt, tmp_out_pcm, 48000, metadata_out_filename) diff --git a/ivas_processing_scripts/audiotools/wrappers/masaRenderer.py b/ivas_processing_scripts/audiotools/wrappers/masaRenderer.py index 7e52d664..5452847b 100755 --- a/ivas_processing_scripts/audiotools/wrappers/masaRenderer.py +++ b/ivas_processing_scripts/audiotools/wrappers/masaRenderer.py @@ -30,8 +30,10 @@ # the United Nations Convention on Contracts on the International Sales of Goods. # +import logging from pathlib import Path from tempfile import TemporaryDirectory +from typing import Optional from warnings import warn import numpy as np @@ -47,6 +49,7 @@ def ivasRendMasa( masa: audio.MetadataAssistedSpatialAudio, out_fmt: str, trajectory: Path = None, + logger: Optional[logging.Logger] = None, ) -> np.ndarray: """ Wrapper for IVAS_Rend MASA Rendering @@ -98,7 +101,7 @@ def ivasRendMasa( if masa_metadata_file is not None and not isinstance(masa_metadata_file, Path): masa_metadata_file = Path(masa_metadata_file) - rend.process(tmp_in, tmp_out, in_meta=[masa_metadata_file]) + rend.process(tmp_in, tmp_out, in_meta=[masa_metadata_file], logger=logger) output, _ = read(tmp_out) return output @@ -107,6 +110,7 @@ def ivasRendMasa( def masaRenderer( masa: audio.MetadataAssistedSpatialAudio, out_fmt: str, + logger: Optional[logging.Logger] = None, ) -> np.ndarray: """ Wrapper for masaRenderer (from MASA reference software) @@ -169,19 +173,19 @@ def masaRenderer( cmd[2] = str(tmp_in) cmd[4] = str(tmp_out) - tmp_audio = resample_itu(masa, 48000) + tmp_audio = resample_itu(masa, 48000, logger=logger) old_fs = masa.fs write(tmp_in, tmp_audio, 48000) # we need to run in the masaRenderer directory to use the .bin files it requires - run(cmd, cwd=binary.resolve().parent) + run(cmd, cwd=binary.resolve().parent, logger=logger) output, _ = read(tmp_out, num_channels) output_audio = audio.fromtype(out_fmt) output_audio.audio = output output_audio.fs = 48000 - output = resample_itu(output_audio, old_fs) + output = resample_itu(output_audio, old_fs, logger=logger) return output diff --git a/ivas_processing_scripts/audiotools/wrappers/networkSimulator.py b/ivas_processing_scripts/audiotools/wrappers/networkSimulator.py index 83556a92..af8dff7b 100644 --- a/ivas_processing_scripts/audiotools/wrappers/networkSimulator.py +++ b/ivas_processing_scripts/audiotools/wrappers/networkSimulator.py @@ -222,9 +222,9 @@ def apply_network_simulator( # compute offset of error pattern len_pattern = length_pattern(error_pattern) if error_profile: - offset = random_seed((0, len_pattern - 1), master_seed, error_profile, False) + offset = random_seed((0, len_pattern - 1), master_seed, error_profile, False, logger=logger) else: - offset = random_seed((0, len_pattern - 1), master_seed, errpatt_seed, False) + offset = random_seed((0, len_pattern - 1), master_seed, errpatt_seed, False, logger=logger) # apply error pattern network_simulator( diff --git a/ivas_processing_scripts/audiotools/wrappers/p50fbmnru.py b/ivas_processing_scripts/audiotools/wrappers/p50fbmnru.py index 922536be..5dd0d33d 100755 --- a/ivas_processing_scripts/audiotools/wrappers/p50fbmnru.py +++ b/ivas_processing_scripts/audiotools/wrappers/p50fbmnru.py @@ -31,8 +31,10 @@ # from copy import deepcopy +import logging from pathlib import Path from tempfile import TemporaryDirectory +from typing import Optional from warnings import warn import numpy as np @@ -47,6 +49,7 @@ from ivas_processing_scripts.utils import find_binary, run def p50fbmnru( input: audio.Audio, q_db: float, + logger: Optional[logging.Logger] = None, # noqa: F821 ) -> np.ndarray: """ Wrapper for P.50 Fullband MNRU (Modulated Noise Reference Unit), requires p50fbmnru binary @@ -80,7 +83,7 @@ def p50fbmnru( warn( "P.50 Fullband MNRU requires a sampling rate of 48kHz. Resampling will be applied" ) - tmp_audio_obj.audio = resample_itu(tmp_audio_obj, 48000) + tmp_audio_obj.audio = resample_itu(tmp_audio_obj, 48000, logger=logger) tmp_audio_obj.fs = 48000 with TemporaryDirectory() as tmp_dir: @@ -104,13 +107,13 @@ def p50fbmnru( write(tmp_input_file, tmp_audio_obj.audio) # run command - run(cmd) + run(cmd, logger=logger) tmp_output_signal, _ = read(tmp_output_file, input.num_channels) tmp_audio_obj.audio = tmp_output_signal # revert resampling if input.fs != 48000: - tmp_output_signal = resample_itu(tmp_audio_obj, input.fs) + tmp_output_signal = resample_itu(tmp_audio_obj, input.fs, logger=logger) return tmp_output_signal diff --git a/ivas_processing_scripts/audiotools/wrappers/random_seed.py b/ivas_processing_scripts/audiotools/wrappers/random_seed.py index 440b63a9..3f81686a 100644 --- a/ivas_processing_scripts/audiotools/wrappers/random_seed.py +++ b/ivas_processing_scripts/audiotools/wrappers/random_seed.py @@ -30,6 +30,7 @@ # the United Nations Convention on Contracts on the International Sales of Goods. # +import logging from typing import Optional, Tuple from ivas_processing_scripts.constants import DEFAULT_CONFIG_BINARIES @@ -41,6 +42,7 @@ def random_seed( master_seed: Optional[int] = 0, prerun_seed: Optional[int] = 0, hexa: Optional[bool] = True, + logger: Optional[logging.Logger] = None, ) -> int: """ @@ -83,7 +85,7 @@ def random_seed( ] # run command - result = run(cmd) + result = run(cmd, logger=logger) result = int(result.stdout[:-1]) if hexa: diff --git a/ivas_processing_scripts/audiotools/wrappers/reverb.py b/ivas_processing_scripts/audiotools/wrappers/reverb.py index 5b2c408b..0cda00a8 100644 --- a/ivas_processing_scripts/audiotools/wrappers/reverb.py +++ b/ivas_processing_scripts/audiotools/wrappers/reverb.py @@ -31,6 +31,7 @@ # from copy import copy +import logging from pathlib import Path from tempfile import TemporaryDirectory from typing import Optional @@ -51,6 +52,7 @@ def reverb( IR: Audio, align: Optional[float] = None, mode: Optional[str] = None, + logger: Optional[logging.Logger] = None, ) -> Audio: """ Wrapper for the ITU-T reverb binary to convolve mono audio signal with an impulse response @@ -91,7 +93,7 @@ def reverb( tmp_input = copy(input) if input.fs != IR.fs: old_fs = input.fs - tmp_input.audio = resample_itu(tmp_input, IR.fs) + tmp_input.audio = resample_itu(tmp_input, IR.fs, logger=logger) tmp_input.fs = IR.fs # add trailing zeros @@ -127,7 +129,7 @@ def reverb( cmd.extend([tmp_input_file, tmp_IR_file, tmp_output_file]) # run the 'reverb' command (automatically prepends N zeros to the input signal to keep the output length the same as the input) - run(cmd) + run(cmd, logger=logger) # read the reverberated output file output = copy(tmp_input) @@ -147,7 +149,7 @@ def reverb( output.audio = output.audio[: -(IR.audio.shape[0] - 1), :] if old_fs: - output.audio = resample_itu(output, old_fs) + output.audio = resample_itu(output, old_fs, logger=logger) output.fs = old_fs return output @@ -158,6 +160,7 @@ def reverb_stereo( stereo_IR: Audio, align: Optional[float] = None, mode: Optional[str] = None, + logger: Optional[logging.Logger] = None, ) -> Audio: """ Wrapper for the ITU-T reverb binary to convolve mono audio signal with a stereo impulse response @@ -200,8 +203,8 @@ def reverb_stereo( align = 1.0 / np.max(np.abs(H)) # convolve mono input with left and right IR - y_left = reverb(input, IR_left, align=align, mode=mode) - y_right = reverb(input, IR_right, align=align, mode=mode) + y_left = reverb(input, IR_left, align=align, mode=mode, logger=logger) + y_right = reverb(input, IR_right, align=align, mode=mode, logger=logger) # combine into stereo output y = audio.fromtype("STEREO") @@ -216,6 +219,7 @@ def reverb_foa( foa_IR: Audio, align: Optional[float] = None, mode: Optional[str] = None, + logger: Optional[logging.Logger] = None, ) -> Audio: """ Convolve mono audio signal with an FOA impulse response @@ -268,10 +272,10 @@ def reverb_foa( align = 1.0 / np.max(np.abs(H)) # convolve mono input with FOA IR - y_w = reverb(input, IR_w, align=align, mode=mode) - y_x = reverb(input, IR_x, align=align, mode=mode) - y_y = reverb(input, IR_y, align=align, mode=mode) - y_z = reverb(input, IR_z, align=align, mode=mode) + y_w = reverb(input, IR_w, align=align, mode=mode, logger=logger) + y_x = reverb(input, IR_x, align=align, mode=mode, logger=logger) + y_y = reverb(input, IR_y, align=align, mode=mode, logger=logger) + y_z = reverb(input, IR_z, align=align, mode=mode, logger=logger) # combine into FOA output y = audio.fromtype("FOA") @@ -286,6 +290,7 @@ def reverb_hoa2( hoa2_IR: Audio, align: Optional[float] = None, mode: Optional[str] = None, + logger: Optional[logging.Logger] = None, ) -> Audio: """ Convolve mono audio signal with an HOA2 impulse response @@ -323,7 +328,7 @@ def reverb_hoa2( # separate IR into each channel IR.audio = hoa2_IR.audio[:, [i]] # convolve mono input with channel IR - ych.append(reverb(input, IR, align=align, mode=mode)) + ych.append(reverb(input, IR, align=align, mode=mode), logger=logger) # combine into HOA2 output y = audio.fromtype("HOA2") @@ -338,6 +343,7 @@ def reverb_hoa3( hoa3_IR: Audio, align: Optional[float] = None, mode: Optional[str] = None, + logger: Optional[logging.Logger] = None, ) -> Audio: """ Convolve mono audio signal with an HOA3 impulse response @@ -375,7 +381,7 @@ def reverb_hoa3( # separate IR into each channel IR.audio = hoa3_IR.audio[:, [i]] # convolve mono input with channel IR - ych.append(reverb(input, IR, align=align, mode=mode)) + ych.append(reverb(input, IR, align=align, mode=mode), logger=logger) # combine into HOA3 output y = audio.fromtype("HOA3") diff --git a/ivas_processing_scripts/generation/generate_masa_items.py b/ivas_processing_scripts/generation/generate_masa_items.py index faba9112..86d62521 100644 --- a/ivas_processing_scripts/generation/generate_masa_items.py +++ b/ivas_processing_scripts/generation/generate_masa_items.py @@ -345,11 +345,11 @@ def generate_MASA_scene( # convolve MONO source audio with FOA/HOA2/HOA3 IR -> results in FOA/HOA2/HOA3 audio object if IR_fmt == "FOA": - x = reverb_foa(x, IR, mode=None) + x = reverb_foa(x, IR, mode=None, logger=logger) elif IR_fmt == "HOA2": - x = reverb_hoa2(x, IR, mode=None) + x = reverb_hoa2(x, IR, mode=None, logger=logger) elif IR_fmt == "HOA3": - x = reverb_hoa3(x, IR, mode=None) + x = reverb_hoa3(x, IR, mode=None, logger=logger) # adjust the level of the FOA/HOA2/HOA3 signal if np.isinf(level): diff --git a/ivas_processing_scripts/generation/generate_mc_items.py b/ivas_processing_scripts/generation/generate_mc_items.py index 35dcbb3b..b082bf11 100644 --- a/ivas_processing_scripts/generation/generate_mc_items.py +++ b/ivas_processing_scripts/generation/generate_mc_items.py @@ -335,11 +335,11 @@ def generate_MC_scene( # convolve MONO source audio with FOA/HOA2/HOA3 IR -> results in FOA/HOA2/HOA3 audio object if IR_fmt == "FOA": - x = reverb_foa(x, IR, mode=None) + x = reverb_foa(x, IR, mode=None, logger=logger) elif IR_fmt == "HOA2": - x = reverb_hoa2(x, IR, mode=None) + x = reverb_hoa2(x, IR, mode=None, logger=logger) elif IR_fmt == "HOA3": - x = reverb_hoa3(x, IR, mode=None) + x = reverb_hoa3(x, IR, mode=None, logger=logger) # adjust the level of the FOA/HOA2/HOA3 signal if level is None: diff --git a/ivas_processing_scripts/generation/generate_sba_items.py b/ivas_processing_scripts/generation/generate_sba_items.py index 22aba8ab..4f3d19d6 100644 --- a/ivas_processing_scripts/generation/generate_sba_items.py +++ b/ivas_processing_scripts/generation/generate_sba_items.py @@ -351,11 +351,11 @@ def generate_sba_scene( # convolve MONO source audio with FOA/HOA2/HOA3 IR -> results in FOA/HOA2/HOA3 audio object if cfg.format == "FOA": - x = reverb_foa(x, IR, mode=None) + x = reverb_foa(x, IR, mode=None, logger=logger) elif cfg.format == "HOA2": - x = reverb_hoa2(x, IR, mode=None) + x = reverb_hoa2(x, IR, mode=None, logger=logger) elif cfg.format == "HOA3": - x = reverb_hoa3(x, IR, mode=None) + x = reverb_hoa3(x, IR, mode=None, logger=logger) else: # convert MONO to ISM1 x_ism = audio.ObjectBasedAudio("ISM1") # ISM with 1 channel diff --git a/ivas_processing_scripts/generation/generate_stereo_items.py b/ivas_processing_scripts/generation/generate_stereo_items.py index 1ad8a6ae..43e8b432 100644 --- a/ivas_processing_scripts/generation/generate_stereo_items.py +++ b/ivas_processing_scripts/generation/generate_stereo_items.py @@ -311,7 +311,7 @@ def generate_stereo_scene( end_position.append(x.audio.shape[0] / x.fs + source_shift_in_seconds) # convolve MONO source audio with STEREO IR -> results in STEREO audio object - x = reverb_stereo(x, IR, mode=None) + x = reverb_stereo(x, IR, mode=None, logger=logger) # adjust the level of the STEREO signal if level is None: diff --git a/ivas_processing_scripts/processing/evs.py b/ivas_processing_scripts/processing/evs.py index 6f5fe2dd..d2aec675 100755 --- a/ivas_processing_scripts/processing/evs.py +++ b/ivas_processing_scripts/processing/evs.py @@ -415,6 +415,7 @@ class EVS(Processing): self.tx["errpatt_seed"], self.tx["n_frames_per_packet"], self.tx["master_seed"], + logger=logger, ) return bitstream_processed @@ -439,6 +440,7 @@ class EVS(Processing): error_rate=self.tx["error_rate"], master_seed=self.tx["master_seed"], prerun_seed=self.tx["prerun_seed"], + logger=logger, ) return bitstream_processed else: diff --git a/ivas_processing_scripts/processing/ivas.py b/ivas_processing_scripts/processing/ivas.py index 01f8220f..6b2f8605 100755 --- a/ivas_processing_scripts/processing/ivas.py +++ b/ivas_processing_scripts/processing/ivas.py @@ -277,6 +277,9 @@ class IVAS(Processing): ) voip = True elif self.tx["type"] == "JBM2FER": + logger.debug( + f"Frame loss simulator {bitstream} -> {bitstream_processed}" + ) delay_profile = self.tx["error_pattern"] len_pattern = length_pattern(delay_profile) @@ -303,8 +306,9 @@ class IVAS(Processing): fer_pattern=errpat, late_loss_rate=self.tx.get("errpatt_late_loss_rate"), shift=shift, + logger=logger, ) - eid_xor(errpat, bitstream, bitstream_processed) + eid_xor(errpat, bitstream, bitstream_processed, logger=logger) elif self.tx["type"] == "FER": signal, _ = read( in_file, fs=self.in_fs, nchannels=self.in_fmt.num_channels @@ -326,6 +330,7 @@ class IVAS(Processing): error_rate=self.tx["error_rate"], master_seed=self.tx["master_seed"], prerun_seed=self.tx["prerun_seed"], + logger=logger, ) return bitstream_processed, voip diff --git a/ivas_processing_scripts/processing/preprocessing_2.py b/ivas_processing_scripts/processing/preprocessing_2.py index 2a4bef67..fcb02860 100644 --- a/ivas_processing_scripts/processing/preprocessing_2.py +++ b/ivas_processing_scripts/processing/preprocessing_2.py @@ -163,7 +163,7 @@ class Preprocessing2(Processing): out_format = self.out_fmt loudness_signal, _, _ = get_loudness( - audio_object, loudness_format=out_format + audio_object, loudness_format=out_format, logger=logger ) logger.debug( f"Loudness of audio signal: {loudness_signal}LKFS ({out_format})" -- GitLab From bdde29c7d5f4f3bc071f877346bf105a033d0f02 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Tue, 9 Sep 2025 18:11:06 +0200 Subject: [PATCH 2/7] format + lint --- ivas_processing_scripts/audiotools/audio.py | 1 - .../audiotools/binaural_datasets/binaural_dataset.py | 3 +-- .../audiotools/binauralobjectrenderer.py | 5 ++--- .../audiotools/convert/channelbased.py | 1 - ivas_processing_scripts/audiotools/convert/objectbased.py | 1 - ivas_processing_scripts/audiotools/convert/omasa.py | 1 - ivas_processing_scripts/audiotools/convert/osba.py | 1 - ivas_processing_scripts/audiotools/convert/scenebased.py | 3 +-- ivas_processing_scripts/audiotools/metadata.py | 1 - ivas_processing_scripts/audiotools/utils.py | 1 - ivas_processing_scripts/audiotools/wrappers/bs1770.py | 3 +-- ivas_processing_scripts/audiotools/wrappers/esdru.py | 3 +-- ivas_processing_scripts/audiotools/wrappers/filter.py | 1 - ivas_processing_scripts/audiotools/wrappers/gen_patt.py | 6 +++--- .../audiotools/wrappers/masaRenderer.py | 1 - .../audiotools/wrappers/networkSimulator.py | 8 ++++++-- ivas_processing_scripts/audiotools/wrappers/p50fbmnru.py | 3 +-- ivas_processing_scripts/audiotools/wrappers/reverb.py | 5 ++--- ivas_processing_scripts/generation/config.py | 1 - ivas_processing_scripts/generation/generate_ismN_items.py | 1 - ivas_processing_scripts/generation/generate_masa_items.py | 1 - ivas_processing_scripts/generation/generate_mc_items.py | 1 - .../generation/generate_omasa_items.py | 1 - ivas_processing_scripts/generation/generate_osba_items.py | 1 - ivas_processing_scripts/generation/generate_sba_items.py | 1 - .../generation/generate_stereo_items.py | 1 - ivas_processing_scripts/processing/config.py | 1 - ivas_processing_scripts/processing/preprocessing_2.py | 1 - ivas_processing_scripts/processing/processing.py | 4 ++-- .../processing/processing_splitting_scaling.py | 1 - ivas_processing_scripts/processing/tx.py | 1 - ivas_processing_scripts/utils.py | 2 +- other/lp16k.py | 2 +- tests/test_audiotools_convert.py | 2 +- tests/test_binaries_present.py | 1 - tests/test_experiments.py | 6 +++--- tests/test_processing.py | 2 +- 37 files changed, 27 insertions(+), 52 deletions(-) diff --git a/ivas_processing_scripts/audiotools/audio.py b/ivas_processing_scripts/audiotools/audio.py index 3df2de94..292a061b 100755 --- a/ivas_processing_scripts/audiotools/audio.py +++ b/ivas_processing_scripts/audiotools/audio.py @@ -36,7 +36,6 @@ from typing import Optional, Union from warnings import warn import numpy as np - from ivas_processing_scripts.audiotools.audiofile import read from ivas_processing_scripts.audiotools.constants import ( BINAURAL_AUDIO_FORMATS, diff --git a/ivas_processing_scripts/audiotools/binaural_datasets/binaural_dataset.py b/ivas_processing_scripts/audiotools/binaural_datasets/binaural_dataset.py index cf8b03b8..d92709f5 100755 --- a/ivas_processing_scripts/audiotools/binaural_datasets/binaural_dataset.py +++ b/ivas_processing_scripts/audiotools/binaural_datasets/binaural_dataset.py @@ -35,8 +35,6 @@ from typing import Optional, Tuple, Union from warnings import warn import numpy as np -from scipy.io import loadmat - from ivas_processing_scripts.audiotools.audio import fromtype from ivas_processing_scripts.audiotools.constants import ( CHANNEL_BASED_AUDIO_FORMATS, @@ -44,6 +42,7 @@ from ivas_processing_scripts.audiotools.constants import ( SCENE_BASED_AUDIO_FORMATS, ) from ivas_processing_scripts.audiotools.EFAP import wrap_angles +from scipy.io import loadmat def load_hrtf( diff --git a/ivas_processing_scripts/audiotools/binauralobjectrenderer.py b/ivas_processing_scripts/audiotools/binauralobjectrenderer.py index f9488427..276e36a3 100755 --- a/ivas_processing_scripts/audiotools/binauralobjectrenderer.py +++ b/ivas_processing_scripts/audiotools/binauralobjectrenderer.py @@ -35,14 +35,13 @@ from itertools import repeat from typing import Optional, Tuple import numpy as np -from scipy.signal import convolve - from ivas_processing_scripts.audiotools.binaural_datasets.binaural_dataset import ( find_ir, ) from ivas_processing_scripts.audiotools.constants import IVAS_FRAME_LEN_MS from ivas_processing_scripts.audiotools.EFAP import wrap_angles from ivas_processing_scripts.utils import apply_func_parallel +from scipy.signal import convolve def barycentric_weights( @@ -338,7 +337,7 @@ def interpolate_2d( W_1 + W_2 + W_3 > 1.5 ): # on sphere sum of weights is not necessarily equal to one! raise ValueError( - f"Sum of positive barycentric weights larger than expected: {W_1 +W_2 +W_3}" + f"Sum of positive barycentric weights larger than expected: {W_1 + W_2 + W_3}" ) threshold_error = -1 * 10**-10 diff --git a/ivas_processing_scripts/audiotools/convert/channelbased.py b/ivas_processing_scripts/audiotools/convert/channelbased.py index 8e14b4a8..b4e4730c 100755 --- a/ivas_processing_scripts/audiotools/convert/channelbased.py +++ b/ivas_processing_scripts/audiotools/convert/channelbased.py @@ -34,7 +34,6 @@ from pathlib import Path from typing import Optional, Tuple, Union import numpy as np - from ivas_processing_scripts.audiotools import audio from ivas_processing_scripts.audiotools.audioarray import delay, framewise_io from ivas_processing_scripts.audiotools.binaural_datasets.binaural_dataset import ( diff --git a/ivas_processing_scripts/audiotools/convert/objectbased.py b/ivas_processing_scripts/audiotools/convert/objectbased.py index 1607c87b..e61566c6 100755 --- a/ivas_processing_scripts/audiotools/convert/objectbased.py +++ b/ivas_processing_scripts/audiotools/convert/objectbased.py @@ -35,7 +35,6 @@ from pathlib import Path from typing import Optional, Tuple, Union import numpy as np - from ivas_processing_scripts.audiotools import audio from ivas_processing_scripts.audiotools.audioarray import delay, framewise_io from ivas_processing_scripts.audiotools.binaural_datasets.binaural_dataset import ( diff --git a/ivas_processing_scripts/audiotools/convert/omasa.py b/ivas_processing_scripts/audiotools/convert/omasa.py index 35f2782f..9df37829 100644 --- a/ivas_processing_scripts/audiotools/convert/omasa.py +++ b/ivas_processing_scripts/audiotools/convert/omasa.py @@ -32,7 +32,6 @@ from copy import copy, deepcopy import numpy as np - from ivas_processing_scripts.audiotools import audio from ivas_processing_scripts.audiotools.convert.masa import ( render_masa_to_binaural, diff --git a/ivas_processing_scripts/audiotools/convert/osba.py b/ivas_processing_scripts/audiotools/convert/osba.py index 76cead88..f97329b3 100644 --- a/ivas_processing_scripts/audiotools/convert/osba.py +++ b/ivas_processing_scripts/audiotools/convert/osba.py @@ -32,7 +32,6 @@ from copy import copy, deepcopy import numpy as np - from ivas_processing_scripts.audiotools import audio from ivas_processing_scripts.audiotools.convert.objectbased import ( render_oba_to_binaural, diff --git a/ivas_processing_scripts/audiotools/convert/scenebased.py b/ivas_processing_scripts/audiotools/convert/scenebased.py index 1749a987..1967dc32 100755 --- a/ivas_processing_scripts/audiotools/convert/scenebased.py +++ b/ivas_processing_scripts/audiotools/convert/scenebased.py @@ -35,8 +35,6 @@ from typing import Optional, Union from warnings import warn import numpy as np -from scipy.special import factorial, lpmv - from ivas_processing_scripts.audiotools import audio from ivas_processing_scripts.audiotools.audioarray import delay, framewise_io from ivas_processing_scripts.audiotools.binaural_datasets.binaural_dataset import ( @@ -54,6 +52,7 @@ from ivas_processing_scripts.audiotools.EFAP import EFAP from ivas_processing_scripts.audiotools.rotation import Quat2RotMat, SHrotmatgen from ivas_processing_scripts.audiotools.wrappers.filter import resample_itu from ivas_processing_scripts.audiotools.wrappers.masaAnalyzer import masaAnalyzer +from scipy.special import factorial, lpmv """ SceneBasedAudio functions """ diff --git a/ivas_processing_scripts/audiotools/metadata.py b/ivas_processing_scripts/audiotools/metadata.py index 31bec3bf..021400c7 100755 --- a/ivas_processing_scripts/audiotools/metadata.py +++ b/ivas_processing_scripts/audiotools/metadata.py @@ -38,7 +38,6 @@ from tempfile import TemporaryDirectory from typing import Optional, TextIO, Tuple, Union import numpy as np - from ivas_processing_scripts.audiotools import audio from ivas_processing_scripts.audiotools.audio import fromtype from ivas_processing_scripts.audiotools.audioarray import trim diff --git a/ivas_processing_scripts/audiotools/utils.py b/ivas_processing_scripts/audiotools/utils.py index c8c5e94f..b5c0c093 100755 --- a/ivas_processing_scripts/audiotools/utils.py +++ b/ivas_processing_scripts/audiotools/utils.py @@ -34,7 +34,6 @@ from pathlib import Path from typing import Union import numpy as np - from ivas_processing_scripts.audiotools.rotation import Euler2Quat, Quat2Euler from ivas_processing_scripts.utils import get_abs_path diff --git a/ivas_processing_scripts/audiotools/wrappers/bs1770.py b/ivas_processing_scripts/audiotools/wrappers/bs1770.py index cc183a25..f282158f 100755 --- a/ivas_processing_scripts/audiotools/wrappers/bs1770.py +++ b/ivas_processing_scripts/audiotools/wrappers/bs1770.py @@ -39,7 +39,6 @@ from typing import Optional, Tuple, Union from warnings import warn import numpy as np - from ivas_processing_scripts.audiotools import audio, convert from ivas_processing_scripts.audiotools.audiofile import write from ivas_processing_scripts.audiotools.wrappers.filter import resample_itu @@ -84,7 +83,7 @@ def bs1770demo( binary = find_binary("bs1770demo") # checking if the new binary (with '-rms') is used - result_check = run([str(binary)], check=False, logger=logger) + result_check = run([str(binary)], check=False) if "-rms" not in result_check.stdout: raise RuntimeError( 'A bs1770demo executable without RMS support (cmdl option "-rms") was detected. Please update the bs1770demo executable. See bin/README.md for details.' diff --git a/ivas_processing_scripts/audiotools/wrappers/esdru.py b/ivas_processing_scripts/audiotools/wrappers/esdru.py index e7692c76..63969915 100755 --- a/ivas_processing_scripts/audiotools/wrappers/esdru.py +++ b/ivas_processing_scripts/audiotools/wrappers/esdru.py @@ -30,14 +30,13 @@ # the United Nations Convention on Contracts on the International Sales of Goods. # -from copy import deepcopy import logging +from copy import deepcopy from pathlib import Path from tempfile import TemporaryDirectory from typing import Optional import numpy as np - from ivas_processing_scripts.audiotools import audio from ivas_processing_scripts.audiotools.audiofile import read, write from ivas_processing_scripts.constants import DEFAULT_CONFIG_BINARIES diff --git a/ivas_processing_scripts/audiotools/wrappers/filter.py b/ivas_processing_scripts/audiotools/wrappers/filter.py index 7821aabd..bd71b104 100755 --- a/ivas_processing_scripts/audiotools/wrappers/filter.py +++ b/ivas_processing_scripts/audiotools/wrappers/filter.py @@ -40,7 +40,6 @@ from typing import Optional from warnings import warn import numpy as np - from ivas_processing_scripts.audiotools.audio import Audio, ChannelBasedAudio from ivas_processing_scripts.audiotools.audioarray import delay_compensation, pad_delay from ivas_processing_scripts.audiotools.audiofile import read, write diff --git a/ivas_processing_scripts/audiotools/wrappers/gen_patt.py b/ivas_processing_scripts/audiotools/wrappers/gen_patt.py index 3899d4f8..34e9ad21 100644 --- a/ivas_processing_scripts/audiotools/wrappers/gen_patt.py +++ b/ivas_processing_scripts/audiotools/wrappers/gen_patt.py @@ -157,16 +157,16 @@ def create_error_pattern( lines = [] with open(sta_file, "r") as sta_file_txt: lines.append(sta_file_txt.readline()) # not changed - lines.append(f"{sta_file_txt.readline()[:-2]}{frame_error_rate/100}\n") + lines.append(f"{sta_file_txt.readline()[:-2]}{frame_error_rate / 100}\n") lines.append(sta_file_txt.readline()) # not changed lines.append(f"{sta_file_txt.readline()[:-2]}{seed}\n") lines.append(sta_file_txt.readline()) # not changed lines.append( - f"{sta_file_txt.readline()[:-2]}{1-(frame_error_rate/100*2)}\n" + f"{sta_file_txt.readline()[:-2]}{1 - (frame_error_rate / 100 * 2)}\n" ) lines.append(sta_file_txt.readline()) # not changed lines.append( - f"{sta_file_txt.readline()[:-2]}{1-(frame_error_rate/100*2)}\n" + f"{sta_file_txt.readline()[:-2]}{1 - (frame_error_rate / 100 * 2)}\n" ) lines.append(sta_file_txt.readline()) # not changed diff --git a/ivas_processing_scripts/audiotools/wrappers/masaRenderer.py b/ivas_processing_scripts/audiotools/wrappers/masaRenderer.py index 5452847b..198db6f4 100755 --- a/ivas_processing_scripts/audiotools/wrappers/masaRenderer.py +++ b/ivas_processing_scripts/audiotools/wrappers/masaRenderer.py @@ -37,7 +37,6 @@ from typing import Optional from warnings import warn import numpy as np - from ivas_processing_scripts.audiotools import audio from ivas_processing_scripts.audiotools.audiofile import read, write from ivas_processing_scripts.audiotools.wrappers.filter import resample_itu diff --git a/ivas_processing_scripts/audiotools/wrappers/networkSimulator.py b/ivas_processing_scripts/audiotools/wrappers/networkSimulator.py index af8dff7b..08dda1af 100644 --- a/ivas_processing_scripts/audiotools/wrappers/networkSimulator.py +++ b/ivas_processing_scripts/audiotools/wrappers/networkSimulator.py @@ -222,9 +222,13 @@ def apply_network_simulator( # compute offset of error pattern len_pattern = length_pattern(error_pattern) if error_profile: - offset = random_seed((0, len_pattern - 1), master_seed, error_profile, False, logger=logger) + offset = random_seed( + (0, len_pattern - 1), master_seed, error_profile, False, logger=logger + ) else: - offset = random_seed((0, len_pattern - 1), master_seed, errpatt_seed, False, logger=logger) + offset = random_seed( + (0, len_pattern - 1), master_seed, errpatt_seed, False, logger=logger + ) # apply error pattern network_simulator( diff --git a/ivas_processing_scripts/audiotools/wrappers/p50fbmnru.py b/ivas_processing_scripts/audiotools/wrappers/p50fbmnru.py index 5dd0d33d..e59d6818 100755 --- a/ivas_processing_scripts/audiotools/wrappers/p50fbmnru.py +++ b/ivas_processing_scripts/audiotools/wrappers/p50fbmnru.py @@ -30,15 +30,14 @@ # the United Nations Convention on Contracts on the International Sales of Goods. # -from copy import deepcopy import logging +from copy import deepcopy from pathlib import Path from tempfile import TemporaryDirectory from typing import Optional from warnings import warn import numpy as np - from ivas_processing_scripts.audiotools import audio from ivas_processing_scripts.audiotools.audiofile import read, write from ivas_processing_scripts.audiotools.wrappers.filter import resample_itu diff --git a/ivas_processing_scripts/audiotools/wrappers/reverb.py b/ivas_processing_scripts/audiotools/wrappers/reverb.py index 0cda00a8..1628ee3e 100644 --- a/ivas_processing_scripts/audiotools/wrappers/reverb.py +++ b/ivas_processing_scripts/audiotools/wrappers/reverb.py @@ -30,21 +30,20 @@ # the United Nations Convention on Contracts on the International Sales of Goods. # -from copy import copy import logging +from copy import copy from pathlib import Path from tempfile import TemporaryDirectory from typing import Optional import numpy as np -from scipy.fft import fft - from ivas_processing_scripts.audiotools import audio from ivas_processing_scripts.audiotools.audio import Audio from ivas_processing_scripts.audiotools.audiofile import read, write from ivas_processing_scripts.audiotools.wrappers.filter import resample_itu from ivas_processing_scripts.constants import DEFAULT_CONFIG_BINARIES from ivas_processing_scripts.utils import find_binary, run +from scipy.fft import fft def reverb( diff --git a/ivas_processing_scripts/generation/config.py b/ivas_processing_scripts/generation/config.py index b61aa881..6533785e 100644 --- a/ivas_processing_scripts/generation/config.py +++ b/ivas_processing_scripts/generation/config.py @@ -33,7 +33,6 @@ from copy import deepcopy import yaml - from ivas_processing_scripts.generation.constants import DEFAULT_CONFIG, REQUIRED_KEYS diff --git a/ivas_processing_scripts/generation/generate_ismN_items.py b/ivas_processing_scripts/generation/generate_ismN_items.py index 948c6d48..b7d13434 100644 --- a/ivas_processing_scripts/generation/generate_ismN_items.py +++ b/ivas_processing_scripts/generation/generate_ismN_items.py @@ -36,7 +36,6 @@ from itertools import groupby, repeat from pathlib import Path import numpy as np - from ivas_processing_scripts.audiotools import audio, audioarray, audiofile, metadata from ivas_processing_scripts.audiotools.convert.objectbased import convert_objectbased from ivas_processing_scripts.audiotools.wrappers.bs1770 import loudness_norm diff --git a/ivas_processing_scripts/generation/generate_masa_items.py b/ivas_processing_scripts/generation/generate_masa_items.py index 86d62521..6788dacf 100644 --- a/ivas_processing_scripts/generation/generate_masa_items.py +++ b/ivas_processing_scripts/generation/generate_masa_items.py @@ -37,7 +37,6 @@ from itertools import groupby, repeat from pathlib import Path import numpy as np - from ivas_processing_scripts.audiotools import audio, audioarray, audiofile from ivas_processing_scripts.audiotools.convert.masa import convert_masa from ivas_processing_scripts.audiotools.convert.scenebased import render_sba_to_masa diff --git a/ivas_processing_scripts/generation/generate_mc_items.py b/ivas_processing_scripts/generation/generate_mc_items.py index b082bf11..1c869f15 100644 --- a/ivas_processing_scripts/generation/generate_mc_items.py +++ b/ivas_processing_scripts/generation/generate_mc_items.py @@ -37,7 +37,6 @@ from itertools import groupby, repeat from pathlib import Path import numpy as np - from ivas_processing_scripts.audiotools import audio, audioarray, audiofile from ivas_processing_scripts.audiotools.convert.channelbased import ( render_cba_to_binaural, diff --git a/ivas_processing_scripts/generation/generate_omasa_items.py b/ivas_processing_scripts/generation/generate_omasa_items.py index b8aba2b6..698b966c 100644 --- a/ivas_processing_scripts/generation/generate_omasa_items.py +++ b/ivas_processing_scripts/generation/generate_omasa_items.py @@ -37,7 +37,6 @@ from itertools import groupby, repeat from pathlib import Path import numpy as np - from ivas_processing_scripts.audiotools import audio, audioarray, audiofile, metadata from ivas_processing_scripts.audiotools.convert.omasa import convert_omasa from ivas_processing_scripts.audiotools.convert.osba import convert_osba diff --git a/ivas_processing_scripts/generation/generate_osba_items.py b/ivas_processing_scripts/generation/generate_osba_items.py index 8190f5ca..698d881d 100644 --- a/ivas_processing_scripts/generation/generate_osba_items.py +++ b/ivas_processing_scripts/generation/generate_osba_items.py @@ -37,7 +37,6 @@ from itertools import groupby, repeat from pathlib import Path import numpy as np - from ivas_processing_scripts.audiotools import audio, audioarray, audiofile, metadata from ivas_processing_scripts.audiotools.convert.osba import convert_osba from ivas_processing_scripts.audiotools.wrappers.bs1770 import loudness_norm diff --git a/ivas_processing_scripts/generation/generate_sba_items.py b/ivas_processing_scripts/generation/generate_sba_items.py index 4f3d19d6..e521f7ab 100644 --- a/ivas_processing_scripts/generation/generate_sba_items.py +++ b/ivas_processing_scripts/generation/generate_sba_items.py @@ -37,7 +37,6 @@ from itertools import groupby, repeat from pathlib import Path import numpy as np - from ivas_processing_scripts.audiotools import audio, audioarray, audiofile from ivas_processing_scripts.audiotools.convert.objectbased import convert_objectbased from ivas_processing_scripts.audiotools.convert.scenebased import convert_scenebased diff --git a/ivas_processing_scripts/generation/generate_stereo_items.py b/ivas_processing_scripts/generation/generate_stereo_items.py index 43e8b432..41e93c56 100644 --- a/ivas_processing_scripts/generation/generate_stereo_items.py +++ b/ivas_processing_scripts/generation/generate_stereo_items.py @@ -38,7 +38,6 @@ from itertools import groupby, repeat from pathlib import Path import numpy as np - from ivas_processing_scripts.audiotools import audio, audioarray, audiofile from ivas_processing_scripts.audiotools.wrappers.bs1770 import loudness_norm from ivas_processing_scripts.audiotools.wrappers.reverb import reverb_stereo diff --git a/ivas_processing_scripts/processing/config.py b/ivas_processing_scripts/processing/config.py index bf852607..0e31f317 100755 --- a/ivas_processing_scripts/processing/config.py +++ b/ivas_processing_scripts/processing/config.py @@ -36,7 +36,6 @@ from pathlib import Path from typing import Union import yaml - from ivas_processing_scripts.constants import ( DEFAULT_CONFIG, REQUIRED_KEYS, diff --git a/ivas_processing_scripts/processing/preprocessing_2.py b/ivas_processing_scripts/processing/preprocessing_2.py index fcb02860..710b9cf0 100644 --- a/ivas_processing_scripts/processing/preprocessing_2.py +++ b/ivas_processing_scripts/processing/preprocessing_2.py @@ -35,7 +35,6 @@ from pathlib import Path from warnings import warn import numpy as np - from ivas_processing_scripts.audiotools import audio from ivas_processing_scripts.audiotools.audioarray import trim from ivas_processing_scripts.audiotools.audiofile import write diff --git a/ivas_processing_scripts/processing/processing.py b/ivas_processing_scripts/processing/processing.py index bdda821f..5b02f9cd 100755 --- a/ivas_processing_scripts/processing/processing.py +++ b/ivas_processing_scripts/processing/processing.py @@ -272,12 +272,12 @@ def concat_teardown( if splits[-1] > len(x): warn( f"Last split index {splits[-1]} is larger than the signal length {len(x)}" - f"\nLast split exceeds signal length by {((splits[-1] - len(x))*1000)/fs:.2f} ms" + f"\nLast split exceeds signal length by {((splits[-1] - len(x)) * 1000) / fs:.2f} ms" ) elif (splits[-1] < len(x)) and not tracefile_needed: warn( f"Last split index {splits[-1]} is smaller than the signal length {len(x)}" - f"\nLast split shorter than signal length by {((len(x) - splits[-1])*1000)/fs:.2f} ms" + f"\nLast split shorter than signal length by {((len(x) - splits[-1]) * 1000) / fs:.2f} ms" ) split_signals = [] diff --git a/ivas_processing_scripts/processing/processing_splitting_scaling.py b/ivas_processing_scripts/processing/processing_splitting_scaling.py index 5f9ac34f..88e5ed33 100644 --- a/ivas_processing_scripts/processing/processing_splitting_scaling.py +++ b/ivas_processing_scripts/processing/processing_splitting_scaling.py @@ -4,7 +4,6 @@ from itertools import repeat from pathlib import Path import numpy as np - from ivas_processing_scripts.audiotools import audio from ivas_processing_scripts.audiotools.audiofile import read, write from ivas_processing_scripts.audiotools.metadata import write_ISM_metadata_in_file diff --git a/ivas_processing_scripts/processing/tx.py b/ivas_processing_scripts/processing/tx.py index 4aab2d7f..f5c0c902 100755 --- a/ivas_processing_scripts/processing/tx.py +++ b/ivas_processing_scripts/processing/tx.py @@ -35,7 +35,6 @@ from typing import Optional from warnings import warn import numpy as np - from ivas_processing_scripts.processing.config import TestConfig from ivas_processing_scripts.utils import get_abs_path diff --git a/ivas_processing_scripts/utils.py b/ivas_processing_scripts/utils.py index a12b886a..af55590a 100755 --- a/ivas_processing_scripts/utils.py +++ b/ivas_processing_scripts/utils.py @@ -284,7 +284,7 @@ def pairwise(iter): def progressbar_update(progress, count, width): fill = int(width * progress / count) print( - f"{int(progress/count*100):3d}%{'['}{'='*fill}{(' '*(width-fill))}{']'}{progress:4d}/{count:4d}", + f"{int(progress / count * 100):3d}%{'['}{'=' * fill}{(' ' * (width - fill))}{']'}{progress:4d}/{count:4d}", end="\r", file=sys.stdout, flush=True, diff --git a/other/lp16k.py b/other/lp16k.py index c9ae6706..6f806569 100755 --- a/other/lp16k.py +++ b/other/lp16k.py @@ -46,7 +46,7 @@ def lp16k(in_file, out_file): x = fromfile("STEREO", in_file) if x.fs != 48000: raise ValueError( - f"Unsupported sampling rate {x.fs//1000} kHz for input file {in_file} - only 48 kHz is supported!" + f"Unsupported sampling rate {x.fs // 1000} kHz for input file {in_file} - only 48 kHz is supported!" ) # save length of audio since resampling can alter the length by one sample due to rounding diff --git a/tests/test_audiotools_convert.py b/tests/test_audiotools_convert.py index 6a6c7f2c..6bca6e0c 100644 --- a/tests/test_audiotools_convert.py +++ b/tests/test_audiotools_convert.py @@ -34,9 +34,9 @@ from pathlib import PurePath from typing import Optional import pytest - from ivas_processing_scripts.audiotools.audiofile import read from ivas_processing_scripts.audiotools.convert import convert_file + from tests.constants import ( CUSTOM_LAYOUT_DIR, CUSTOM_LS_TO_TEST, diff --git a/tests/test_binaries_present.py b/tests/test_binaries_present.py index 05045fe4..18776721 100755 --- a/tests/test_binaries_present.py +++ b/tests/test_binaries_present.py @@ -31,7 +31,6 @@ # import pytest - from ivas_processing_scripts.utils import find_binary BINARIES = [ diff --git a/tests/test_experiments.py b/tests/test_experiments.py index 34d8ddf3..91f2d96d 100644 --- a/tests/test_experiments.py +++ b/tests/test_experiments.py @@ -35,13 +35,13 @@ import sys from pathlib import Path import pytest -from numpy.random import random, seed - -from ivas_processing_scripts import main as generate_test from ivas_processing_scripts.audiotools import audio from ivas_processing_scripts.audiotools.audiofile import read, write from ivas_processing_scripts.processing.config import TestConfig from ivas_processing_scripts.utils import list_audio_or_md +from numpy.random import random, seed + +from ivas_processing_scripts import main as generate_test from tests.constants import ( FORMAT_TO_METADATA_FILES, INPUT_EXPERIMENT_NAMES, diff --git a/tests/test_processing.py b/tests/test_processing.py index 1eac22b2..6af36297 100644 --- a/tests/test_processing.py +++ b/tests/test_processing.py @@ -34,9 +34,9 @@ import shutil from pathlib import Path import pytest +from ivas_processing_scripts.processing.config import TestConfig from ivas_processing_scripts import main as generate_test -from ivas_processing_scripts.processing.config import TestConfig from tests.constants import INPUT_CONFIG_DIR, INPUT_CONFIG_FILES -- GitLab From 6a9dece5e9b068a0edf3a838ea7b5e5ce5fcea02 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 10 Sep 2025 09:01:51 +0200 Subject: [PATCH 3/7] fix printout and regex for BS1534 collection script --- collection-scripts/characterization/bs1534.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/collection-scripts/characterization/bs1534.py b/collection-scripts/characterization/bs1534.py index 9db1ac4c..a7c95bad 100644 --- a/collection-scripts/characterization/bs1534.py +++ b/collection-scripts/characterization/bs1534.py @@ -5,7 +5,7 @@ import shutil from pathlib import Path PRELIMINARY_SUBSTRINGS = ["s13", "s14", "s15", "s16"] -PRELIMINARY_PATTERN = re.compile(r"dm[0-9]*a[1-9](s[0-9]*)\.c[0-1][0-9]\.wav") +PRELIMINARY_PATTERN = re.compile(r"[a-z]m[0-9]*a[1-9](s[0-9]*)\.c[0-1][0-9]\.wav") def repo_root_dir() -> Path: @@ -25,8 +25,6 @@ def copy_final_items(verbose: bool = False): prelim_dir = final_dir / "preliminaries" prelim_dir.mkdir(parents=True, exist_ok=True) - files_copied = 0 - for proc_output in exp_dir.glob("proc_output*"): condition_dirs = proc_output.glob("c0?") for condition_dir in condition_dirs: -- GitLab From 455b6d659f3e21a5db1e4ed98f3091d085055319 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Wed, 10 Sep 2025 11:54:21 +0200 Subject: [PATCH 4/7] ensure error patterns are produced with G.192 word format --- ivas_processing_scripts/processing/ivas.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ivas_processing_scripts/processing/ivas.py b/ivas_processing_scripts/processing/ivas.py index 01f8220f..3314aab6 100755 --- a/ivas_processing_scripts/processing/ivas.py +++ b/ivas_processing_scripts/processing/ivas.py @@ -303,6 +303,7 @@ class IVAS(Processing): fer_pattern=errpat, late_loss_rate=self.tx.get("errpatt_late_loss_rate"), shift=shift, + flag_word=True, ) eid_xor(errpat, bitstream, bitstream_processed) elif self.tx["type"] == "FER": -- GitLab From ecac007bff4a33783c4b50b89371234d00e9c147 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 10 Sep 2025 12:46:51 +0200 Subject: [PATCH 5/7] improve printout of duplicate hashes to make it more readable --- other/get_md5.py | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/other/get_md5.py b/other/get_md5.py index 9ad4ed2f..25390a4a 100644 --- a/other/get_md5.py +++ b/other/get_md5.py @@ -44,17 +44,31 @@ def get_hash_line_for_file(file: Path, output_dir: Path): return hashline +def get_duplicates(hashlines: list) -> dict: + count = Counter([line.split()[-1] for line in hashlines]) + duplicates = {} + for hash, count in count.items(): + if count == 1: + continue + + files = [line.replace(hash, "").strip() for line in hashlines if hash in line] + duplicates[hash] = files + + return duplicates + + def main(output_dir, out_file): wav_files = sorted(output_dir.glob("*/**/*c[0-9][0-9].wav")) hashlines = [get_hash_line_for_file(f, output_dir) for f in wav_files] - count = Counter([line.split()[-1] for line in hashlines]) - duplicates = [line for line in hashlines if count[line.split()[-1]] != 1] + duplicates = get_duplicates(hashlines) if len(duplicates) != 0: - print("Found duplicate hashes in these lines:") - for dup in duplicates: - print(dup) + print( + "Found duplicate hashes! The following hashes were found in multipe files:" + ) + for hash, files in duplicates.items(): + print(f"{hash} - {', '.join(files)}") with open(out_file, "w") as f: f.writelines(hashlines) -- GitLab From f100070f082a28bced267438bf0709bf6b888551 Mon Sep 17 00:00:00 2001 From: Archit Tamarapu Date: Wed, 10 Sep 2025 12:57:00 +0200 Subject: [PATCH 6/7] update README.md with information about reporting issues --- README.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/README.md b/README.md index 8f475ab2..19fad756 100755 --- a/README.md +++ b/README.md @@ -259,6 +259,40 @@ This is essentially the contents of the `proc_final` directory produced from the └── BS1534-1_hashes.txt ``` +## Reporting issues + +If you encounter an issue while running the characterization tests, please follow the steps below depending on the type of issue you encounter. + +### Crash in fixed point codec + +Example output for a crash: + +```shell +SystemError: Command returned non-zero exit status (-6): ivas_processing_scripts/bin/IVAS_cod_fx -max_band SWB -q -stereo 24400 32 experiments/characterization/P800_ACR-1/proc_output/cat1/out_-26LKFS/tmp_c27/20ms_aligned_files_concatenated.cod_fmt.wav experiments/characterization/P800_ACR-1/proc_output/cat1/out_-26LKFS/tmp_c27/20ms_aligned_files_concatenated.ivas.192 +``` + +1. Copy the **entire traceback** to a text file for upload +2. Inspect the output for more information, and possibly the command that caused the crash, example: +3. Try to determine the output directory used, usually with the prefix `tmp_` in `proc_output`, in this case `tmp_c27` +4. Inspect the output files in the given directory, checking `.log` files for further info about commands that were run +5. Try to reproduce the crash outside of the scripts +6. Upload the required files to a new folder under [_EXTERNAL_IVAS_CHAR_MC/Issues](https://dolby.box.com/s/oc7k3ck8n04wbcknxu71t3wyvkq2cev4) +7. File an issue on the [BASOP repository](https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/issues) + - Report git SHA for float reference codec, fixed point codec and processing scripts! + +### Crash / unexpected behaviour in the scripts + +1. Copy the **entire traceback** to a text file for upload +2. Inspect the output for more information, and where the exception occurred +3. If it is related to a certain condition in the script identify the related `tmp_` folder in `proc_output` +4. Collect the following files for upload + - The `.yml` configuration file in **`proc_output`** - this is produced by the scripts and is NOT the one used to run the experiment + - The main log file for the experiment, named the same as the above file with suffix `.log` + - Any files in the related `tmp_` condition directory, if applicable. Use your discretion to choose pertinent files. +5. Upload the required files to a new folder under [_EXTERNAL_IVAS_CHAR_MC/Issues](https://dolby.box.com/s/oc7k3ck8n04wbcknxu71t3wyvkq2cev4) +6. File an issue on the [Processing scripts repository](https://forge.3gpp.org/rep/ivas-codec-pc/ivas-processing-scripts/-/issues) + - Report git SHA for float reference codec, fixed point codec and processing scripts! + # Quick guide: How to set up a listening test This section describes step by step how to set up a listening test according to the Processing Plan (IVAS-7) and Test Plan (IVAS-8). -- GitLab From ab99ea39e9946ffe54c0289b0190dc2bea3456f8 Mon Sep 17 00:00:00 2001 From: Jan Kiene Date: Wed, 10 Sep 2025 13:43:53 +0200 Subject: [PATCH 7/7] adjust hash generation section in readme --- README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 19fad756..50926ab0 100755 --- a/README.md +++ b/README.md @@ -118,9 +118,14 @@ After the processing is finished, the outputs will be present in the respective - These scripts collect items from each experiments `proc_output*` folder(s) and puts the needed files for the listening test into a `proc_final` folder. This folder needs to be uploaded for the dry run and the final delivery of the listening items to the labs. -### Hash generation +### Hash generation and checking for duplicates -The hashes for the `proc_final` can be generated using the [get_md5.py](other/get_md5.py) script: +The hashes for the `proc_final` can be generated using the [get_md5.py](other/get_md5.py) script. +This script also checks for identical hashes and thus identifies duplicates in the output files which are reported in a printout. +When generating hashes one should check if duplicates are reported and if yes, what files are identical - note that there might be duplicates between the actual test and the preliminaries/training which is ok. +If there is a case with three or more items being the same or two items being the same inside the test or the preliminaries, the input files should be checked for duplicates. + +Script usage: ```shell > python other/get_md5.py --help -- GitLab