[docs]@OPERATORS.register_module(OP_NAME)@LOADED_AUDIOS.register_module(OP_NAME)classAudioAddGaussianNoiseMapper(Mapper):""" Mapper to add gaussian noise to audio. """
[docs]def__init__(self,min_amplitude:float=0.001,max_amplitude:float=0.015,p:float=0.5,save_dir:str=None,*args,**kwargs,):""" Initialization method. min_amplitude: float unit: linear amplitude. Default: 0.001. Minimum noise amplification factor. max_amplitude: float unit: linear amplitude. Default: 0.015. Maximum noise amplification factor. p: float range: [0.0, 1.0]. Default: 0.5. The probability of applying this transform. save_dir: str. Default: None. The directory where generated audio files will be stored. If not specified, outputs will be saved in the same directory as their corresponding input files. This path can alternatively be defined by setting the `DJ_PRODUCED_DATA_DIR` environment variable. """super().__init__(*args,**kwargs)self._init_parameters=self.remove_extra_parameters(locals())self._init_parameters.pop("save_dir",None)ifmin_amplitude>=max_amplitude:raiseValueError("min_amplitude must be < max_amplitude")ifnot0<=p<=1:raiseValueError("p must be in [0, 1]")self.min_amplitude=min_amplitudeself.max_amplitude=max_amplitudeself.p=pself.audio_transform=audiomentations.AddGaussianNoise(min_amplitude=self.min_amplitude,max_amplitude=self.max_amplitude,p=self.p)self.save_dir=save_dir
[docs]defprocess_single(self,sample,context=False):# there is no audio in this sampleifself.audio_keynotinsampleornotsample[self.audio_key]:returnsampleifFields.source_filenotinsampleornotsample[Fields.source_file]:sample[Fields.source_file]=sample[self.audio_key]# load audioloaded_audio_keys=sample[self.audio_key]sample,audios=load_data_with_context(sample,context,loaded_audio_keys,load_audio)processed={}foraudio_keyinloaded_audio_keys:ifaudio_keyinprocessed:continuenew_audio_key=transfer_filename(audio_key,OP_NAME,self.save_dir,**self._init_parameters)ifnew_audio_key.endswith(".ogg"):new_audio_key=new_audio_key.replace(".ogg",".wav")ifnotos.path.exists(new_audio_key)ornew_audio_keynotinaudios.keys():audio_array,audio_sample_rate=audios[audio_key]audio_augment=self.audio_transform(audio_array,sample_rate=audio_sample_rate)audio_augment=np.asarray(audio_augment)sf.write(new_audio_key,audio_augment,audio_sample_rate)audios[new_audio_key]=(audio_augment,audio_sample_rate)ifcontext:sample[Fields.context][new_audio_key]=audiosprocessed[audio_key]=new_audio_key# when the file is modified, its source file needs to be updated.fori,valueinenumerate(loaded_audio_keys):ifsample[Fields.source_file][i]!=valueandprocessed[value]!=value:sample[Fields.source_file][i]=processed[value]sample[self.audio_key]=[processed[key]forkeyinloaded_audio_keys]returnsample