diff --git a/ivas_processing_scripts/audiotools/wrappers/bs1770.py b/ivas_processing_scripts/audiotools/wrappers/bs1770.py index 7321b02d2537a1070386c3b18a80816cccb9ac81..20bc86b4bbacd3796a19aa407f266bf262a407a8 100755 --- a/ivas_processing_scripts/audiotools/wrappers/bs1770.py +++ b/ivas_processing_scripts/audiotools/wrappers/bs1770.py @@ -33,6 +33,7 @@ import copy import logging import re +import subprocess as sp from pathlib import Path from tempfile import TemporaryDirectory from typing import Optional, Tuple, Union @@ -53,6 +54,7 @@ logger.setLevel(logging.DEBUG) def bs1770demo( input: audio.Audio, target_loudness: Optional[float] = -26, + rms: Optional[bool] = False, ) -> Tuple[float, float]: """ Wrapper for ITU-R BS.1770-4, requires bs1770demo binary @@ -82,6 +84,16 @@ def bs1770demo( else: binary = find_binary("bs1770demo") + # checking if the new binary (with '-rms') is used + with TemporaryDirectory() as tmp_dir_test: + tmp_dir_test = Path(tmp_dir_test) + result = sp.run(str(binary), shell=True, stdout=sp.PIPE, stderr=sp.PIPE) + result_stdout = result.stdout.decode("utf-8") + if "-rms" not in result_stdout: + raise RuntimeError( + 'An bs1770demo executable without RMS support (cmdl option "-rms") was detected. Please update the bs1770demo executable. See bin/README.md for details.' + ) + if not isinstance(input, audio.BinauralAudio) and not isinstance( input, audio.ChannelBasedAudio ): @@ -131,6 +143,9 @@ def bs1770demo( # write temporary file write(tmp_file, tmp_sig, 48000) + # using rms if true + if rms: + cmd.insert(1, "-rms") # run command result = run(cmd, logger=logger) @@ -150,6 +165,7 @@ def get_loudness( input: audio.Audio, target_loudness: Optional[float] = -26, loudness_format: Optional[str] = None, + rms: Optional[bool] = False, ) -> Tuple[float, float]: """ Loudness measurement using ITU-R BS.1770-4 @@ -196,14 +212,17 @@ def get_loudness( convert.format_conversion(input, tmp) else: tmp.audio = input.audio - - return bs1770demo(tmp, target_loudness) + if rms: + return bs1770demo(tmp, target_loudness, rms=True) + else: + return bs1770demo(tmp, target_loudness) def loudness_norm( input: audio.Audio, target_loudness: Optional[float] = -26, loudness_format: Optional[str] = None, + rms: Optional[bool] = False, ) -> np.ndarray: """ Iterative loudness normalization using ITU-R BS.1770-4 @@ -232,7 +251,10 @@ def loudness_norm( while np.abs(measured_loudness - target_loudness) > 0.5 and num_iter < 10: measured_loudness, scale_factor_new = get_loudness( - input, target_loudness, loudness_format + input, + target_loudness, + loudness_format, + rms=rms, ) # scale input @@ -257,6 +279,7 @@ def scale_files( loudness: float, fs: Optional[int] = 48000, in_meta: Optional[list] = None, + rms: Optional[bool] = False, ) -> None: """ Scales audio files to desired loudness @@ -291,7 +314,10 @@ def scale_files( audio_obj = audio.fromfile(fmt, file, fs) # adjust loudness - scaled_audio = loudness_norm(audio_obj, loudness) + if rms: + scaled_audio = loudness_norm(audio_obj, loudness, rms=True) + else: + scaled_audio = loudness_norm(audio_obj, loudness) # write into file write(file, scaled_audio, audio_obj.fs) diff --git a/ivas_processing_scripts/processing/preprocessing_2.py b/ivas_processing_scripts/processing/preprocessing_2.py index 0bacc8eeb6580fe8f05db7355a0839fc475c45a3..5d6c51a388c7c532630b186cecb9840fee393567 100644 --- a/ivas_processing_scripts/processing/preprocessing_2.py +++ b/ivas_processing_scripts/processing/preprocessing_2.py @@ -149,7 +149,9 @@ class Preprocessing2(Processing): )[: len(audio_object.audio)] # scale background noise to desired loudness based on output format - noise_object.audio = loudness_norm(noise_object, loudness_noise, out_format) + noise_object.audio = loudness_norm( + noise_object, loudness_noise, out_format, rms=True + ) # add array to signal audio_object.audio = noise_object.audio + audio_object.audio