[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,*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. """super().__init__(*args,**kwargs)self._init_parameters=self.remove_extra_parameters(locals())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)
[docs]defprocess_single(self,sample,context=False):# there is no audio in this sampleifself.audio_keynotinsampleor \
notsample[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._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