o
    i                     @   s   d 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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 ddlmZ ddlmZ dd ZdS )zRV2 backend for `asr_recog.py` using py:class:`espnet.nets.beam_search.BeamSearch`.    N)parse)add_results_to_jsonget_model_conf
torch_load)load_trained_model)ASRInterface)BatchBeamSearch)
BeamSearch)dynamic_import_lm)BatchScorerInterface)LengthBonus)set_deterministic_pytorch)LoadInputsAndTargetsc              
   C   s  t d | jdkrtd| jdurtd| jrtdt|  t| j\}}t	|t
s0J | jdur@tdd | jD }ntjjh}| jrt d	 ttjtd
k red|jv retjj|v retd| jdkrwttjtdk rwtdtt| j}tjj|||d}|  tddd| jdu r|jn| jddid}| jrt| j| j }t|dd}t!||j"}|t#|j$|}	t%| j|	 | j&rt d tt| j}tjj|	||d}	|	  nd}	| j'rddl(m)}
m*} | j+dkr|
| j'|j$}n
|| j'|j$}nd}|, }|	|d< ||d< t-t#|j$|d< t.d| j/ | j/| j0| j1| j2d}t3| j4t#|j$|||j5|j6|j$| j/dkr?dndd }| jdkrld!d |j78 D }t#|dkrct9|_:t d" n	t d#| d$ | j;dkrvtd%| j;dkrd&}nd'}tt| j<}t d(| d)|  |j=||d*  |j=||d*  t>| j?d+}t@A|d, }W d   n	1 sw   Y  i }tB c tC|D dD ]S\}}t d-| |t#|D  ||| fg}||d d }|EtF|j=||d*}||| jG| jHd.}d/d |dtIt#|| jJ D }tK|| ||j$||< qW d   n	1 s/w   Y  t>| jLd0}|Mt@jNd,|id1dd2d3Ed4 W d   dS 1 sXw   Y  dS )5a0  Decode with custom models that implements ScorerInterface.

    Notes:
        The previous backend espnet.asr.pytorch_backend.asr.recog
        only supports E2E and RNNLM

    Args:
        args (namespace): The program arguments.
        See py:func:`espnet.bin.asr_recog.get_parser` for details

    z7experimental API for custom LMs is selected by --api v2   z+multi-utt batch decoding is not implementedNz!streaming mode is not implementedzword LM is not implementedc                 S   s   g | ]}t tj|qS  )getattrtorchnn).0qr   r   T/home/ubuntu/.local/lib/python3.10/site-packages/espnet/asr/pytorch_backend/recog.py
<listcomp>.   s    zrecog_v2.<locals>.<listcomp>z$Use quantized asr model for decodingz1.4.0lstmz;Quantized LSTM in ESPnet is only supported with torch 1.4+.float16z1.5.0zufloat16 dtype for dynamic quantization is not supported with torch version < 1.5.0. Switching to qint8 dtype instead.)dtypeasrFtrain)modeload_outputsort_in_input_lengthpreprocess_confpreprocess_argsmodel_moduledefaultzUse quantized lm modelr   )NgramFullScorerNgramPartScorerfulllmngramlength_bonusg      ?)decoderctcr'   r(   r)   )	beam_size
vocab_sizeweightsscorerssoseos
token_listpre_beam_score_keyc                 S   s   g | ]\}}t |ts|qS r   )
isinstancer   )r   kvr   r   r   r      s    z+BatchBeamSearch implementation is selected.zAs non-batch scorers z2 are found, fall back to non-batch implementation.z%only single GPU decoding is supportedcudacpuzDecoding device=z, dtype=)devicer   rbuttsz(%d/%d) decoding )xmaxlenratiominlenratioc                 S   s   g | ]}|  qS r   )asdict)r   hr   r   r   r      s    wb   T)indentensure_ascii	sort_keysutf_8)Ologgingwarning	batchsizeNotImplementedErrorstreaming_mode
word_rnnlmr   r   modelr4   r   quantize_configsetr   r   Linearquantize_asr_modelinfoV__version__etypeLSTM
ValueErrorquantize_dtyper   quantizationquantize_dynamicevalr   r    rnnlmr   
rnnlm_confr
   backendlen	char_listr   quantize_lm_modelngram_modelespnet.nets.scorers.ngramr$   r%   ngram_scorerr/   r   dict
ctc_weight	lm_weightngram_weightpenaltyr	   r,   r0   r1   full_scorersitemsr   	__class__ngpur   toopen
recog_jsonjsonloadno_grad	enumeratekeysencode	as_tensorr=   r>   minnbestr   result_labelwritedumps)argsrM   
train_argsq_configr   load_inputs_and_targetslm_argslm_model_modulelm_classr'   r$   r%   r(   r/   r.   beam_search	non_batchr9   fjsnew_jsidxnamebatchfeatenc
nbest_hypsr   r   r   recog_v2   s   














$r   )__doc__rq   rG   r   packaging.versionr   rS   espnet.asr.asr_utilsr   r   r   espnet.asr.pytorch_backend.asrr   espnet.nets.asr_interfacer   espnet.nets.batch_beam_searchr   espnet.nets.beam_searchr	   espnet.nets.lm_interfacer
   espnet.nets.scorer_interfacer    espnet.nets.scorers.length_bonusr    espnet.utils.deterministic_utilsr   espnet.utils.io_utilsr   r   r   r   r   r   <module>   s     