Skip to content
Commits on Source (8)
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
import copy import copy
import logging import logging
import re import re
import subprocess as sp
from pathlib import Path from pathlib import Path
from tempfile import TemporaryDirectory from tempfile import TemporaryDirectory
from typing import Optional, Tuple, Union from typing import Optional, Tuple, Union
...@@ -53,6 +54,7 @@ logger.setLevel(logging.DEBUG) ...@@ -53,6 +54,7 @@ logger.setLevel(logging.DEBUG)
def bs1770demo( def bs1770demo(
input: audio.Audio, input: audio.Audio,
target_loudness: Optional[float] = -26, target_loudness: Optional[float] = -26,
rms: Optional[bool] = False,
) -> Tuple[float, float]: ) -> Tuple[float, float]:
""" """
Wrapper for ITU-R BS.1770-4, requires bs1770demo binary Wrapper for ITU-R BS.1770-4, requires bs1770demo binary
...@@ -82,6 +84,16 @@ def bs1770demo( ...@@ -82,6 +84,16 @@ def bs1770demo(
else: else:
binary = find_binary("bs1770demo") 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( if not isinstance(input, audio.BinauralAudio) and not isinstance(
input, audio.ChannelBasedAudio input, audio.ChannelBasedAudio
): ):
...@@ -131,6 +143,9 @@ def bs1770demo( ...@@ -131,6 +143,9 @@ def bs1770demo(
# write temporary file # write temporary file
write(tmp_file, tmp_sig, 48000) write(tmp_file, tmp_sig, 48000)
# using rms if true
if rms:
cmd.insert(1, "-rms")
# run command # run command
result = run(cmd, logger=logger) result = run(cmd, logger=logger)
...@@ -150,6 +165,7 @@ def get_loudness( ...@@ -150,6 +165,7 @@ def get_loudness(
input: audio.Audio, input: audio.Audio,
target_loudness: Optional[float] = -26, target_loudness: Optional[float] = -26,
loudness_format: Optional[str] = None, loudness_format: Optional[str] = None,
rms: Optional[bool] = False,
) -> Tuple[float, float]: ) -> Tuple[float, float]:
""" """
Loudness measurement using ITU-R BS.1770-4 Loudness measurement using ITU-R BS.1770-4
...@@ -196,7 +212,9 @@ def get_loudness( ...@@ -196,7 +212,9 @@ def get_loudness(
convert.format_conversion(input, tmp) convert.format_conversion(input, tmp)
else: else:
tmp.audio = input.audio tmp.audio = input.audio
if rms:
return bs1770demo(tmp, target_loudness, rms=True)
else:
return bs1770demo(tmp, target_loudness) return bs1770demo(tmp, target_loudness)
...@@ -204,6 +222,7 @@ def loudness_norm( ...@@ -204,6 +222,7 @@ def loudness_norm(
input: audio.Audio, input: audio.Audio,
target_loudness: Optional[float] = -26, target_loudness: Optional[float] = -26,
loudness_format: Optional[str] = None, loudness_format: Optional[str] = None,
rms: Optional[bool] = False,
) -> np.ndarray: ) -> np.ndarray:
""" """
Iterative loudness normalization using ITU-R BS.1770-4 Iterative loudness normalization using ITU-R BS.1770-4
...@@ -232,7 +251,10 @@ def loudness_norm( ...@@ -232,7 +251,10 @@ def loudness_norm(
while np.abs(measured_loudness - target_loudness) > 0.5 and num_iter < 10: while np.abs(measured_loudness - target_loudness) > 0.5 and num_iter < 10:
measured_loudness, scale_factor_new = get_loudness( measured_loudness, scale_factor_new = get_loudness(
input, target_loudness, loudness_format input,
target_loudness,
loudness_format,
rms=rms,
) )
# scale input # scale input
...@@ -257,6 +279,7 @@ def scale_files( ...@@ -257,6 +279,7 @@ def scale_files(
loudness: float, loudness: float,
fs: Optional[int] = 48000, fs: Optional[int] = 48000,
in_meta: Optional[list] = None, in_meta: Optional[list] = None,
rms: Optional[bool] = False,
) -> None: ) -> None:
""" """
Scales audio files to desired loudness Scales audio files to desired loudness
...@@ -291,6 +314,9 @@ def scale_files( ...@@ -291,6 +314,9 @@ def scale_files(
audio_obj = audio.fromfile(fmt, file, fs) audio_obj = audio.fromfile(fmt, file, fs)
# adjust loudness # adjust loudness
if rms:
scaled_audio = loudness_norm(audio_obj, loudness, rms=True)
else:
scaled_audio = loudness_norm(audio_obj, loudness) scaled_audio = loudness_norm(audio_obj, loudness)
# write into file # write into file
......
...@@ -149,7 +149,9 @@ class Preprocessing2(Processing): ...@@ -149,7 +149,9 @@ class Preprocessing2(Processing):
)[: len(audio_object.audio)] )[: len(audio_object.audio)]
# scale background noise to desired loudness based on output format # 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 # add array to signal
audio_object.audio = noise_object.audio + audio_object.audio audio_object.audio = noise_object.audio + audio_object.audio
......