Commit 0105e07f authored by Vinit Veera's avatar Vinit Veera
Browse files

Merge branch '10-bs1770demo-can-produce-nan-as-loudness-result' into 'main'

Resolve "bs1770demo can produce NaN as loudness result"

See merge request !45
parents 0010a1d8 e6cf7897
Loading
Loading
Loading
Loading
Loading
+30 −4
Original line number Diff line number Diff line
@@ -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,7 +212,9 @@ def get_loudness(
        convert.format_conversion(input, tmp)
    else:
        tmp.audio = input.audio

    if rms:
        return bs1770demo(tmp, target_loudness, rms=True)
    else:
        return bs1770demo(tmp, target_loudness)


@@ -204,6 +222,7 @@ 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,6 +314,9 @@ def scale_files(
                audio_obj = audio.fromfile(fmt, file, fs)

            # adjust loudness
            if rms:
                scaled_audio = loudness_norm(audio_obj, loudness, rms=True)
            else:
                scaled_audio = loudness_norm(audio_obj, loudness)

            # write into file
+3 −1
Original line number Diff line number Diff line
@@ -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