o
    i                     @   sz   d dl Z d dlmZmZ d dlZd dlmZmZ d dl	m
Z
mZ d dlmZ d dlmZmZmZmZmZ G dd dZdS )	    N)IteratorTuple)ReaderWriter)Graphaformat)tqdm)
FRAME_SIZESAMPLE_RATEcreatedestroyprocess_framec                
   @   s   e Zd ZdefddZdd Zedd Zedd	 Zd
d Z	dde
jdedee
je
jf fddZdde
jdedeee
je
jf  fddZdd ZdS )RNNoisesample_ratec                 C   s(   || _ d | _d | _d | _d | _d | _d S N)r   channelsdenoise_statesdtype	_in_graph
_out_graph)selfr    r   G/home/ubuntu/.local/lib/python3.10/site-packages/pyrnnoise/pyrnnoise.py__init__   s   
zRNNoise.__init__c                 C   s&   | j d ur| j D ]}t| qd S d S r   )r   r   r   denoise_stater   r   r   __del__#   s
   


zRNNoise.__del__c                 C   s4   | j d u rt| j| j| jttjtgt	d| _ | j S )N)rater   r   filters
frame_size)
r   r   r   r   r   r   npint16r
   r	   r   r   r   r   in_graph(   s   
zRNNoise.in_graphc                 C   s2   | j d u rtttj| jttj| jgd| _ | j S )N)r   r   r   r   )r   r   r
   r    r!   r   r   r   r"   r   r   r   	out_graph4   s   
zRNNoise.out_graphc                 C   sB   | j d ur| j D ]}t| qd | _ d | _| jtkrd | _d S d S r   )r   r   r   r   r
   r   r   r   r   r   reset?   s   




zRNNoise.resetFframepartialreturnc                 C   sz   | j du rdd t| jD | _ t| j |\}}| jtkr3| j| tj	dd | j
|D dd}|r9|   ||fS )aJ  
        Denoise a single frame of audio data.

        Args:
            frame (np.ndarray): Input audio frame, can be 1D (mono) or 2D (stereo).
            partial (bool): Whether this is the last frame of a chunk.
        Returns:
            Tuple[np.ndarray, np.ndarray]: Speech probability and denoised audio frame.
        Nc                 S   s   g | ]}t  qS r   )r   ).0_r   r   r   
<listcomp>S   s    z)RNNoise.denoise_frame.<locals>.<listcomp>c                 S      g | ]\}}|qS r   r   r)   r&   r*   r   r   r   r+   W          )axis)r   ranger   r   r   r
   r$   pushr    concatenatepullr%   )r   r&   r'   denoised_framespeech_probsr   r   r   denoise_frameH   s   


 zRNNoise.denoise_framechunkc                 c   sv    t |}|jd | _|j| _| j| dd | j|D }t|D ]\}}| 	||o5|t
|d kV  q%dS )aA  
        Denoise a chunk of audio data.

        Args:
            chunk (np.ndarray): Input audio chunk, can be 1D (mono) or 2D (stereo).
            partial (bool): Whether this is the last chunk of a file.
        Yields:
            Tuple[np.ndarray, np.ndarray]: Speech probability and denoised audio frame.
        r   c                 S   r,   r   r   r-   r   r   r   r+   k   r.   z)RNNoise.denoise_chunk.<locals>.<listcomp>r/   N)r    
atleast_2dshaper   r   r#   r2   r4   	enumerater7   len)r   r8   r'   framesidxr&   r   r   r   denoise_chunk\   s   

 zRNNoise.denoise_chunkc                 c   s    t |tjtd}t||j}t|jt }t	t
|d|ddD ]\}\}}||d k}	| ||	D ]\}
}|| |
V  q3q!|  dS )a  
        Denoise a WAV file and save the output.

        Args:
            in_path (str): Path to the input WAV file.
            out_path (str): Path to save the denoised WAV file.
        Yields:
            float: Speech probability for each processed frame.
        )r   r   	Denoisingr=   )desctotalunitr/   N)r   r    r!   r	   r   r   mathceil
num_framesr   r;   r?   writeclose)r   in_pathout_pathreaderwriterrF   r>   r&   r*   r'   speech_probr   r   r   denoise_wavo   s   
 
zRNNoise.denoise_wavN)F)__name__
__module____qualname__intr   r   propertyr#   r$   r%   r    ndarrayboolr   r7   r   r?   rN   r   r   r   r   r      s    


&	*r   )rD   typingr   r   numpyr    audiolabr   r   audiolab.avr   r   r   pyrnnoise.rnnoiser	   r
   r   r   r   r   r   r   r   r   <module>   s   