Skip to content
Commits on Source (8)
......@@ -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
......
......@@ -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
......