Loading ivas_processing_scripts/__init__.py +5 −2 Original line number Diff line number Diff line Loading @@ -36,7 +36,10 @@ from itertools import product from multiprocessing import Pool from time import sleep from ivas_processing_scripts.audiotools.metadata import check_ISM_metadata, check_MASA_metadata from ivas_processing_scripts.audiotools.metadata import ( check_ISM_metadata, check_MASA_metadata, ) from ivas_processing_scripts.constants import ( LOGGER_DATEFMT, LOGGER_FORMAT, Loading Loading @@ -149,7 +152,7 @@ def main(args): for i, meta in enumerate(metadata): meta.extend(metadata_MASA[i]) if not cfg.input["fmt"].startswith("ISM") and not "MASA" in cfg.input["fmt"]: if not cfg.input["fmt"].startswith("ISM") and "MASA" not in cfg.input["fmt"]: metadata = [None] * len(cfg.items_list) cfg.metadata_path = metadata Loading ivas_processing_scripts/audiotools/audio.py +15 −6 Original line number Diff line number Diff line Loading @@ -47,9 +47,9 @@ from ivas_processing_scripts.audiotools.constants import ( METADATA_ASSISTED_SPATIAL_AUDIO_FORMATS, NUMBER_COLUMNS_ISM_METADATA, OBJECT_BASED_AUDIO_FORMATS, SCENE_BASED_AUDIO_FORMATS, OMASA_AUDIO_FORMATS, OSBA_AUDIO_FORMATS, SCENE_BASED_AUDIO_FORMATS, ) from .EFAP import wrap_angles Loading Loading @@ -231,7 +231,9 @@ class MetadataAssistedSpatialAudio(Audio): obj = super()._from_file(name, filename, fs) if isinstance(metadata_file, list): if len(metadata_file) > 1: warn("Only first metadata file used. Additional metadata ignored for MASA") warn( "Only first metadata file used. Additional metadata ignored for MASA" ) obj.metadata_file = Path(metadata_file[0]) else: obj.metadata_file = Path(metadata_file) Loading Loading @@ -391,6 +393,7 @@ class SceneBasedAudio(Audio): class OMASAAudio(Audio): """Sub-class for combined OMASA format""" def __init__(self, name: str): super().__init__(name) try: Loading Loading @@ -604,7 +607,8 @@ def _get_audio_class(fmt) -> Audio: elif fmt in SCENE_BASED_AUDIO_FORMATS.keys(): return SceneBasedAudio elif ( fmt in CHANNEL_BASED_AUDIO_FORMATS.keys() or fmt in CHANNEL_BASED_AUDIO_ALTNAMES.keys() fmt in CHANNEL_BASED_AUDIO_FORMATS.keys() or fmt in CHANNEL_BASED_AUDIO_ALTNAMES.keys() ): return ChannelBasedAudio elif fmt in OSBA_AUDIO_FORMATS.keys(): Loading Loading @@ -643,7 +647,12 @@ def fromfile( """Create an Audio object of the specified format from the given file""" filename = Path(filename) fmt_cls = _get_audio_class(fmt) if fmt_cls is ObjectBasedAudio or fmt_cls is MetadataAssistedSpatialAudio or fmt_cls is OMASAAudio or fmt_cls is OSBAAudio: if ( fmt_cls is ObjectBasedAudio or fmt_cls is MetadataAssistedSpatialAudio or fmt_cls is OMASAAudio or fmt_cls is OSBAAudio ): return fmt_cls._from_file(fmt, filename, in_meta, fs) else: return fmt_cls._from_file(fmt, filename, fs) Loading ivas_processing_scripts/audiotools/audiofile.py +14 −2 Original line number Diff line number Diff line Loading @@ -343,7 +343,13 @@ def combine( # set vertical channels to zero if is_planar: y[:, VERT_HOA_CHANNELS_ACN[VERT_HOA_CHANNELS_ACN < (len(in_filenames) - is_planar_offset)] + is_planar_offset] = 0 y[ :, VERT_HOA_CHANNELS_ACN[ VERT_HOA_CHANNELS_ACN < (len(in_filenames) - is_planar_offset) ] + is_planar_offset, ] = 0 write(out_file, y, fs=in_fs) Loading Loading @@ -394,7 +400,13 @@ def split_channels( x, in_fs = read(in_file, nchannels=in_nchans, fs=in_fs) if is_planar: x[:, VERT_HOA_CHANNELS_ACN[VERT_HOA_CHANNELS_ACN < (in_nchans - is_planar_offset)] + is_planar_offset] = 0 x[ :, VERT_HOA_CHANNELS_ACN[ VERT_HOA_CHANNELS_ACN < (in_nchans - is_planar_offset) ] + is_planar_offset, ] = 0 # Write output files for idx, out_file in enumerate(out_filenames): Loading ivas_processing_scripts/audiotools/convert/__init__.py +11 −9 Original line number Diff line number Diff line Loading @@ -31,21 +31,19 @@ # import logging from copy import copy from pathlib import Path, PurePath from shutil import copyfile from typing import Optional, Union from copy import copy from numpy import empty from ivas_processing_scripts.audiotools import audio, audioarray, metadata from ivas_processing_scripts.audiotools.audiofile import write from ivas_processing_scripts.audiotools.convert.channelbased import convert_channelbased from ivas_processing_scripts.audiotools.convert.masa import convert_masa from ivas_processing_scripts.audiotools.convert.objectbased import convert_objectbased from ivas_processing_scripts.audiotools.convert.scenebased import convert_scenebased from ivas_processing_scripts.audiotools.convert.osba import convert_osba from ivas_processing_scripts.audiotools.convert.omasa import convert_omasa from ivas_processing_scripts.audiotools.convert.osba import convert_osba from ivas_processing_scripts.audiotools.convert.scenebased import convert_scenebased from ivas_processing_scripts.audiotools.wrappers.bs1770 import loudness_norm from ivas_processing_scripts.audiotools.wrappers.esdru import esdru, spatial_distortion from ivas_processing_scripts.audiotools.wrappers.filter import ( Loading Loading @@ -161,7 +159,9 @@ def convert_file( # write output audio write(out_file, output.audio, output.fs) # write metadata if isinstance(output, audio.ObjectBasedAudio) or isinstance(output, audio.OSBAAudio): if isinstance(output, audio.ObjectBasedAudio) or isinstance( output, audio.OSBAAudio ): write_ISM_metadata_in_file(output.object_pos, [out_file], automatic_naming=True) elif isinstance(output, audio.MetadataAssistedSpatialAudio) and in_fmt == out_fmt: # audio objects point to same MD file, create new one with default naming for output Loading @@ -175,6 +175,7 @@ def convert_file( out_md_name = out_file.parent / (out_file.name + ".met") copyfile(output.metadata_files[-1], out_md_name) def convert( input: audio.Audio, output: audio.Audio, Loading Loading @@ -365,8 +366,7 @@ def format_conversion( ): raise NotImplementedError("Can only convert to MASA from SBA") if isinstance(output, audio.OMASAAudio) and not ( isinstance(input, audio.OSBAAudio) or isinstance(input, audio.OMASAAudio) isinstance(input, audio.OSBAAudio) or isinstance(input, audio.OMASAAudio) ): raise NotImplementedError("Can only convert to OMASA from OSBA") Loading @@ -376,7 +376,9 @@ def format_conversion( "ISM is not supported as an output for rendering! Only usable as pass-through" ) if isinstance(output, audio.OMASAAudio) or isinstance(output, audio.OSBAAudio): if not (isinstance(input, audio.OMASAAudio) or isinstance(input, audio.OSBAAudio)): if not ( isinstance(input, audio.OMASAAudio) or isinstance(input, audio.OSBAAudio) ): raise NotImplementedError( "OMASA and OSBA only possible as output if input is OMASA or OSBA" ) Loading ivas_processing_scripts/audiotools/convert/omasa.py +30 −7 Original line number Diff line number Diff line Loading @@ -30,12 +30,20 @@ # from copy import copy, deepcopy import numpy as np from ivas_processing_scripts.audiotools import audio from ivas_processing_scripts.audiotools.convert.objectbased import render_oba_to_binaural, render_oba_to_cba, \ render_oba_to_sba from ivas_processing_scripts.audiotools.convert.masa import render_masa_to_binaural, render_masa_to_cba, render_masa_to_sba from ivas_processing_scripts.audiotools.convert.masa import ( render_masa_to_binaural, render_masa_to_cba, render_masa_to_sba, ) from ivas_processing_scripts.audiotools.convert.objectbased import ( render_oba_to_binaural, render_oba_to_cba, render_oba_to_sba, ) """ OMASAAudio functions """ Loading @@ -48,10 +56,21 @@ def convert_omasa( """Convert an OMASA signal to the requested output format""" # split OMASA object in ISM and MASA object oba = audio.fromarray("ISM" + str(omasa.num_ism_channels), omasa.audio[:, :omasa.num_ism_channels], omasa.fs) oba = audio.fromarray( "ISM" + str(omasa.num_ism_channels), omasa.audio[:, : omasa.num_ism_channels], omasa.fs, ) oba.metadata_files = copy(omasa.metadata_files) oba.object_pos = copy(omasa.object_pos) masa = audio.fromarray("MASA" + str(omasa.num_channels-omasa.num_ism_channels) + "DIR" + str(omasa.dirs), omasa.audio[:, omasa.num_ism_channels:], omasa.fs) masa = audio.fromarray( "MASA" + str(omasa.num_channels - omasa.num_ism_channels) + "DIR" + str(omasa.dirs), omasa.audio[:, omasa.num_ism_channels :], omasa.fs, ) masa.metadata_file = omasa.metadata_files[-1] # OMASA -> Binaural Loading Loading @@ -100,13 +119,17 @@ def convert_omasa( elif isinstance(out, audio.OSBAAudio): # check if ism object number is the same if out.num_ism_channels != omasa.num_ism_channels: raise ValueError("OMASA to OSBA conversion only possible if number of ISM objects matches") raise ValueError( "OMASA to OSBA conversion only possible if number of ISM objects matches" ) # only render MASA part out_masa = deepcopy(out) render_masa_to_sba(masa, out_masa) out.audio = np.concatenate((omasa.audio[:, :omasa.num_ism_channels], out_masa.audio), axis=1) out.audio = np.concatenate( (omasa.audio[:, : omasa.num_ism_channels], out_masa.audio), axis=1 ) else: raise NotImplementedError( Loading Loading
ivas_processing_scripts/__init__.py +5 −2 Original line number Diff line number Diff line Loading @@ -36,7 +36,10 @@ from itertools import product from multiprocessing import Pool from time import sleep from ivas_processing_scripts.audiotools.metadata import check_ISM_metadata, check_MASA_metadata from ivas_processing_scripts.audiotools.metadata import ( check_ISM_metadata, check_MASA_metadata, ) from ivas_processing_scripts.constants import ( LOGGER_DATEFMT, LOGGER_FORMAT, Loading Loading @@ -149,7 +152,7 @@ def main(args): for i, meta in enumerate(metadata): meta.extend(metadata_MASA[i]) if not cfg.input["fmt"].startswith("ISM") and not "MASA" in cfg.input["fmt"]: if not cfg.input["fmt"].startswith("ISM") and "MASA" not in cfg.input["fmt"]: metadata = [None] * len(cfg.items_list) cfg.metadata_path = metadata Loading
ivas_processing_scripts/audiotools/audio.py +15 −6 Original line number Diff line number Diff line Loading @@ -47,9 +47,9 @@ from ivas_processing_scripts.audiotools.constants import ( METADATA_ASSISTED_SPATIAL_AUDIO_FORMATS, NUMBER_COLUMNS_ISM_METADATA, OBJECT_BASED_AUDIO_FORMATS, SCENE_BASED_AUDIO_FORMATS, OMASA_AUDIO_FORMATS, OSBA_AUDIO_FORMATS, SCENE_BASED_AUDIO_FORMATS, ) from .EFAP import wrap_angles Loading Loading @@ -231,7 +231,9 @@ class MetadataAssistedSpatialAudio(Audio): obj = super()._from_file(name, filename, fs) if isinstance(metadata_file, list): if len(metadata_file) > 1: warn("Only first metadata file used. Additional metadata ignored for MASA") warn( "Only first metadata file used. Additional metadata ignored for MASA" ) obj.metadata_file = Path(metadata_file[0]) else: obj.metadata_file = Path(metadata_file) Loading Loading @@ -391,6 +393,7 @@ class SceneBasedAudio(Audio): class OMASAAudio(Audio): """Sub-class for combined OMASA format""" def __init__(self, name: str): super().__init__(name) try: Loading Loading @@ -604,7 +607,8 @@ def _get_audio_class(fmt) -> Audio: elif fmt in SCENE_BASED_AUDIO_FORMATS.keys(): return SceneBasedAudio elif ( fmt in CHANNEL_BASED_AUDIO_FORMATS.keys() or fmt in CHANNEL_BASED_AUDIO_ALTNAMES.keys() fmt in CHANNEL_BASED_AUDIO_FORMATS.keys() or fmt in CHANNEL_BASED_AUDIO_ALTNAMES.keys() ): return ChannelBasedAudio elif fmt in OSBA_AUDIO_FORMATS.keys(): Loading Loading @@ -643,7 +647,12 @@ def fromfile( """Create an Audio object of the specified format from the given file""" filename = Path(filename) fmt_cls = _get_audio_class(fmt) if fmt_cls is ObjectBasedAudio or fmt_cls is MetadataAssistedSpatialAudio or fmt_cls is OMASAAudio or fmt_cls is OSBAAudio: if ( fmt_cls is ObjectBasedAudio or fmt_cls is MetadataAssistedSpatialAudio or fmt_cls is OMASAAudio or fmt_cls is OSBAAudio ): return fmt_cls._from_file(fmt, filename, in_meta, fs) else: return fmt_cls._from_file(fmt, filename, fs) Loading
ivas_processing_scripts/audiotools/audiofile.py +14 −2 Original line number Diff line number Diff line Loading @@ -343,7 +343,13 @@ def combine( # set vertical channels to zero if is_planar: y[:, VERT_HOA_CHANNELS_ACN[VERT_HOA_CHANNELS_ACN < (len(in_filenames) - is_planar_offset)] + is_planar_offset] = 0 y[ :, VERT_HOA_CHANNELS_ACN[ VERT_HOA_CHANNELS_ACN < (len(in_filenames) - is_planar_offset) ] + is_planar_offset, ] = 0 write(out_file, y, fs=in_fs) Loading Loading @@ -394,7 +400,13 @@ def split_channels( x, in_fs = read(in_file, nchannels=in_nchans, fs=in_fs) if is_planar: x[:, VERT_HOA_CHANNELS_ACN[VERT_HOA_CHANNELS_ACN < (in_nchans - is_planar_offset)] + is_planar_offset] = 0 x[ :, VERT_HOA_CHANNELS_ACN[ VERT_HOA_CHANNELS_ACN < (in_nchans - is_planar_offset) ] + is_planar_offset, ] = 0 # Write output files for idx, out_file in enumerate(out_filenames): Loading
ivas_processing_scripts/audiotools/convert/__init__.py +11 −9 Original line number Diff line number Diff line Loading @@ -31,21 +31,19 @@ # import logging from copy import copy from pathlib import Path, PurePath from shutil import copyfile from typing import Optional, Union from copy import copy from numpy import empty from ivas_processing_scripts.audiotools import audio, audioarray, metadata from ivas_processing_scripts.audiotools.audiofile import write from ivas_processing_scripts.audiotools.convert.channelbased import convert_channelbased from ivas_processing_scripts.audiotools.convert.masa import convert_masa from ivas_processing_scripts.audiotools.convert.objectbased import convert_objectbased from ivas_processing_scripts.audiotools.convert.scenebased import convert_scenebased from ivas_processing_scripts.audiotools.convert.osba import convert_osba from ivas_processing_scripts.audiotools.convert.omasa import convert_omasa from ivas_processing_scripts.audiotools.convert.osba import convert_osba from ivas_processing_scripts.audiotools.convert.scenebased import convert_scenebased from ivas_processing_scripts.audiotools.wrappers.bs1770 import loudness_norm from ivas_processing_scripts.audiotools.wrappers.esdru import esdru, spatial_distortion from ivas_processing_scripts.audiotools.wrappers.filter import ( Loading Loading @@ -161,7 +159,9 @@ def convert_file( # write output audio write(out_file, output.audio, output.fs) # write metadata if isinstance(output, audio.ObjectBasedAudio) or isinstance(output, audio.OSBAAudio): if isinstance(output, audio.ObjectBasedAudio) or isinstance( output, audio.OSBAAudio ): write_ISM_metadata_in_file(output.object_pos, [out_file], automatic_naming=True) elif isinstance(output, audio.MetadataAssistedSpatialAudio) and in_fmt == out_fmt: # audio objects point to same MD file, create new one with default naming for output Loading @@ -175,6 +175,7 @@ def convert_file( out_md_name = out_file.parent / (out_file.name + ".met") copyfile(output.metadata_files[-1], out_md_name) def convert( input: audio.Audio, output: audio.Audio, Loading Loading @@ -365,8 +366,7 @@ def format_conversion( ): raise NotImplementedError("Can only convert to MASA from SBA") if isinstance(output, audio.OMASAAudio) and not ( isinstance(input, audio.OSBAAudio) or isinstance(input, audio.OMASAAudio) isinstance(input, audio.OSBAAudio) or isinstance(input, audio.OMASAAudio) ): raise NotImplementedError("Can only convert to OMASA from OSBA") Loading @@ -376,7 +376,9 @@ def format_conversion( "ISM is not supported as an output for rendering! Only usable as pass-through" ) if isinstance(output, audio.OMASAAudio) or isinstance(output, audio.OSBAAudio): if not (isinstance(input, audio.OMASAAudio) or isinstance(input, audio.OSBAAudio)): if not ( isinstance(input, audio.OMASAAudio) or isinstance(input, audio.OSBAAudio) ): raise NotImplementedError( "OMASA and OSBA only possible as output if input is OMASA or OSBA" ) Loading
ivas_processing_scripts/audiotools/convert/omasa.py +30 −7 Original line number Diff line number Diff line Loading @@ -30,12 +30,20 @@ # from copy import copy, deepcopy import numpy as np from ivas_processing_scripts.audiotools import audio from ivas_processing_scripts.audiotools.convert.objectbased import render_oba_to_binaural, render_oba_to_cba, \ render_oba_to_sba from ivas_processing_scripts.audiotools.convert.masa import render_masa_to_binaural, render_masa_to_cba, render_masa_to_sba from ivas_processing_scripts.audiotools.convert.masa import ( render_masa_to_binaural, render_masa_to_cba, render_masa_to_sba, ) from ivas_processing_scripts.audiotools.convert.objectbased import ( render_oba_to_binaural, render_oba_to_cba, render_oba_to_sba, ) """ OMASAAudio functions """ Loading @@ -48,10 +56,21 @@ def convert_omasa( """Convert an OMASA signal to the requested output format""" # split OMASA object in ISM and MASA object oba = audio.fromarray("ISM" + str(omasa.num_ism_channels), omasa.audio[:, :omasa.num_ism_channels], omasa.fs) oba = audio.fromarray( "ISM" + str(omasa.num_ism_channels), omasa.audio[:, : omasa.num_ism_channels], omasa.fs, ) oba.metadata_files = copy(omasa.metadata_files) oba.object_pos = copy(omasa.object_pos) masa = audio.fromarray("MASA" + str(omasa.num_channels-omasa.num_ism_channels) + "DIR" + str(omasa.dirs), omasa.audio[:, omasa.num_ism_channels:], omasa.fs) masa = audio.fromarray( "MASA" + str(omasa.num_channels - omasa.num_ism_channels) + "DIR" + str(omasa.dirs), omasa.audio[:, omasa.num_ism_channels :], omasa.fs, ) masa.metadata_file = omasa.metadata_files[-1] # OMASA -> Binaural Loading Loading @@ -100,13 +119,17 @@ def convert_omasa( elif isinstance(out, audio.OSBAAudio): # check if ism object number is the same if out.num_ism_channels != omasa.num_ism_channels: raise ValueError("OMASA to OSBA conversion only possible if number of ISM objects matches") raise ValueError( "OMASA to OSBA conversion only possible if number of ISM objects matches" ) # only render MASA part out_masa = deepcopy(out) render_masa_to_sba(masa, out_masa) out.audio = np.concatenate((omasa.audio[:, :omasa.num_ism_channels], out_masa.audio), axis=1) out.audio = np.concatenate( (omasa.audio[:, : omasa.num_ism_channels], out_masa.audio), axis=1 ) else: raise NotImplementedError( Loading