o
    i                     @   s   d dl Z d dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZmZmZmZmZmZmZ e	eje	d	krRd d
lmZ nedddZeddG dd dejjZdS )    N)OrderedDict)contextmanager)LooseVersion)tables)extract_feature)load_audio_text_image_video)
DenseLayer	StatsPool	TDNNLayerCAMDenseTDNNBlockTransitLayerget_nonlinearFCMz1.6.0)autocastTc                 c   s    d V  d S )N )enabledr   r   P/home/ubuntu/.local/lib/python3.10/site-packages/funasr/models/campplus/model.pyr       s   
r   model_classesCAMPPlusc                       sN   e Zd Z								d fd	d
	Zdd Z				ddefddZ  ZS )r   P                batchnorm-reluTsegmentc	                    s  t    t|d| _| jj}
|| _tjt	dt
|
|dddd|dfg| _|}
ttdd	d
D ]=\}\}}}t||
||| ||||d}| jd|d  | |
||  }
| jd|d  t|
|
d d|d |
d }
q1| jdt||
 | jdkr| jdt  | jdt|
d |dd n	| jdksJ d|  D ]#}t|tjjtjjfrtjj|jj |jd urtjj|j qd S )N)feat_dimtdnn         )stridedilationpadding
config_str)         )   r)   r)   )r    r   r   )
num_layersin_channelsout_channelsbn_channelskernel_sizer#   r%   memory_efficientzblock%dz	transit%dF)biasr%   out_nonlinearr   statsdense
batchnorm_)r%   framez6`output_level` should be set to 'segment' or 'frame'. )super__init__r   headr,   output_leveltorchnn
Sequentialr   r
   xvector	enumeratezipr   
add_moduler   r   r	   r   modules
isinstanceConv1dLinearinitkaiming_normal_weightdatar0   zeros_)selfr   embedding_sizegrowth_ratebn_sizeinit_channelsr%   r/   r9   kwargschannelsir*   r.   r#   blockm	__class__r   r   r7   '   sr   






zCAMPPlus.__init__c                 C   s<   | ddd}| |}| |}| jdkr|dd}|S )Nr   r   r    r5   )permuter8   r=   r9   	transpose)rJ   xr   r   r   forwards   s   


zCAMPPlus.forwardNkeyc                 K   s   i }t  }t|d|dddd}	t  }
|
| d|d< t|	\}}}|j|d d}t  }||
 d|d	< t| 	 d
 |d< d| 
|tjig}||fS )Ni>  fssound)r[   audio_fs	data_typez0.3f	load_datadevice)r`   extract_featg     @@batch_data_timespk_embedding)timeperf_counterr   getr   tonparraysumitemrY   r:   float32)rJ   data_indata_lengthsrZ   	tokenizerfrontendrO   	meta_datatime1audio_sample_listtime2speechspeech_lengthsspeech_timestime3resultsr   r   r   	inference{   s   
zCAMPPlus.inference)r   r   r   r   r   r   Tr   )NNNN)__name__
__module____qualname__r7   rY   listrz   __classcell__r   r   rT   r   r   %   s$    L)T)rd   r:   numpyrh   collectionsr   
contextlibr   distutils.versionr   funasr.registerr   funasr.models.campplus.utilsr   funasr.utils.load_utilsr   !funasr.models.campplus.componentsr   r	   r
   r   r   r   r   __version__torch.cuda.ampr   registerr;   Moduler   r   r   r   r   <module>   s    $
