o
    Si6$                     @   s  d dl mZ d dlmZmZmZ d dlmZ d dlm	Z	m
Z
mZmZmZmZ d dlZd dlZd dlmZmZ d dlmZmZmZ eG dd	 d	ZeG d
d dZG dd deeZeG dd dZeG dd deZeG dd dZeG dd deZdS )    )ABC)asdict	dataclassfield)partial)AnyDictListOptionalSequenceUnionN)FeatureExtractorregister_extractor)EPSILONSecondsis_module_availablec                   @   s   e Zd ZU dZeed< dZeed< dZeed< dZ	e
ed< d	Ze
ed
< dZeed< dZeed< dZeed< dZe
ed< dZeed< deeef fddZedeeef dd fddZdS )KaldifeatFrameOptionsi>  sampling_rateg{Gz?frame_shiftg?frame_lengthg        ditherg
ףp=
?preemph_coeffTremove_dc_offsetpoveywindow_typeround_to_power_of_twogzG?blackman_coeffF
snip_edgesreturnc                 C   sB   t | }t|d|d< |dd |d< |dd |d< |S )Nr   	samp_freqr   g     @@frame_shift_msr   frame_length_ms)r   floatpopselfd r'   M/home/ubuntu/.local/lib/python3.10/site-packages/lhotse/features/kaldifeat.pyto_dict   s
   zKaldifeatFrameOptions.to_dictdatac                 C   s\   |   } d| v rt| d| d< dD ]}|| v r&| |d | |dd< qtdi | S )Nr   r   )r    r!     _ms r'   )copyintr#   replacer   )r*   keyr'   r'   r(   	from_dict!   s   zKaldifeatFrameOptions.from_dictN)__name__
__module____qualname__r   r/   __annotations__r   r   r   r   r"   r   r   boolr   strr   r   r   r   r   r)   staticmethodr2   r'   r'   r'   r(   r      s   
  r   c                   @   s   e Zd ZU dZeed< dZeed< dZeed< dZ	eed< d	Z
eed
< dZeed< dZeed< deeef fddZedeeef dd fddZdS )KaldifeatMelOptionsP   num_binsg      4@low_freqg      y	high_freqg      Y@vtln_lowg     @	vtln_highF	debug_melhtk_moder   c                 C   s   t | S N)r   r%   r'   r'   r(   r)   6      zKaldifeatMelOptions.to_dictr*   c                 C   s   t di | S )Nr'   )r:   )r*   r'   r'   r(   r2   9   s   zKaldifeatMelOptions.from_dictN)r3   r4   r5   r<   r/   r6   r=   r"   r>   r?   r@   rA   r7   rB   r   r8   r   r)   r9   r2   r'   r'   r'   r(   r:   ,   s   
  r:   c                       s  e Zd ZdZddee ddf fddZedee	e
jf fddZ	dd	eeje
jeej ee
j f d
edeeeje
jf  deeje
jeej ee
j f fddZd	eeje
jeej ee
j f d
edeeje
jeej ee
j f fddZedefddZ  ZS )KaldifeatExtractorz
    Base class with shared implementation for kaldifeat feature extractors.
    Derived classes are expected to set ``self.extractor`` inside ``__init__``.
    Nconfigr   c                    s"   t  j|d tdsJ dd S )N)rG   	kaldifeatzBTo use kaldifeat extractors, please "pip install kaldifeat" first.)super__init__r   )r%   rG   	__class__r'   r(   rJ   D   s   zKaldifeatExtractor.__init__c                 C      | j jS rC   )rG   devicerD   r'   r'   r(   rN   J   s   zKaldifeatExtractor.devicesamplesr   lengthsc                 C   s*   |d urdd t ||D }| j||dS )Nc                 S   s   g | ]
\}}|d | qS rC   r'   ).0xlr'   r'   r(   
<listcomp>X   s    z4KaldifeatExtractor.extract_batch.<locals>.<listcomp>)rO   r   )zipextract)r%   rO   r   rP   r'   r'   r(   extract_batchN   s   	z KaldifeatExtractor.extract_batchc                    s4  | j jj}||ksJ d| d| dd  d}t|tr!d}n|jdkr+t|}n|g}tt|D ]&}t|| tj	rKt
|| ||< dd  || jd	krZ||  ||< q4| j|| j jd
tdkry|rs d gS  d S tfdddd  D r t
jddS  fddD S )Nz,Mismatched sampling rate: extractor expects z, got c                 S   s   | S rC   r'   rR   r'   r'   r(   <lambda>m   s    z,KaldifeatExtractor.extract.<locals>.<lambda>FT   c                 S   s   |   S rC   )numpyrX   r'   r'   r(   rY   |   s       )
chunk_sizer   c                 3   s     | ]}|j  d  j kV  qdS )r   N)shape)rQ   item)resultr'   r(   	<genexpr>   s    z-KaldifeatExtractor.extract.<locals>.<genexpr>)dimc                    s   g | ]} |qS r'   r'   )rQ   r)maybe_as_numpyr'   r(   rT      s    z.KaldifeatExtractor.extract.<locals>.<listcomp>)rG   
frame_optsr   
isinstancelistndimrangelennpndarraytorch
from_numpysqueeze	extractorr]   allstack)r%   rO   r   expected_srinput_is_listidxr'   )rd   r`   r(   rV   [   s:   

	


zKaldifeatExtractor.extractc                 C   
   | j jjS rC   )rG   re   r   rD   r'   r'   r(   r      s   
zKaldifeatExtractor.frame_shiftrC   )r3   r4   r5   __doc__r
   r   rJ   propertyr   r8   rm   rN   rk   rl   Tensorr   r/   r	   rW   rV   r   r   __classcell__r'   r'   rK   r(   rF   >   s8    	

4rF   c                   @   s   e Zd ZU eedZeed< eedZeed< dZ	e
ed< eZeed< dZe
ed< dZe
ed	< dZe
ed
< dZe
ed< dZeeejf ed< dZee ed< deeef fddZedeeef dd fddZdS )KaldifeatFbankConfigdefault_factoryre   mel_optsF
use_energyenergy_floorT
raw_energy
htk_compatuse_log_fbank	use_powercpurN   i r]   r   c                 C   (   t | }| j |d< | j |d< |S Nre   r~   r   re   r)   r~   r$   r'   r'   r(   r)         zKaldifeatFbankConfig.to_dictr*   c                 C   4   t | d}t| d}td||d| S Nre   r~   )re   r~   r'   )r   r2   r#   r:   r{   r*   re   r~   r'   r'   r(   r2         zKaldifeatFbankConfig.from_dictN)r3   r4   r5   r   r   re   r6   r:   r~   r   r7   r   r   r"   r   r   r   r   rN   r   r8   rm   r]   r
   r/   r   r   r)   r9   r2   r'   r'   r'   r(   r{      s   
  r{   c                	       s   e Zd ZdZdZeZddee ddf fddZde	de	fd	d
Z
edejdejdedejfddZedejdefddZ  ZS )KaldifeatFbankzLLog Mel energy filter bank feature extractor based on ``kaldifeat`` package.zkaldifeat-fbankNrG   r   c                    2   t  | dd l}||j| j | _d S Nr   )	rI   rJ   rH   FbankFbankOptionsr2   rG   r)   rp   r%   rG   rH   rK   r'   r(   rJ      
   
zKaldifeatFbank.__init__r   c                 C   rv   rC   )rG   r~   r<   r%   r   r'   r'   r(   feature_dim   s   
zKaldifeatFbank.feature_dim
features_a
features_benergy_scaling_factor_bc              
   C   s&   t t tt | |t |  S rC   )rk   logmaximumr   exp)r   r   r   r'   r'   r(   mix   s   zKaldifeatFbank.mixfeaturesc                 C   s   t tt| S rC   )r"   rk   sumr   )r   r'   r'   r(   compute_energy   s   zKaldifeatFbank.compute_energyrC   )r3   r4   r5   rw   namer{   config_typer
   rJ   r/   r   r9   rk   rl   r"   r   r   rz   r'   r'   rK   r(   r      s$    r   c                   @   s   e Zd ZU eedZeed< eeedddZ	eed< dZ
eed< dZeed	< eZeed
< dZeed< dZeed< dZeed< dZeeejf ed< dZee ed< deeef fddZedeeef dd fddZdS )KaldifeatMfccConfigr|   re      )r<   r~      num_cepsFr   r   Tr   g      6@cepstral_lifterr   r   rN   r+   r]   r   c                 C   r   r   r   r$   r'   r'   r(   r)      r   zKaldifeatMfccConfig.to_dictr*   c                 C   r   r   )r   r2   r#   r:   r   r   r'   r'   r(   r2      r   zKaldifeatMfccConfig.from_dictN)r3   r4   r5   r   r   re   r6   r   r:   r~   r   r/   r   r7   r   r   r"   r   r   r   rN   r   r8   rm   r]   r
   r   r   r)   r9   r2   r'   r'   r'   r(   r      s    
 
 r   c                       sJ   e Zd ZdZdZeZddee ddf fddZde	de	fd	d
Z
  ZS )KaldifeatMfccz6MFCC feature extractor based on ``kaldifeat`` package.zkaldifeat-mfccNrG   r   c                    r   r   )	rI   rJ   rH   MfccMfccOptionsr2   rG   r)   rp   r   rK   r'   r(   rJ      r   zKaldifeatMfcc.__init__r   c                 C   rM   rC   )rG   r   r   r'   r'   r(   r     rE   zKaldifeatMfcc.feature_dimrC   )r3   r4   r5   rw   r   r   r   r
   rJ   r/   r   rz   r'   r'   rK   r(   r      s    r   ) abcr   dataclassesr   r   r   	functoolsr   typingr   r   r	   r
   r   r   r[   rk   rm   lhotse.features.baser   r   lhotse.utilsr   r   r   r   r:   rF   r{   r   r   r   r'   r'   r'   r(   <module>   s*     V"