Commit ecb41a64 authored by Anika Treffehn's avatar Anika Treffehn
Browse files

added logging in loudness_norm and fixed some minor issues

parent 4b6e5677
Loading
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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:
+38 −16
Original line number Diff line number Diff line
@@ -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,
@@ -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])
@@ -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
@@ -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
    -------
@@ -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
@@ -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,
@@ -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
@@ -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)
+1 −0
Original line number Diff line number Diff line
@@ -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,