o
    Zh&                     @   sp   d Z ddlmZmZmZ ddlZddlmZ ddl	m
Z
 ddlmZmZmZ eeZG dd	 d	eZd	gZdS )
z$Feature extractor class for EnCodec.    )ListOptionalUnionN   )SequenceFeatureExtractor)BatchFeature)PaddingStrategy
TensorTypeloggingc                       s   e Zd ZdZddgZ					dded	ed
edee dee f
 fddZe	dee fddZ
e	dee fddZ					ddeejee eej eee  f deeeeef  dee dee deeeef  d	ee defddZ  ZS )EncodecFeatureExtractora  
    Constructs an EnCodec feature extractor.

    This feature extractor inherits from [`~feature_extraction_sequence_utils.SequenceFeatureExtractor`] which contains
    most of the main methods. Users should refer to this superclass for more information regarding those methods.

    Instantiating a feature extractor with the defaults will yield a similar configuration to that of the
    [facebook/encodec_24khz](https://huggingface.co/facebook/encodec_24khz) architecture.

    Args:
        feature_size (`int`, *optional*, defaults to 1):
            The feature dimension of the extracted features. Use 1 for mono, 2 for stereo.
        sampling_rate (`int`, *optional*, defaults to 24000):
            The sampling rate at which the audio waveform should be digitalized expressed in hertz (Hz).
        padding_value (`float`, *optional*, defaults to 0.0):
            The value that is used to fill the padding values.
        chunk_length_s (`float`, *optional*):
            If defined the audio is pre-processed into chunks of lengths `chunk_length_s` and then encoded.
        overlap (`float`, *optional*):
            Defines the overlap between each chunk. It is used to compute the `chunk_stride` using the following
            formulae : `int((1.0 - self.overlap) * self.chunk_length)`.
    input_valuespadding_mask   ]          Nfeature_sizesampling_ratepadding_valuechunk_length_soverlapc                    s*   t  jd|||d| || _|| _d S )N)r   r   r    )super__init__r   r   )selfr   r   r   r   r   kwargs	__class__r   e/var/www/auris/lib/python3.10/site-packages/transformers/models/encodec/feature_extraction_encodec.pyr   7   s   	
z EncodecFeatureExtractor.__init__returnc                 C   s   | j d u rd S t| j | j S )N)r   intr   r   r   r   r   chunk_lengthE   s   
z$EncodecFeatureExtractor.chunk_lengthc                 C   s2   | j d u s
| jd u rd S tdtd| j | j S )Nr   g      ?)r   r   maxr   r!   r    r   r   r   chunk_strideM   s   z$EncodecFeatureExtractor.chunk_strideF	raw_audiopadding
truncation
max_lengthreturn_tensorsc              
   C   s  |dur|| j krtd|  d| j  d| j  d| d	ntd| jj d |r0|r0td	|du r6d
}tt|tt	foHt|d t
jt	tf}|rTdd |D }n&|set|t
jset
j|t
jd}nt|t
jrz|jt
t
ju rz|t
j}|st
|jg}t|D ]=\}}	|	jdkrtd|	j | jdkr|	jdkrtd|	jd  d| jdkr|	jd dkrtd|	jd  dqd}
td|i}| jdur#| jdur#|du r#|rtdd |D }tt
|| j }|d | j | j }n%|r!tdd |D }tt
|| j }|d | j | j }d}n|}
|
du r<| j|||||d}
|r<|
d|
d< g }|
dD ]}	| jdkrO|	d }	| |	j qC||
d< |dure|
!|}
|
S )a  
        Main method to featurize and prepare for the model one or several sequence(s).

        Args:
            raw_audio (`np.ndarray`, `List[float]`, `List[np.ndarray]`, `List[List[float]]`):
                The sequence or batch of sequences to be processed. Each sequence can be a numpy array, a list of float
                values, a list of numpy arrays or a list of list of float values. The numpy array must be of shape
                `(num_samples,)` for mono audio (`feature_size = 1`), or `(2, num_samples)` for stereo audio
                (`feature_size = 2`).
            padding (`bool`, `str` or [`~utils.PaddingStrategy`], *optional*, defaults to `True`):
                Select a strategy to pad the returned sequences (according to the model's padding side and padding
                index) among:

                - `True` or `'longest'`: Pad to the longest sequence in the batch (or no padding if only a single
                  sequence if provided).
                - `'max_length'`: Pad to a maximum length specified with the argument `max_length` or to the maximum
                  acceptable input length for the model if that argument is not provided.
                - `False` or `'do_not_pad'` (default): No padding (i.e., can output a batch with sequences of different
                  lengths).
            truncation (`bool`, *optional*, defaults to `False`):
                Activates truncation to cut input sequences longer than `max_length` to `max_length`.
            max_length (`int`, *optional*):
                Maximum length of the returned list and optionally padding length (see above).
            return_tensors (`str` or [`~utils.TensorType`], *optional*):
                If set, will return tensors instead of list of python integers. Acceptable values are:

                - `'tf'`: Return TensorFlow `tf.constant` objects.
                - `'pt'`: Return PyTorch `torch.Tensor` objects.
                - `'np'`: Return Numpy `np.ndarray` objects.
            sampling_rate (`int`, *optional*):
                The sampling rate at which the `audio` input was sampled. It is strongly recommended to pass
                `sampling_rate` at the forward call to prevent silent errors.
        Nz3The model corresponding to this feature extractor: z& was trained using a sampling rate of zB. Please make sure that the provided audio input was sampled with z	 and not .zDIt is strongly recommended to pass the `sampling_rate` argument to `zN()`. Failing to do so can result in silent errors that might be hard to debug.zABoth padding and truncation were set. Make sure you only set one.Tr   c                 S   s   g | ]}t j|t jd jqS )dtype)npasarrayfloat32T).0Zaudior   r   r   
<listcomp>   s    z4EncodecFeatureExtractor.__call__.<locals>.<listcomp>r*      z6Expected input shape (channels, length) but got shape r   z$Expected mono audio but example has z	 channelsz&Expected stereo audio but example has r   c                 s       | ]}|j d  V  qdS r   Nshaper0   arrayr   r   r   	<genexpr>       z3EncodecFeatureExtractor.__call__.<locals>.<genexpr>c                 s   r4   r5   r6   r8   r   r   r   r:      r;   r'   )r'   r&   r%   Zreturn_attention_maskZattention_maskr   ).N)"r   
ValueErrorloggerwarningr   __name__bool
isinstancelisttupler,   ndarrayr-   r.   r+   Zfloat64Zastyper/   	enumeratendimr7   r   r   r#   r!   minr   floorr"   ceilpadpopappendZconvert_to_tensors)r   r$   r%   r&   r'   r(   r   Z
is_batchedidxZexampleZpadded_inputsr   Znb_stepr   r   r   __call__T   s   *
"
"


z EncodecFeatureExtractor.__call__)r   r   r   NN)NFNNN)r?   
__module____qualname____doc__Zmodel_input_namesr   floatr   r   propertyr!   r#   r   r,   rD   r   r@   strr   r	   r   rN   __classcell__r   r   r   r   r      sV    	"r   )rQ   typingr   r   r   numpyr,   Z!feature_extraction_sequence_utilsr   Zfeature_extraction_utilsr   utilsr   r	   r
   Z
get_loggerr?   r=   r   __all__r   r   r   r   <module>   s   
 
5