o
    i                     @   s   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 ee jed	krDd d
lmZ nedddZeddG dd deZdS )    N)contextmanager)LooseVersion)tables)	to_device)CTTransformer)load_audio_text_image_video)split_to_mini_sentencesplit_wordsz1.6.0)autocastTc                 c   s    d V  d S N )enabledr   r   `/home/ubuntu/.local/lib/python3.10/site-packages/funasr/models/ct_transformer_streaming/model.pyr
      s   
r
   model_classesCTTransformerStreamingc                       sj   e Zd ZdZ fddZdejdejdejfddZd	d
 Zddddi fde	de
fddZdd Z  ZS )r   z
    Author: Speech Lab of DAMO Academy, Alibaba Group
    CT-Transformer: Controllable time-delay transformer for real-time punctuation prediction and disfluency detection
    https://arxiv.org/pdf/2003.01309.pdf
    c                    s   t  j|i | d S r   )super__init__)selfargskwargs	__class__r   r   r   #   s   zCTTransformerStreaming.__init__texttext_lengthsvad_indexesc           	      K   s2   |  |}| j|||d\}}}| |}|dfS )zCompute loss value from buffer sequences.

        Args:
            input (torch.Tensor): Input ids. (batch, len)
            hidden (torch.Tensor): Target ids. (batch, len)

        )r   N)embedencoderdecoder)	r   r   r   r   r   xh_yr   r   r   punc_forward*   s   


z#CTTransformerStreaming.punc_forwardc                 C   s   dS )NTr   r   r   r   r   with_vad:   s   zCTTransformerStreaming.with_vadNkeycachec           '   	      s  t |dksJ t |dkrg |d< t||dddd }d|d d | }|d	d
}	t|}
||
}t|
|	}t||	}t |t |ksLJ g }tt	j
g dd}d}g }g }d}g }i }d }tt |D ]}|| }|| }|| }t	j||fdd}tt|dtt	j
t |gddtt	j
t |d gddd}t||d } jdi |\}}|d|jd jddd\}}|}| d dkrt|}| d t |ksJ |t |d k r`d}d} tt |d ddD ]+}! j||!  dks j||!  dkr|!} n| dk r' j||!  dkr'|!} q|dk r@t ||kr@| dkr@| } j||< ||d d  }||d d  }|d|d  }|d|d  }|  }"| fdd|"D 7 }||7 }qlt |t |ksJ g }#g }$tdt |D ]_}!|!dkrt ||! d  dkrt ||!d  d  dkrd||!  ||!< |t |d k r|d7 }n|#||!  |t |d kr|$||!  ||! dkr|#||!  qd|#}%d}tt |d ddD ]}!||! dks||! dkr|!} nq||d d  |d< |%d  jv r/|%d d }%d|$d< |d u r7|}n	tj||gdd}|d |%|d}&||& ||fS )N   r   pre_textr   r   )	data_type  
split_size   int32)dtype   )axis)r   r   r   device)dim   u   。u   ？u   ，c                    s   g | ]	} j t| qS r   )	punc_listint).0r   r#   r   r   
<listcomp>   s    z4CTTransformerStreaming.inference.<locals>.<listcomp>r    )r%   r   
punc_arrayr   )lenr   getjoinr	   encoder   torch
from_numpynparrayrangeconcatenate	unsqueezer   r"   viewshapetopksizesqueezer6   sentence_end_idcpunumpyappendcat)'r   data_indata_lengthsr%   	tokenizerfrontendr&   r   r   r,   tokens
tokens_intmini_sentencesmini_sentences_id
cache_sentcache_sent_idskip_numsentence_punc_listsentence_words_listcache_pop_trigger_limitresults	meta_datar:   mini_sentence_imini_sentencemini_sentence_iddatar!   r    indicespunctuationssentenceEndlast_comma_indexipunctuations_npwords_with_puncsentence_punc_list_outsentence_outresult_ir   r#   r   	inference=   s   



 









z CTTransformerStreaming.inferencec                 K   s"   ddl m} |dd| i|}|S )Nr'   )export_rebuild_modelmodelr   )export_metaro   )r   r   ro   modelsr   r   r   export   s   zCTTransformerStreaming.export)__name__
__module____qualname____doc__r   r?   Tensorr"   r$   listdictrn   rs   __classcell__r   r   r   r   r      s,    

)T)r?   rM   rA   
contextlibr   distutils.versionr   funasr.registerr   funasr.train_utils.device_funcsr   "funasr.models.ct_transformer.modelr   funasr.utils.load_utilsr   "funasr.models.ct_transformer.utilsr   r	   __version__torch.cuda.ampr
   registerr   r   r   r   r   <module>   s   
