o
    *j                     @   s   d dl Z d dlZd dlmZm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mZ d dlmZ d dlmZ ejejejd	G d
d deZdS )    N)AnyDict)File)	Pipelines)
OutputKeys)InputPipeline)	PIPELINES)Tasks)module_namec                       s   e Zd ZdZdZdZdZdZ fddZdd Z	d	e
d
eeef fddZd	eeef d
eeef fddZ	ddejdejfddZd	eeef d
eeef fddZ  ZS )KWSFarfieldPipelinezA Keyword Spotting Inference Pipeline .

    When invoke the class with pipeline.__call__(), it accept only one parameter:
        inputs(str): the path of wav file
    i>        c                    sj   t  jdd|i| | j| j| _| j  | j| j }| jj| | _	d|v r0|d | _
dS i | _
dS )z
        use `model` to create a kws far field pipeline for prediction
        Args:
            model: model id on modelscope hub.
        modelZkeyword_mapN )super__init__r   toZdeviceevalINPUT_CHANNELSSAMPLE_WIDTHZsize_in_nframe_keyword_map)selfr   kwargs
frame_size	__class__r   q/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/pipelines/audio/kws_farfield_pipeline.pyr       s   

zKWSFarfieldPipeline.__init__c                 K   s
   |||fS Nr   )r   Zpipeline_parametersr   r   r   _sanitize_parameters0   s   
z(KWSFarfieldPipeline._sanitize_parametersinputsreturnc                 K   sH   t |tr
t|dS t |trt|dS t |tr|S tdt| )N)
input_filezNot supported input type: )
isinstancebytesdictstrr   
ValueErrortype)r   r!   Zpreprocess_paramsr   r   r   
preprocess3   s   




zKWSFarfieldPipeline.preprocessc                 K   s   |d }t |trt|}tjt|dd\}}t|jdkr-t	
||t	|fd}g }d|v ret|d d!}|| j || j || j | ||| W d    n1 s_w   Y  n| || tj|iS )Nr#   Zint16)Zdtype   output_filewb)r$   r'   r   readsfioBytesIOlenshapenumpystackZ
zeros_likewaveopenZsetframerateSAMPLE_RATEZsetnchannelsOUTPUT_CHANNELSZsetsampwidthr   _processr   ZKWS_LIST)r   r!   Zforward_paramsr#   framesZ
sampleratekws_listfoutr   r   r   forward=   s"   


zKWSFarfieldPipeline.forwardNr;   r=   c           	      C   s   t d|jd | jD ]`}|| j }||jd kr|jd }|||d d f  }| j|}|r8||d  d|v rj|d d  || j 7  < d|d d< |d d }|| jv rc| j| |d d< |	|d  q
d S )Nr   Zpcmkwsoffsetwakeupr)   keyword)
ranger3   r   tobytesr   Zforward_decodeZwriteframesr8   r   append)	r   r;   r<   r=   start_indexZ	end_indexdataresultrB   r   r   r   r:   Q   s"   


zKWSFarfieldPipeline._processc                 K   s   |S r   r   )r   r!   r   r   r   r   postprocesse   s   zKWSFarfieldPipeline.postprocessr   )__name__
__module____qualname____doc__r8   r   r   r9   r   r    r   r   r'   r   r*   r>   r4   Zndarrayr6   Z
Wave_writer:   rI   __classcell__r   r   r   r   r      s&    



*r   )r0   r6   typingr   r   r4   Z	soundfiler/   Zmodelscope.fileior   Zmodelscope.metainfor   Zmodelscope.outputsr   Zmodelscope.pipelines.baser   r   Zmodelscope.pipelines.builderr	   Zmodelscope.utils.constantr
   Zregister_moduleZkeyword_spottingZspeech_dfsmn_kws_char_farfieldr   r   r   r   r   <module>   s    