o
    *j                     @   s   d dl mZmZmZ d dlZd dlZ			ddeejejf de	de
de
dee	 d	eeejejf e	f fd
dZ	ddejde	d	eej fddZ	ddejd	eej fddZdS )    )OptionalTupleUnionNFwaveformsample_ratenormalize_volumeto_monoto_sample_ratereturnc                 C   s   zddl m} W n ty   tdw g }|r|ddg |dur/||kr/|d| g |r?| jd dkr?|dd	g t|dkrgt| tj}|rRt	
| n| }||||\}	}
|rc|	 }	|	|
fS | |fS )
aj  convert a waveform:
    - to a target sample rate
    - from multi-channel to mono channel
    - volume normalization

    Args:
        waveform (numpy.ndarray or torch.Tensor): 2D original waveform
            (channels x length)
        sample_rate (int): original sample rate
        normalize_volume (bool): perform volume normalization
        to_mono (bool): convert to mono channel if having multiple channels
        to_sample_rate (Optional[int]): target sample rate
    Returns:
        waveform (numpy.ndarray): converted 2D waveform (channels x length)
        sample_rate (float): target sample rate
    r   Nz1Please install torchaudio: pip install torchaudioZgainz-nZrate   Zchannels1)Ztorchaudio.sox_effectsZsox_effectsImportErrorappendshapelen
isinstancenpndarraytorch
from_numpyZapply_effects_tensornumpy)r   r   r   r   r	   Zta_soxZeffectsZis_np_inputZ	_waveformZ	convertedZconverted_sample_rate r   p/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/preprocessors/ofa/utils/audio_helper.pyconvert_waveform	   s,   r   P   c                 C   s   zCddl m}m} ddlm} ddlm} ddlm} | }||_	| }	||	_
| }
||
_|	|
_||
d}|||  d }|W S  tyM   Y dS w )	z)Get mel-filter bank features via PyKaldi.r   )FbankFbankOptions)MelBanksOptions)FrameExtractionOptions)Vector)optsg      ?N)Zkaldi.feat.fbankr   r   Zkaldi.feat.melr   Zkaldi.feat.windowr   Zkaldi.matrixr   Znum_binsZ	samp_freqmel_opts
frame_optsZcomputeZsqueezer   r   )r   r   n_binsr   r   r   r   r   r!   r"   r    fbankfeaturesr   r   r   _get_kaldi_fbank7   s$   
r&   c                 C   sL   zddl m  m} t| } |j| ||d}| W S  ty%   Y dS w )z,Get mel-filter bank features via TorchAudio.r   N)Znum_mel_binsZsample_frequency)Ztorchaudio.compliance.kaldiZ
complianceZkaldir   r   r$   r   r   )r   r   r#   Zta_kaldir%   r   r   r   _get_torchaudio_fbankO   s   

r'   )FFN)r   )typingr   r   r   r   r   r   r   ZTensorintboolr   r&   r'   r   r   r   r   <module>   s:   
0


