o
    pi                     @   s   d dl Z d dlmZ d dlmZmZmZ d dlZd dlmZ ddl	m
Z
mZ ddlmZ ddlmZ dd	lmZ dd
lmZ G dd de
ZdS )    N)Path)UnionListOptional)Tensor   )BaseWaveformTransformEmptyPathException)calculate_rms)find_audio_files_in_paths)Audio)
ObjectDictc                       s  e Zd ZdZh dZdZdZdZdZ												d d
e	e
e e
e eef dedededededededee f fddZdededejfddZ								d!dedee dee dee fddZ								d!dedee dee dee def
ddZ  ZS )"AddBackgroundNoisez2
    Add background noise to the input audio.
    >   	per_batchper_channelper_exampleTF      @      >@r         ?Nbackground_pathsmin_snr_in_dbmax_snr_in_dbmodepp_modesample_ratetarget_rateoutput_typec
           
         sr   t  j||||||	d t|| _|durt|dd| _t| jdkr'td|| _|| _	| j| j	kr7t
ddS )aA  

        :param background_paths: Either a path to a folder with audio files or a list of paths
            to audio files.
        :param min_snr_in_db: minimum SNR in dB.
        :param max_snr_in_db: maximum SNR in dB.
        :param mode:
        :param p:
        :param p_mode:
        :param sample_rate:
        )r   r   r   r   r   r   NT)r   monor   z)There are no supported audio files found.z4min_snr_in_db must not be greater than max_snr_in_db)super__init__r   r   r   audiolenr	   r   r   
ValueError)
selfr   r   r   r   r   r   r   r   r   	__class__ h/home/ubuntu/.local/lib/python3.10/site-packages/torch_audiomentations/augmentations/background_noise.pyr       s$   

zAddBackgroundNoise.__init__r!   target_num_samplesreturnc           
         s   g }|}|dkr<t | j} |}||kr+t d|| }|} |||d}	d}n |}	||8 }||	 |dks tj fdd|D ddS )Nr   )sample_offsetnum_samplesc                    s   g | ]}  |qS r'   )rms_normalize).0piecer!   r'   r(   
<listcomp>j   s    z8AddBackgroundNoise.random_background.<locals>.<listcomp>   dim)	randomchoicer   get_num_samplesrandintappendr-   torchcat)
r$   r!   r)   piecesmissing_num_samplesbackground_pathbackground_num_samplesr+   r,   background_samplesr'   r0   r(   random_backgroundM   s*   

z$AddBackgroundNoise.random_backgroundsamplestargetsc                    s   |j \}}tdrjnt|dd t fddt|D jd< jj	kr?tj
|fjtj|jdjd< dS tjjtjjtj|jd	tjj	tj|jd	dd
}|j|fdjd< dS )zK

        :params samples: (batch_size, num_channels, num_samples)
        r!   T)r   c                    s   g | ]}  qS r'   )rA   )r.   _r!   r,   r$   r'   r(   r1   ~   s    z;AddBackgroundNoise.randomize_parameters.<locals>.<listcomp>
background)size
fill_valuedtypedevice	snr_in_db)rI   rJ   )lowhighvalidate_args)sample_shapeN)shapehasattrr!   r   r:   stackrangetransform_parametersr   r   fullfloat32rJ   distributionsUniformtensorsample)r$   rB   r   rC   r   
batch_sizerD   snr_distributionr'   rE   r(   randomize_parametersm   s0   
	z'AddBackgroundNoise.randomize_parametersc           
      C   sr   |j \}}}| jd |j}t|d| jd jddd   }	t||	d||d|d|d  |||dS )	NrF   
   rK   r3      r2   )rB   r   rC   r   )	rP   rT   torJ   r
   	unsqueezer   viewexpand)
r$   rB   r   rC   r   r[   num_channelsr,   rF   background_rmsr'   r'   r(   apply_transform   s   z"AddBackgroundNoise.apply_transform)r   r   r   r   NNNN)NNNN)__name__
__module____qualname____doc__supported_modessupports_multichannelrequires_sample_ratesupports_targetrequires_targetr   r   r   strfloatintr   r    r   r:   r   rA   r]   r   rg   __classcell__r'   r'   r%   r(   r      s~    	
/"
,r   )r5   pathlibr   typingr   r   r   r:   r   core.transforms_interfacer   r	   	utils.dspr
   
utils.filer   utils.ior   utils.object_dictr   r   r'   r'   r'   r(   <module>   s    