o
    4ѹg(                     @   sf   d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZm	Z	 dZ
dd Zdd ZG d	d
 d
ZdS )    N)defaultdict)ListOptionalTupleuV   [’!"#$%&'()*+,-./:;<>=?@，。?★、…【】《》？“”‘’！[\]^_`{|}~\s]+c                 C   sr   g }|   }t|dkr7td|}|d ur|d}n|dd }|| ||ddd}t|dks|S )Nr   z[A-Za-z!?,<>()\']+     )lowerlenrematchgroupappendreplacestrip)Z	input_strtokenssr   word r   Z/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/site-packages/funasr/utils/kws_utils.pysplit_mixed_label   s   
r   c                 C   s  t  }t  }| |v r|| f }|||  f }||fS t| }|D ]`}|dks.|dks.|dkr3|d }q |dks;|dkr@|d }q |dksP|dksP|d	ksP|d
krU|d }q ||v r_||f }q ||v ro|| D ]}||f }qgttd|}|D ]}||f }qxq |D ]c}||v r||| f }q|dkrd|v r||d f }q||d f }q|dkrd|v r||d f }q||d f }qd|v r||d f }td| d q||d f }td| d q||fS )N!silz(sil)z<sil>)r   <blank>)r   z(noise)znoise)z(noisez<noise>)<unk>r   Zsilr   'z)' is not in token set, replace with <unk>z+' is not in token set, replace with <blank>)tupler   r   sub
symbol_strlogginginfo)txtZsymbol_tableZlexicon_tableZ
tokens_strZ
tokens_idxpartspartchr   r   r   query_token_set   sP   


 
r$   c                   @   s   e Zd ZdZdejjdedede	fddZ
				
ddejdejdedededeeee  ejf fddZdd ZdejdejfddZdejfddZdS )KwsCtcPrefixDecoderz.Decoder interface wrapper for CTCPrefixDecode.ctckeywords
token_listseg_dictc                    s   | _ | _i }|D ]	}||||< q
dh _i  _| _ j ddd}|D ].}t	|||\}	}
i  j|< |
 j| d< d
dd |
D  j| d<  fd	d
|
D  q,dS )zInitialize class.

        Args:
            ctc (torch.nn.Module): The CTC implementation.
                For example, :class:`espnet.nets.pytorch_backend.ctc.CTC`

        r   r   r   ,token_idc                 s   s    | ]	}d t | V  qdS )z%s N)str.0ir   r   r   	<genexpr>n   s    z/KwsCtcPrefixDecoder.__init__.<locals>.<genexpr>Z	token_strc                    s   g | ]} j |qS r   )keywords_idxsetaddr-   selfr   r   
<listcomp>o       z0KwsCtcPrefixDecoder.__init__.<locals>.<listcomp>N)r&   r(   indexr1   keywords_tokenZkeywords_strr   r   splitr$   join)r4   r&   r'   r(   r)   Ztoken_tabletokenZkeywords_listkeywordstrsZindexsr   r3   r   __init__Q   s    
zKwsCtcPrefixDecoder.__init__N      logitslogits_lengthskeywords_tokensetscore_beam_sizepath_beam_sizereturnc              
   C   s  | d}|}t ddg ffg}td|D ]R}	||	 }
tdd }|
|\}}g }g }t| | D ])\}}|durQ|dkrP||v rP|| || q6|dkr_|| || q6t|dkrgq|D ]}|
| 	 }|D ]\}\}}}t|dkr|d nd}|dkr|| \}}}|||  ||  }|
 }|||f||< qs||krtj|dd	d
s|| \}}}|||  }|
 }||d d kr||d d< |	|d d< |||f||< tj|dd	d
s||f }|| \}}}|||  }|
 }|t||	|d |||f||< qs||f }|| \}}}|r6||d d kr5||d d< |	|d d< n|
 }|t||	|d |||  ||  }|||f||< qsqit| dd dd}|d| }qdd |D }|S )a   CTC prefix beam search inner implementation

        Args:
            logits (torch.Tensor): (1, max_len, vocab_size)
            logits_lengths (torch.Tensor): (1, )
            keywords_tokenset (set): token set for filtering score
            score_beam_size (int): beam size for score
            path_beam_size (int): beam size for path

        Returns:
            List[List[int]]: nbest results
        r         ?        c                   S   s
   ddg fS )NrH   r   r   r   r   r   <lambda>   s   
 z1KwsCtcPrefixDecoder.beam_search.<locals>.<lambda>Ng?gư>)Zabs_tolprobframe)r;   rL   rK   c                 S   s   | d d | d d  S )Nr   r   r   )xr   r   r   rI      r6   T)keyreversec                 S   s6   g | ]}|d  |d d  |d d  |d d fqS )r   r      r   )r.   yr   r   r   r5      s   6 z3KwsCtcPrefixDecoder.beam_search.<locals>.<listcomp>)sizer   ranger   Ztopkziptolistr   r
   itemcopymathisclosedictsorteditems)r4   rA   rB   rC   rD   rE   maxlenZ	ctc_probsZcur_hypstZprobsZ	next_hypsZtop_k_probsZtop_k_indexZfilter_probsZfilter_indexrK   idxr   ZpsprefixZpbZpnbZ	cur_nodeslastZn_pbZn_pnbnodesZn_prefixhypsr   r   r   beam_searchq   s   









*zKwsCtcPrefixDecoder.beam_searchc                 C   s   t |t |k r
dS t |t |kr||krdS dS tt |t | D ]#}|| |d krGtt |D ]}|||  || krB q$q4|  S q$dS )NrJ   r   )r
   rS   )r4   Z	main_listZ
check_listr/   jr   r   r   
is_sublist   s   zKwsCtcPrefixDecoder.is_sublistc                 C   s   |  ||| j}d }d}|D ]P}|d }|d }t|t|ks"J | j D ]+}	| j|	 d }
| ||
}|dkrR|	}t||t|
 D ]
}||| d 9 }qE qSq'|d ur^t|} q_q|d urhd||fS dS )	NrG   r   rP   r+   rJ   rK   T)FNN)	rd   r1   r
   r8   keysrf   rS   rX   sqrt)r4   rA   rB   rc   Zhit_keywordZ	hit_scoreZone_hypZ
prefix_idsZprefix_nodesr   Zlaboffsetr_   r   r   r   _decode_inside   s.   

z"KwsCtcPrefixDecoder._decode_insiderM   c                 C   s>   | j |d d }t|dg}| 	||S )zGet an initial state for decoding.

        Args:
            x (torch.Tensor): The encoded feature tensor

        Returns: decode result

        r   r   N)
r&   ZsoftmaxZ	unsqueezedetachZsqueezecputorchZtensorrR   rj   )r4   rM   Zraw_logpxlenr   r   r   decode  s    
zKwsCtcPrefixDecoder.decode)Nr?   r@   )__name__
__module____qualname____doc__rm   nnModuler,   listrZ   r>   ZTensorsetintr   r   rd   rf   rj   ro   r   r   r   r   r%   N   sD    
$
k
!r%   )r   r   rm   rX   collectionsr   typingr   r   r   r   r   r$   r%   r   r   r   r   <module>   s    3