o
    }oiW                     @   s   d dl Z d dlZ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Zd dlZd dlmZmZ d dlmZmZ G dd dZG dd	 d	ZdS )
    N)
namedtuple)ListTypeUnion)NoisePerturbationSilencePerturbation)AudioSegmentselect_channelsc                   @   s  e Zd ZdZdZejjejdddddddggde	e
eeee f  fdd	Zejjejd
ddgejdddddgddggd
ede	e
eeee f  fddZejjejd
ddgejddddggd
ede	e
eeee f  fddZdS )TestSelectChannelsi  &.>channel_selectorNaverager      c                 C   s   t j| j }}|dvr*tt t|| W d   dS 1 s#w   Y  dS t||}t t 	|| }|| j
k s@J dS )zwCover the case with single-channel input signal.
        Channel selector should not do anything in this case.
        )Nr   r   N)nprandomrandnum_samplespytestraises
ValueErrorr	   maxabsmax_diff_tol)selfr   
golden_out	signal_in
signal_outmax_diff r   d/home/ubuntu/.local/lib/python3.10/site-packages/tests/collections/asr/test_preprocessing_segment.pytest_single_channel_input!   s   "
z,TestSelectChannels.test_single_channel_inputnum_channels      c                 C   sz   t j| j|}|du r|}n|dkrt j|dd}n
|dd|f  }t||}t t || }|| j	k s;J dS )zdCover the case with multi-channel input signal and single-
        or multi-channel output.
        Nr   r   axis)
r   r   r   r   meansqueezer	   r   r   r   )r   r!   r   r   r   r   r   r   r   r   test_multi_channel_input6   s   
z+TestSelectChannels.test_multi_channel_inputc                 C   sJ   t j| j|}tt t|| W d   dS 1 sw   Y  dS )z|This test is expecting the UUT to fail because we ask for more channels
        than available in the input signal.
        N)r   r   r   r   r   r   r   r	   )r   r!   r   r   r   r   r   (test_select_more_channels_than_availableN   s   	"z;TestSelectChannels.test_select_more_channels_than_available)__name__
__module____qualname__r   r   r   markunitparametrizer   r   strintr   r    r(   r)   r   r   r   r   r
      s$    $*r
   c                   @   s  e Zd ZdZdZdZedd Zej	j
ej	dddgej	d	d
dddddggded	eeeeee f  fddZej	j
ej	dddgej	d	g ddd Zej	j
ej	dddgej	dddgdd Zdd Zej	j
ej	ddg dfdd
dddddggfgej	dg ddd Zej	j
ej	ddg dfdd
dddddggfgej	dddgej	d ddgd!d" Zej	j
ej	d#d$dgd%d& Zd
S )'TestAudioSegment>  r"   r   c                 C   s   | j | j S )N)sample_ratesignal_duration_sec)r   r   r   r   r   e   s   zTestAudioSegment.num_samplesr!   r   r#   r   Nr   r   c                 C   s  |dkrt j| j}nt j| j|}t|tr||ks(t|trHt||krHt	t
 t|| j|d}W d   dS 1 sAw   Y  dS t|| j|d}t|d|}|jdkr_dn|jd }|j|kskJ |j| jkssJ |j| jks{J |j| jksJ t t |j| }|| jk sJ d}|j|dd |j| j| ksJ t |j| d dksJ t t |jd|  | }|| jk sJ d	| j }	d
| j }
|j|	|
d tt|	| j }tt|
| j }t t |j|||  }|| jk sJ dS )zTest the constructor directly.r   )samplesr4   r   Nfloat32*   F)	symmetric        g?g      ?)
start_timeend_time)r   r   r   r   
isinstancer1   listr   r   r   r   r   r4   r	   astypendimshaper!   durationr5   r   r6   r   padall
subsegmentround)r   r!   r   r6   uutgolden_samplesexpected_num_channelsr   
pad_lengthr;   r<   start_sample
end_sampler   r   r   test_init_single_channeli   s@   " 

z)TestAudioSegment.test_init_single_channel)Nr   r   c           
      C   s  t  y}tj|d}|dkrtj| j}ntj| j|}t	
||| jd tj||d}t|d|}|jdkr?dn|jd }|j|ksKJ |j| jksSJ |j| jks[J |j| jkscJ tt|j| }	|	| jk suJ W d   dS 1 sw   Y  dS )"Test loading a signal from a file.	audio.wavr   floatr   r7   N)tempfileTemporaryDirectoryospathjoinr   r   r   r   sfwriter4   r   	from_filer	   r?   r@   rA   r!   rB   r5   r   r   r6   r   )
r   r!   r   test_dir
audio_filer6   rG   rH   rI   r   r   r   r   test_from_file   s    
"zTestAudioSegment.test_from_filedata_channelsnoise_channelsc                 C   s  t  O}tj|d}|dkrtj| j}ntj| j|}t	
||| jd tj|d}|dkr=tj| j}ntj| j|}t	
||| jd tj|d}t|d}tj|ddd	d
}	|
t|	 d W d   n1 s{w   Y  t|}
t|}t|}||krz
|
j||dd}W n ty } zJ dd}~ww tt |
j|||d}W d   n1 sw   Y  z
|
j||dd}W n ty } zJ dd}~ww tt |
j|||d}W d   n1 sw   Y  n@tt |
||}W d   n	1 sw   Y  tt |
||}W d   n1 s7w   Y  W d   dS W d   dS W d   dS 1 sXw   Y  dS )rN   rO   r   rP   z	noise.wavznoise_manifest.jsonw-g?r:   )audio_filepathlabelrB   offset
Nr   )ref_micFz.perturb_with_input_noise failed with ref_mic=0z3perturb_with_foreground_noise failed with ref_mic=0)rR   rS   rT   rU   rV   r   r   r   r   rW   rX   r4   openabspathjsondumpsr   r   rY   perturb_with_input_noiser   r   r   perturb_with_foreground_noise)r   r]   r^   rZ   r[   r6   
noise_filemanifest_filefoutitem	perturberaudionoise_er   r   r   test_noise_perturb_channels   sd   


  .$z,TestAudioSegment.test_noise_perturb_channelsc           	      C   s   t  I}tj|d}tj| j}t	
||| jd d}t||||d}t|}t|j}||}t|j|d| | j  ksEJ W d   dS 1 sPw   Y  dS )z@Test loading a signal from a file and apply silence perturbationrO   rP   r"   )min_start_silence_secsmax_start_silence_secsmin_end_silence_secsmax_end_silence_secsN)rR   rS   rT   rU   rV   r   r   r   r   rW   rX   r4   r   r   rY   len_samplesperturb)	r   rZ   r[   r6   durrp   rq   ori_audio_lenrs   r   r   r   test_silence_perturb   s    



""z%TestAudioSegment.test_silence_perturbznum_channels, channel_selectors   r4   )@  r3   iW  c                 C   s  d}|| }d}d\}}	t |D ]}
tj|d|
dd}tj||}t|||d |D ]}|du r:|}n&t	|t
sDt	|trM|dd|f }n|d	krYtj|d
d}ntd| | }|jd
krkd
n|jd
 }tj||d}|j|ksJ d| d|j d| |j|ksJ d| d|j d| |jt|ksJ d| d|j dt| tj|j|||	dsJ d| dtj|dd|d}|j|ksJ d| d| d| d|j d| 
|j|ksJ d| d| d| d|j d| 
|jt|ks J d| d| d| d|j dt| 
tj|j|||	ds9J d| d| d| ddtj  | }dtj  | }t
|| }|t
||  }|||df }tj||||d}|j|ksJ d| d| d| d|j d| 
|j|ksJ d| d| d| d|j d| 
|jt|ksJ d| d| d| d|j dt| 
tj|j|||	dsJ d| d| d| dq0qdS )z*Test loading and audio signal from a file.r#   
   gh㈵>gư>test_audio_02.wavrP   Nr   r   r$   z%Unexpected value of channel_selector rQ   channel_selector z, sample rate not matching: z != z, num channels not matching: z, num samples not matching: rtolatolz, samples not matching)rc   rB   r   z	, offset z, duration g?.)rangerT   rU   rV   r   r   randnrW   rX   r=   r1   r>   r&   r   r'   r@   rA   r   rY   r4   r!   r   rz   allcloser6   r   )r   tmpdirr!   channel_selectorsr4   signal_len_secr   num_examplesr   r   nr[   r6   r   ref_samplesref_channelsaudio_segmentrc   rB   startendr   r   r   test_audio_segment_from_file  s   


""
&

""
&

z-TestAudioSegment.test_audio_segment_from_filerc   g      ?rB   c                 C   s  d}d}|| }d\}	}
t j||}g }t|D ]}tj|d| d}t||dd|f | |	| qtj|d}t||| |D ]Q}t
j||||d}t
j||||d}|j|jksrJ d	| d
|j d|j |j|jksJ d	| d
|j d|j t j|j|j|	|
dsJ d	| dqItjtdd t
j||d W d   n1 sw   Y  |dkrtjtdd t
j||gd W d   n1 sw   Y  tjtdd t
j||gdd W d   dS 1 sw   Y  dS dS )zATest loading an audio signal from a list of single-channel files.r3      r   ch_r   Nzmc.wav)r[   rc   rB   r   r   z: expecting z, but UUT segment has r   z: samples not matchingzChannel cannot be selected)match)r[   r   r   z'Expecting a single-channel audio signal)r[   r   )r   r   r   r   rT   rU   rV   rW   rX   appendr   rY   r4   r   r   r6   r   r   RuntimeError)r   r   r!   r   rc   rB   r4   r   r   r   r   r6   audio_filesma_filemc_filer   uut_segmentref_segmentr   r   r   )test_audio_segment_multichannel_with_listr  sR   
"z:TestAudioSegment.test_audio_segment_multichannel_with_list	target_srr   c                 C   s0  d}d}|| }d}t dd}g }||tjddd ||dd	dd ||d
ddd t|D ]a}	tj|d|	dd}
tj	|}|t| }tj
 t| | }t|
||d |D ]/}tj|
|d|j|j|j|jd}tj|
g|d|j|j|j|jd}||ksJ d| dqeq4dS )zTest loading and audio signal from a file matches when using a path and a list
        for different target_sr, int_values and trim setups.
        i]  r"   r   	TrimSetupz"ref top_db frame_length hop_lengthi   i   g      ?#   g?-   r   r   r   rP   T)r   trimtrim_reftrim_top_dbtrim_frame_lengthtrim_hop_lengthztrim setup z, loaded segments not matchingN)r   r   r   r   r   rT   rU   rV   r   r   r   hanningrW   rX   r   rY   reftop_dbframe_length
hop_length)r   r   r   r4   r   r   r   r   trim_setupsr   r[   r6   
trim_setupaudio_segment_1audio_segment_2r   r   r   test_audio_segment_trim_match  sJ   
z.TestAudioSegment.test_audio_segment_trim_match)r*   r+   r,   r4   r5   r   propertyr   r   r-   r.   r/   r1   r   r   r0   r   rM   r\   ru   r   r   r   r   r   r   r   r   r2   _   sR    
*33
^
8r2   )rh   rT   rR   collectionsr   typingr   r   r   numpyr   r   	soundfilerW   0nemo.collections.asr.parts.preprocessing.perturbr   r   0nemo.collections.asr.parts.preprocessing.segmentr   r	   r
   r2   r   r   r   r   <module>   s   B