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 +14 −5 Original line number Diff line number Diff line 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 +8 −6 Original line number Diff line number Diff line Loading @@ -36,8 +36,6 @@ 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 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 +29 −7 Original line number Diff line number Diff line Loading @@ -33,9 +33,16 @@ 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.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, ) """ OMASAAudio functions """ Loading @@ -48,10 +55,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 +118,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 +14 −5 Original line number Diff line number Diff line 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 +8 −6 Original line number Diff line number Diff line Loading @@ -36,8 +36,6 @@ 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 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 +29 −7 Original line number Diff line number Diff line Loading @@ -33,9 +33,16 @@ 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.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, ) """ OMASAAudio functions """ Loading @@ -48,10 +55,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 +118,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