Loading ivas_processing_scripts/audiotools/convert/__init__.py +1 −1 Original line number Diff line number Diff line Loading @@ -251,7 +251,7 @@ def process_audio( logger.debug( f"Applying loudness adjustment to {loudness} LKFS for format {loudness_fmt} using ITU STL bs1770demo" ) x.audio = loudness_norm(x, loudness, loudness_fmt) x.audio = loudness_norm(x, loudness, loudness_fmt, logger=logger) """low-pass filtering""" if fc is not None: Loading ivas_processing_scripts/audiotools/wrappers/bs1770.py +38 −16 Original line number Diff line number Diff line Loading @@ -45,9 +45,6 @@ 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, get_devnull, run logger = logging.getLogger("__main__") logger.setLevel(logging.DEBUG) def bs1770demo( input: audio.Audio, Loading Loading @@ -131,7 +128,7 @@ def bs1770demo( write(tmp_file, tmp_sig, 48000) # run command result = run(cmd, logger=logger) result = run(cmd) # parse output measured_loudness = float(result.stdout.splitlines()[3].split(":")[1]) Loading Loading @@ -198,6 +195,8 @@ def loudness_norm( input: audio.Audio, target_loudness: Optional[float] = -26, loudness_format: Optional[str] = None, logger: Optional[logging.Logger] = None, file_name_logging: Optional[Union[str, Path]] = None, ) -> np.ndarray: """ Iterative loudness normalization using ITU-R BS.1770-4 Loading @@ -212,6 +211,10 @@ def loudness_norm( Desired loudness level in LKFS loudness_format: Optional[str] Loudness format to render to for loudness computation (default input format) logger: Optional[logging.Logger] Logger to log loudness information file_name_logging: Optional[Union[str, Path]] Name of processed file for logging information Returns ------- Loading @@ -224,22 +227,38 @@ def loudness_norm( scale_factor = 1 num_iter = 1 while np.abs(measured_loudness - target_loudness) > 0.5 and num_iter < 10: measured_loudness, scale_factor_new = get_loudness( # save loudness before and after scaling for the logger info loudness_before, scale_factor_new = get_loudness( input, target_loudness, loudness_format ) while np.abs(measured_loudness - target_loudness) > 0.5 and num_iter < 10: # scale input input.audio *= scale_factor_new # update scale factor scale_factor *= scale_factor_new # measure loudness and get scaling factor measured_loudness, scale_factor_new = get_loudness( input, target_loudness, loudness_format ) num_iter += 1 loudness_after = measured_loudness # log loudness before and after adjustment if logger: if file_name_logging: logger.debug(f"File {file_name_logging} loudness; before: {loudness_before}, after: {loudness_after}") else: logger.debug(f"Loudness; before: {loudness_before}, after: {loudness_after}") if num_iter >= 10: warn( f"Loudness did not converge to desired value, stopping at: {measured_loudness:.2f}" f"Loudness did not converge to desired value, stopping at: {loudness_after:.2f}" ) return input.audio Loading @@ -249,6 +268,7 @@ def scale_files( file_list: list[list[Union[Path, str]]], fmt: str, loudness: float, loudness_format: Optional[str] = None, fs: Optional[int] = 48000, in_meta: Optional[list] = None, logger: Optional[logging.Logger] = None, Loading @@ -264,15 +284,22 @@ def scale_files( Audio format of files in list loudness: float Desired loudness level in LKFS/dBov loudness_format: Optional[str] Format for loudness measurement fs: Optional[int] Sampling rate in_meta: Optional[list] Metadata for ISM with same structure as file_list but one layer more for the list of metadata for one file logger: Optional[logging.Logger] Logger to log loudness information """ if fmt.startswith("ISM") and in_meta: if fmt.startswith("ISM"): if in_meta: meta_bool = True else: raise ValueError("No metadata available for loudness measurement") else: in_meta = copy.copy(file_list) meta_bool = False Loading @@ -285,13 +312,8 @@ def scale_files( else: audio_obj = audio.fromfile(fmt, file, fs) # TODO: just for testing: remove later if logger: measured_loudness, _ = get_loudness(audio_obj) logger.info(f"measured loudness of file {file.name} for condition {file.parent.name}: {measured_loudness}") # adjust loudness scaled_audio = loudness_norm(audio_obj, loudness) scaled_audio = loudness_norm(audio_obj, loudness, loudness_format, logger, file) # write into file write(file, scaled_audio, audio_obj.fs) Loading ivas_processing_scripts/processing/processing.py +1 −0 Original line number Diff line number Diff line Loading @@ -354,6 +354,7 @@ def reverse_process_2(cfg, logger): out_paths_splits, cfg.postprocessing["fmt"], cfg.postprocessing["loudness"], cfg.postprocessing.get("loudness_fmt", None), cfg.postprocessing["fs"], out_meta_splits, logger, Loading Loading
ivas_processing_scripts/audiotools/convert/__init__.py +1 −1 Original line number Diff line number Diff line Loading @@ -251,7 +251,7 @@ def process_audio( logger.debug( f"Applying loudness adjustment to {loudness} LKFS for format {loudness_fmt} using ITU STL bs1770demo" ) x.audio = loudness_norm(x, loudness, loudness_fmt) x.audio = loudness_norm(x, loudness, loudness_fmt, logger=logger) """low-pass filtering""" if fc is not None: Loading
ivas_processing_scripts/audiotools/wrappers/bs1770.py +38 −16 Original line number Diff line number Diff line Loading @@ -45,9 +45,6 @@ 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, get_devnull, run logger = logging.getLogger("__main__") logger.setLevel(logging.DEBUG) def bs1770demo( input: audio.Audio, Loading Loading @@ -131,7 +128,7 @@ def bs1770demo( write(tmp_file, tmp_sig, 48000) # run command result = run(cmd, logger=logger) result = run(cmd) # parse output measured_loudness = float(result.stdout.splitlines()[3].split(":")[1]) Loading Loading @@ -198,6 +195,8 @@ def loudness_norm( input: audio.Audio, target_loudness: Optional[float] = -26, loudness_format: Optional[str] = None, logger: Optional[logging.Logger] = None, file_name_logging: Optional[Union[str, Path]] = None, ) -> np.ndarray: """ Iterative loudness normalization using ITU-R BS.1770-4 Loading @@ -212,6 +211,10 @@ def loudness_norm( Desired loudness level in LKFS loudness_format: Optional[str] Loudness format to render to for loudness computation (default input format) logger: Optional[logging.Logger] Logger to log loudness information file_name_logging: Optional[Union[str, Path]] Name of processed file for logging information Returns ------- Loading @@ -224,22 +227,38 @@ def loudness_norm( scale_factor = 1 num_iter = 1 while np.abs(measured_loudness - target_loudness) > 0.5 and num_iter < 10: measured_loudness, scale_factor_new = get_loudness( # save loudness before and after scaling for the logger info loudness_before, scale_factor_new = get_loudness( input, target_loudness, loudness_format ) while np.abs(measured_loudness - target_loudness) > 0.5 and num_iter < 10: # scale input input.audio *= scale_factor_new # update scale factor scale_factor *= scale_factor_new # measure loudness and get scaling factor measured_loudness, scale_factor_new = get_loudness( input, target_loudness, loudness_format ) num_iter += 1 loudness_after = measured_loudness # log loudness before and after adjustment if logger: if file_name_logging: logger.debug(f"File {file_name_logging} loudness; before: {loudness_before}, after: {loudness_after}") else: logger.debug(f"Loudness; before: {loudness_before}, after: {loudness_after}") if num_iter >= 10: warn( f"Loudness did not converge to desired value, stopping at: {measured_loudness:.2f}" f"Loudness did not converge to desired value, stopping at: {loudness_after:.2f}" ) return input.audio Loading @@ -249,6 +268,7 @@ def scale_files( file_list: list[list[Union[Path, str]]], fmt: str, loudness: float, loudness_format: Optional[str] = None, fs: Optional[int] = 48000, in_meta: Optional[list] = None, logger: Optional[logging.Logger] = None, Loading @@ -264,15 +284,22 @@ def scale_files( Audio format of files in list loudness: float Desired loudness level in LKFS/dBov loudness_format: Optional[str] Format for loudness measurement fs: Optional[int] Sampling rate in_meta: Optional[list] Metadata for ISM with same structure as file_list but one layer more for the list of metadata for one file logger: Optional[logging.Logger] Logger to log loudness information """ if fmt.startswith("ISM") and in_meta: if fmt.startswith("ISM"): if in_meta: meta_bool = True else: raise ValueError("No metadata available for loudness measurement") else: in_meta = copy.copy(file_list) meta_bool = False Loading @@ -285,13 +312,8 @@ def scale_files( else: audio_obj = audio.fromfile(fmt, file, fs) # TODO: just for testing: remove later if logger: measured_loudness, _ = get_loudness(audio_obj) logger.info(f"measured loudness of file {file.name} for condition {file.parent.name}: {measured_loudness}") # adjust loudness scaled_audio = loudness_norm(audio_obj, loudness) scaled_audio = loudness_norm(audio_obj, loudness, loudness_format, logger, file) # write into file write(file, scaled_audio, audio_obj.fs) Loading
ivas_processing_scripts/processing/processing.py +1 −0 Original line number Diff line number Diff line Loading @@ -354,6 +354,7 @@ def reverse_process_2(cfg, logger): out_paths_splits, cfg.postprocessing["fmt"], cfg.postprocessing["loudness"], cfg.postprocessing.get("loudness_fmt", None), cfg.postprocessing["fs"], out_meta_splits, logger, Loading