o
    ॵi                     @   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.
        modelkeyword_mapN )super__init__r   todeviceevalINPUT_CHANNELSSAMPLE_WIDTHsize_in_nframe_keyword_map)selfr   kwargs
frame_size	__class__r   d/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/pipelines/audio/kws_farfield_pipeline.pyr       s   

zKWSFarfieldPipeline.__init__c                 K   s
   |||fS Nr   )r   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%   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'   int16)dtype   output_filewb)r(   r+   r   readsfioBytesIOlenshapenumpystack
zeros_likewaveopensetframerateSAMPLE_RATEsetnchannelsOUTPUT_CHANNELSsetsampwidthr   _processr   KWS_LIST)r   r%   forward_paramsr'   frames
sampleratekws_listfoutr   r   r!   forward=   s"   


zKWSFarfieldPipeline.forwardNrH   rK   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   pcmkwsoffsetwakeupr-   keyword)
ranger:   r   tobytesr   forward_decodewriteframesrA   r   append)	r   rH   rJ   rK   start_index	end_indexdataresultrQ   r   r   r!   rE   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__rA   r   r   rC   r   r$   r   r   r+   r   r/   rL   r;   ndarrayr>   
Wave_writerE   r[   __classcell__r   r   r   r!   r      s&    



*r   )r7   r>   typingr   r   r;   	soundfiler6   modelscope.fileior   modelscope.metainfor   modelscope.outputsr   modelscope.pipelines.baser   r   modelscope.pipelines.builderr	   modelscope.utils.constantr
   register_modulekeyword_spottingspeech_dfsmn_kws_char_farfieldr   r   r   r   r!   <module>   s    