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

added loudness adjustment after splitting

parent 14bd218d
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -149,7 +149,8 @@ def main(args):
            out_paths_splits, out_meta_splits = concat_teardown(cfg, logger)
            # scale individual files
            if cfg.postprocessing.get("loudness", False):
                scale_files(out_paths_splits, cfg.postprocessing["fmt"], cfg.postprocessing["loudness"], out_meta_splits)
                # TODO: take care of samplingrate
                scale_files(out_paths_splits, cfg.postprocessing["fmt"], cfg.postprocessing["loudness"], cfg.postprocessing.get("fs", None), out_meta_splits)

    # copy configuration to output directory
    with open(cfg.output_path.joinpath(f"{cfg.name}.yml"), "w") as f:
+4 −1
Original line number Diff line number Diff line
@@ -400,6 +400,7 @@ def split_meta_in_file(

    split_old = 0
    for idx, split in enumerate(splits):
        out_paths_obj = []
        for obj in range(audio_object.num_channels):
            out_file = (
                Path(out_folder)
@@ -407,7 +408,7 @@ def split_meta_in_file(
            )

            # add the path to our list
            out_paths.append(out_file)
            out_paths_obj.append(out_file)

            # remove preamble
            if preamble:
@@ -424,6 +425,8 @@ def split_meta_in_file(
            # write file
            write_ISM_metadata_in_file([y], [out_file])

        out_paths.append(out_paths_obj)

        split_old = split

    return out_paths
+38 −13
Original line number Diff line number Diff line
#!/usr/bin/env python3

import copy
#
#  (C) 2022-2023 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
#  Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
@@ -236,22 +236,47 @@ def loudness_norm(


def scale_files(
    file_list: list[Union[Path, str]],
    out_fmt: str,
    file_list: list[list[Union[Path, str]]],
    fmt: str,
    loudness: float,
    fs: Optional[int] = 48000,
    in_meta: Optional[list] = None,
):
    if in_meta is None:
        np.repeat(None)
) -> None:
    """
    Scales audio files to desired loudness

    for file, meta in zip(file_list, in_meta):
    Parameters
    ----------
    file_list : list[list[Union[Path, str]]]
        List of file paths in a list of the condition folders
    fmt: str
        Audio format of files in list
    loudness: float
        Desired loudness level in LKFS/dBov
    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
    """

    if fmt.startswith("ISM") and in_meta:
        meta_bool = True
    else:
        in_meta = copy.copy(file_list)
        meta_bool = False

    for folder, meta_folder in zip(file_list, in_meta):
        for file, meta in zip(folder, meta_folder):

            # create audio object
        audio_obj = audio.fromfile(out_fmt, file, fs, meta)  # TODO: handle metadata
            if meta_bool:
                audio_obj = audio.fromfile(fmt, file, fs, meta)
            else:
                audio_obj = audio.fromfile(fmt, file, fs)

            # adjust loudness
        scaled_audio = loudness_norm(audio_obj, loudness, out_fmt)
            scaled_audio = loudness_norm(audio_obj, loudness)

            # write into file
            write(file, scaled_audio, audio_obj.fs)
+7 −4
Original line number Diff line number Diff line
@@ -136,6 +136,9 @@ def concat_teardown(cfg: TestConfig, logger: logging.Logger):

    output_format = cfg.postprocessing["fmt"]

    out_files = []
    out_meta = []

    if num_splits <= 1:
        logger.info(
            f"No splitting of output file necessary since only one signal used."
@@ -152,22 +155,22 @@ def concat_teardown(cfg: TestConfig, logger: logging.Logger):
            logger.debug(
                f"Resulting split files condition {odir.name}: {', '.join([str(op) for op in out_paths])}"
            )
            out_files.append(out_paths)

        # split ISM metadata
        if output_format.startswith("ISM"):
            for odir in cfg.out_dirs:
                path_input = odir / cfg.items_list[0].name
                out_meta = split_meta_in_file(
                out_meta_paths = split_meta_in_file(
                    path_input, odir, cfg.split_names, cfg.splits, output_format, preamble=cfg.preamble
                )
        else:
            out_meta = None
                out_meta.append(out_meta_paths)

    # remove concatenated file
    if cfg.delete_tmp:
        cfg.concat_file.unlink(missing_ok=True)

    return out_paths, out_meta  # TODO: append paths for each odir
    return out_files, out_meta


def preprocess(cfg, in_meta, logger):