o
    Тi                     @   sF  d Z ddlZddlm  mZ ddlZ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mZmZmZmZmZmZ d%deded	ed
ejfddZ	d&dedededed
ejf
ddZd'dejded
efddZG dd dZG dd dZ G dd dZ!G dd dZ"G dd dZ#G dd  d Z$G d!d" d"Z%G d#d$ d$Z&dS )(z#Tests for audio polishing pipeline.    N)Path)	step1_length_splitstep2_boundary_trimstep3_silence_padstep4_encodepolish_segmentpolish_all_segments_compute_rms_profile_find_silence_valleysTrimMetadata>       r@
duration_ssrfreqreturnc                 C   sN   t d| t||  }dt dt j | |  dt jt|  t j	S )z%Generate a sine wave with some noise.r   333333?   g{Gz?)
nplinspaceintsinpirandomrandnlenastypefloat32)r   r   r   t r   3/home/ubuntu/transcripts/tests/test_audio_polish.py_make_audio   s   8r!   r   silence_at_ssilence_dur_sc                 C   sH   t | |}t|| }t|t||  t|}|||  d9  < |S )z9Generate audio with a silence valley at a specific point.MbP?)r!   r   minr   )r   r"   r#   r   audiostartendr   r   r    _make_audio_with_silence   s
   
r)   r&   c                 C   s(   t jddd}t|j| | t|jS )Nz.flacF)suffixdelete)tempfileNamedTemporaryFilesfwritenamer   )r&   r   tmpr   r   r    _write_flac    s   
r2   c                   @   $   e Zd Zdd Zdd Zdd ZdS )TestRMSProfilec                 C   s   t d}t|ddd}t|}d}||k}|s\td|fd||fdt v s,ttr1ttndd	t v s=t|rBt|nd	t|t|d
 }dd|i }t	t
|d  } }}d S )N      ?r   
   )frame_msd   ==z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr   rmspy0py1py3py6assert %(py8)spy8)r!   r	   r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation)selfr&   r<   @py_assert2@py_assert5@py_assert4@py_format7@py_format9r   r   r    test_rms_profile_shape'   s   z%TestRMSProfile.test_rms_profile_shapec           	      C   s   t jdt jd}t|d}t j}d}||k }||}|setd|fd||fdt v s1t	|r6t
|ndt
|d }dd	t v sKt	t rPt
t nd	t
||t
|d
 }tt|d  } } }}d S )Nr   dtyper$   )<)z%(py3)s < %(py6)sr<   r@   rA   Gassert %(py10)s
{%(py10)s = %(py2)s
{%(py2)s = %(py0)s.all
}(%(py8)s)
}r   r>   py2rC   py10)r   zerosr   r	   allrD   rE   rF   rG   rH   rI   rJ   rK   	rL   r&   r<   @py_assert1rN   rO   @py_assert9rP   @py_format11r   r   r    test_silence_has_low_rms,   s   
z'TestRMSProfile.test_silence_has_low_rmsc           	      C   s   t jdt jdd }t|d}t j}d}||k}||}|sgtd|fd||fdt v s3t	|r8t
|ndt
|d }d	d
t v sMt	t rRt
t nd
t
||t
|d }tt|d  } } }}d S )Nr   rS         ?g?>)z%(py3)s > %(py6)sr<   rV   rW   r   rX   )r   onesr   r	   r\   rD   rE   rF   rG   rH   rI   rJ   rK   r]   r   r   r    test_loud_audio_has_high_rms1   s   
z+TestRMSProfile.test_loud_audio_has_high_rmsN)__name__
__module____qualname__rR   ra   rf   r   r   r   r    r4   &   s    r4   c                   @      e Zd Zdd ZdS )TestSilenceValleysc           	      C   s   t ddd}t|d}t|}t|}d}||k}|s`td|fd||fdt v s0ttr5t	tndd	t v sAt|rFt	|nd	t	|t	|d
 }dd|i }t
t|d  } }}d S )N      @      @r"   r   r   rc   z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)sr   valleysr=   rB   rC   )r)   r	   r
   r   rD   rE   rF   rG   rH   rI   rJ   rK   )	rL   r&   r<   rp   rM   rN   rO   rP   rQ   r   r   r    $test_finds_valleys_in_silence_region8   s   
z7TestSilenceValleys.test_finds_valleys_in_silence_regionN)rg   rh   ri   rq   r   r   r   r    rk   7       rk   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestStep1LengthSplitc           	      C   F  t d}t|dd}t|}d}||k}|s[td|fd||fdt v s+ttr0ttnddt v s<t|rAt|ndt|t|d	 }d
d|i }t	t
|d  } }}|d d }|j}d}||u }|std|fd||ft|t|t|d }d
d|i }t	t
|d  } } }}d S )Nr5   r   z
short.flac   r9   r;   r   resultsr=   rB   rC   r   Tisz1%(py3)s
{%(py3)s = %(py1)s.discarded
} is %(py6)sr?   r@   rA   )r!   r   r   rD   rE   rF   rG   rH   rI   rJ   rK   	discarded	rL   r&   rv   rM   rN   rO   rP   rQ   @py_assert0r   r   r    test_short_segment_discarded@      z1TestStep1LengthSplit.test_short_segment_discardedc           	      C   s  t d}t|dd}t|}d}||k}|s[td|fd||fdt v s+ttr0ttnddt v s<t|rAt|ndt|t|d	 }d
d|i }t	t
|d  } }}|d d }|j}d}||u }|std|fd||ft|t|t|d }d
d|i }t	t
|d  } } }}|d d }|j}d}||u }|std|fd||ft|t|t|d }d
d|i }t	t
|d  } } }}d S )Nrl   r   znormal.flacru   r9   r;   r   rv   r=   rB   rC   r   Frw   ry   rz   z1%(py3)s
{%(py3)s = %(py1)s.was_split
} is %(py6)s)r!   r   r   rD   rE   rF   rG   rH   rI   rJ   rK   r{   	was_splitr|   r   r   r    test_normal_segment_not_splitF   s
   z2TestStep1LengthSplit.test_normal_segment_not_splitc              	   C   s  t ddd}t|dd}t|}d}||k}|s]td|fd||fd	t v s-ttr2ttnd	d
t v s>t|rCt|nd
t|t|d }dd|i }t	t
|d  } }}|D ]l\}}	|	jst|}d}|| }
d}|
|k}|std|fd|
|fd	t v sttrttnd	dt v st|rt|ndt|t|t|d }dd|i }t	t
|d  } } }
 }}qed S )Ng      4@       @rn   r   z	long.flacr   >=z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sr   rv   r=   rB   rC   g      /@)<=)z<(%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} / %(py5)s) <= %(py9)schunk)r>   r?   r@   py5py9zassert %(py11)spy11)r)   r   r   rD   rE   rF   rG   rH   rI   rJ   rK   r{   )rL   r&   rv   rM   rN   rO   rP   rQ   r   meta@py_assert6@py_assert8@py_assert7@py_format10@py_format12r   r   r    test_long_segment_gets_splitM   s   z1TestStep1LengthSplit.test_long_segment_gets_splitc           	      C   rt   )Ng      $@r   z10s.flacru   r9   r;   r   rv   r=   rB   rC   r   Frw   r   rz   )r!   r   r   rD   rE   rF   rG   rH   rI   rJ   rK   r   r|   r   r   r    test_10s_segment_not_splitU   r   z/TestStep1LengthSplit.test_10s_segment_not_splitN)rg   rh   ri   r~   r   r   r   r   r   r   r    rs   ?   s
    rs   c                   @      e Zd Zdd Zdd ZdS )TestStep2BoundaryTrimc           
      C   s   d}t jtd| t jd}td|}t |||g}tdt|| d d}t|||\}}|j	}| }|sXdd	t
 v sCt|rHt|nd	t|d
 }	tt|	d  }}d S )Nr   g?rS         @z
clean.flac  original_fileoriginal_duration_msz1assert not %(py2)s
{%(py2)s = %(py0)s.discarded
}r   r>   rY   )r   r[   r   r   r!   concatenater   r   r   r{   rF   rG   rD   rH   rI   rJ   rK   )
rL   r   silencespeechr&   r   trimmedr^   @py_assert3@py_format4r   r   r    test_clean_boundaries_no_trim]   s   
^z3TestStep2BoundaryTrim.test_clean_boundaries_no_trimc           	      C   s   t d}tddddd}t|d|\}}|j}d}||u }|sStd|fd	||fd
t v s4t|r9t	|nd
t	|t	|d }dd|i }t
t|d  } }}d S )Nr5   x.flacr   Ttest)r   r   r{   discard_reasonr   rw   )z1%(py2)s
{%(py2)s = %(py0)s.discarded
} is %(py5)sr   r>   rY   r   assert %(py7)spy7)r!   r   r   r{   rD   rE   rF   rG   rH   rI   rJ   rK   )	rL   r&   r   resultr^   rO   r   @py_format6@py_format8r   r   r    %test_discarded_segment_passes_throughg   s   z;TestStep2BoundaryTrim.test_discarded_segment_passes_throughN)rg   rh   ri   r   r   r   r   r   r    r   \       
r   c                   @   r   )TestStep3SilencePadc                 C   s  d}t d|}tddd}t|||\}}t|d }t|}t|}d}|| }	||	 }
||
k}|std|fd	||
fd
t v sHt	trMt
tnd
dt v sYt	|r^t
|ndt
|d
t v snt	trst
tnd
dt v st	|rt
|ndt
|t
|dt v st	|rt
|ndd }dd|i }tt|d  } } } } }	}
|j}d}||k}|std|fd||fdt v st	|rt
|ndt
|t
|d }dd|i }tt|d  } }}|j}d}||k}|sBtd|fd||fdt v s#t	|r(t
|ndt
|t
|d }dd|i }tt|d  } }}d S )Nr   r   r     r   333333?r   r9   )zh%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == (%(py8)s
{%(py8)s = %(py5)s(%(py6)s)
} + (%(py10)s * %(py11)s))r   paddedr&   pad_samples)r>   r?   r@   r   rA   rC   rZ   r   zassert %(py15)spy15   )z6%(py2)s
{%(py2)s = %(py0)s.leading_pad_ms
} == %(py5)sr   r   r   r   )z7%(py2)s
{%(py2)s = %(py0)s.trailing_pad_ms
} == %(py5)s)r!   r   r   r   r   rD   rE   rF   rG   rH   rI   rJ   rK   leading_pad_mstrailing_pad_ms)rL   r   r&   r   r   r   rM   r   r_   @py_assert12@py_assert13rO   @py_format14@py_format16r^   r   r   r   r   r   r    test_adds_paddingo   s   
B z%TestStep3SilencePad.test_adds_paddingc                 C   s  d}t d|}tddd}t|||\}}t|d }tj}|d | }d}||k}	||	}
|
sltd|	fd	||ft|t|d
 }ddt	
 v sRttrWttndt||t|
d }tt|d  } } }	 }}
tj}|| d  }d}||k}	||	}
|
std|	fd	||ft|t|d
 }ddt	
 v sttrttndt||t|
d }tt|d  } } }	 }}
d S )Nr   r   r   r   r   r   r   r9   )z%(py4)s == %(py7)s)py4r   zGassert %(py11)s
{%(py11)s = %(py2)s
{%(py2)s = %(py0)s.all
}(%(py9)s)
}r   )r>   rY   r   r   )r!   r   r   r   r   r\   rD   rE   rI   rF   rG   rH   rJ   rK   )rL   r   r&   r   r   r   r^   r   r   rN   @py_assert10r   r   r   r   r    test_padding_is_silencey   s   
z+TestStep3SilencePad.test_padding_is_silenceN)rg   rh   ri   r   r   r   r   r   r    r   n   r   r   c                   @   rj   )TestStep4Encodec                 C   s  t d}t|d\}}t|}d}||k}|s\td|fd||fdt v s,ttr1ttnddt v s=t|rBt|ndt|t|d }d	d
|i }t	t
|d  } }}t|}d}||k}|std|fd||fdt v sttrttnddt v st|rt|ndt|t|d }d	d
|i }t	t
|d  } }}dd l}	|	|}
|
|k}|std|fd|
|fdt v st|
rt|
nddt v st|rt|ndd }dd|i }t	t
|d }d S )Nrm   r   r   rc   ro   r   
flac_bytesr=   rB   rC   b64r9   )z%(py0)s == %(py2)sdecodedr   zassert %(py4)sr   )r!   r   r   rD   rE   rF   rG   rH   rI   rJ   rK   base64	b64decode)rL   r&   r   r   rM   rN   rO   rP   rQ   r   r   r^   @py_format3@py_format5r   r   r    test_encode_produces_valid_flac   s   
z/TestStep4Encode.test_encode_produces_valid_flacN)rg   rh   ri   r   r   r   r   r    r      rr   r   c                   @   r3   )TestPolishSegmentc              	   C   s,  t d}t|}zt|}dd |D }t|}d}||k}|sftd|fd||fdt v s6ttr;t	tnddt v sGt|rLt	|ndt	|t	|d	 }d
d|i }	t
t|	d  } }}|D ]}
|
j}t|}d}||k}|std|fd||fdt v sttrt	tnddt v st|
rt	|
ndt	|t	|t	|d }	dd|	i }t
t|d  } } }}|
j}t|}d}||k}|s,td|fd||fdt v sttrt	tnddt v s	t|
rt	|
ndt	|t	|t	|d }	dd|	i }t
t|d  } } }}|
j}|j}d}||k}|s}td|fd||fdt v sZt|
r_t	|
ndt	|t	|t	|d }dd|i }t
t|d  } } }}qnW |jdd d S |jdd w )Nrl   c                 S      g | ]}|j js|qS r   	trim_metar{   .0rr   r   r    
<listcomp>       zJTestPolishSegment.test_full_pipeline_on_normal_segment.<locals>.<listcomp>ru   r   r   r   validr=   rB   rC   r   rc   )zO%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.flac_bytes
})
} > %(py8)sr   )r>   r?   r@   r   rC   zassert %(py10)srZ   )zQ%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.base64_audio
})
} > %(py8)s)zW%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.trim_meta
}.final_duration_ms
} > %(py7)s)r>   rY   r   r   zassert %(py9)sr   T
missing_ok)r!   r2   r   r   rD   rE   rF   rG   rH   rI   rJ   rK   r   base64_audior   final_duration_msunlink)rL   r&   pathrv   r   rM   rN   rO   rP   rQ   r   r   r   r`   r^   r   r   r   r   r   r    $test_full_pipeline_on_normal_segment   s   
z6TestPolishSegment.test_full_pipeline_on_normal_segmentc              	   C   s   t d}t|}zCt|}dd |D }t|}|s?ddt v s&ttr+ttndt|t|d }t	t
|d  }}W |jdd d S |jdd w )	Nrb   c                 s   s    | ]}|j jV  qd S )Nr   r   r   r   r    	<genexpr>   s    zHTestPolishSegment.test_full_pipeline_on_short_segment.<locals>.<genexpr>z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}r\   )r>   rY   r   Tr   )r!   r2   r   r\   rF   rG   rD   rH   rI   rJ   rK   r   )rL   r&   r   rv   r^   r   r   r   r   r    #test_full_pipeline_on_short_segment   s   nz5TestPolishSegment.test_full_pipeline_on_short_segmentc           
   	   C   s   t ddd}t|}zkt|}dd |D }t|}d}||k}|sgtd|fd||fd	t v s7ttr<t	tnd	d
t v sHt|rMt	|nd
t	|t	|d }dd|i }	t
t|	d  } }}W |jdd d S |jdd w )Ng      9@r   rn   c                 S   r   r   r   r   r   r   r    r      r   zHTestPolishSegment.test_full_pipeline_on_long_segment.<locals>.<listcomp>r   r   r   r   r   r=   rB   rC   Tr   )r)   r2   r   r   rD   rE   rF   rG   rH   rI   rJ   rK   r   )
rL   r&   r   rv   r   rM   rN   rO   rP   rQ   r   r   r    "test_full_pipeline_on_long_segment   s   z4TestPolishSegment.test_full_pipeline_on_long_segmentN)rg   rh   ri   r   r   r   r   r   r   r    r      s    	r   c                   @   rj   )TestPolishAllSegmentsc              
   C   s  g }dD ]}t |}|t| qzpt|}dd |D }t|}d}||k}|sotd|fd||fdt v s?t	trDt
tnddt v sPt	|rUt
|ndt
|t
|d	 }	d
d|	i }
tt|
d  } }}W |D ]}|jdd qxd S |D ]}|jdd qw )N)r   rl   rb   r   c                 S   r   r   r   r   r   r   r    r      r   z;TestPolishAllSegments.test_batch_polish.<locals>.<listcomp>   r   r   r   r   r=   rB   rC   Tr   )r!   appendr2   r   r   rD   rE   rF   rG   rH   rI   rJ   rK   r   )rL   pathsdurr&   rv   r   rM   rN   rO   rP   rQ   pr   r   r    test_batch_polish   s   z'TestPolishAllSegments.test_batch_polishN)rg   rh   ri   r   r   r   r   r    r      rr   r   )r   r   )r   r   )r   )'__doc__builtinsrF   _pytest.assertion.rewrite	assertionrewriterD   numpyr   pytest	soundfiler.   r,   pathlibr   src.audio_polishr   r   r   r   r   r   r	   r
   r   floatr   ndarrayr!   r)   r2   r4   rk   rs   r   r   r   r   r   r   r   r   r    <module>   s2    ",

#