o
    ̳i                     @   s   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 d dlm  mZ G d	d
 d
eZdS )    N)PreTrainedModel   )BigCodecConfig)CodecEncoder_Transformer)CodecDecoderVocos)SemanticEncoder)AutoFeatureExtractorWav2Vec2BertModelc                       sJ   e Zd ZeZdef fddZdddZdddZd	d
 Zdd Z	  Z
S )XCodec2Modelconfigc                    sz   t  | tjddd| _| j  t|j|j|j| _t	 | _
t | _tdd| _tdd| _td}|| _d S )Nzfacebook/w2v-bert-2.0T)output_hidden_statesi   i   )super__init__r	   from_pretrainedsemantic_modelevalr   semantic_hidden_sizeSemanticEncoder_moduler   CodecEncr   	generatornnLinearfc_prior	fc_post_ar   feature_extractor)selfr   r   	__class__ L/home/ubuntu/.local/lib/python3.10/site-packages/xcodec2/modeling_xcodec2.pyr      s"   


zXCodec2Model.__init__>  c                 C   sH  |}d|j d d  }tjj|d|f}| jt|dddf  d|ddj	| j
}| |}|jd }|dd	}| |}|	| j
}| |d}	|	dd	}	tj||	gdd
}
| |
dd	dd	}
| j|
dd\}}}| jj|dd	}|dd	}| |dd	dd	}| j|dd	ddd }|S )ue  
        这里的 forward 不一定要叫 forward，也可以拆成别的方法；
        但是如果想兼容 pipeline，需要在 forward 里给出核心逻辑。
        
        参数：
          input_waveform: [batch_size, waveform_length]
          sample_rate: 默认 16000
        返回：
          重构后的语音音频 (Tensor)
        @  r   r   N   r#   ptsampling_ratereturn_tensors      dimTvqF)shapetorchr   
functionalpadr   Fcpuinput_featurestodevicer   hidden_states	transposer   r   	unsqueezecatr   r   	quantizerget_output_from_indicesr   )r   input_waveformsample_ratewavpad_for_wavr4   semantic_outputsemantic_hidden_16semantic_encodedvq_emb
concat_emb_vq_codevq_post_embrecon_audior   r   r   forward+   s2   



zXCodec2Model.forwardc                 C   s  t   |}d|jd d  }t jj|d|f}| jt|dddf  d|ddj	
| j}| |}|jd }|dd	}| |}|
| j}| |d}	|	dd	}	t j||	gdd
}
| |
dd	dd	}
| j|
dd\}}}|W  d   S 1 sw   Y  dS )u   
        将输入的音频编码为代码表示。

        参数：
          input_waveform: [batch_size, waveform_length]
          sample_rate: 默认 16000
        返回：
          编码后的代码 (Tensor)
        r!   r   r   Nr"   r$   r%   r(   r)   r*   Tr,   )r/   no_gradr.   r   r0   r1   r   r2   r3   r4   r5   r6   r   r7   r8   r   r   r9   r:   r   r   )r   r=   r>   r?   r@   r4   rA   rB   rC   rD   rE   rF   rG   r   r   r   encode_codec   s.   





$zXCodec2Model.encode_codec                 C   s   t  5 | jj|dd}|dd}| |dddd}| j|ddddd }|W  d   S 1 s<w   Y  dS )u   
        将编码后的代码解码回音频。

        参数：
          vq_code: 编码后的代码 (Tensor) [batch, frames]
        返回：
          解码后的音频 (Tensor) [batch, waveform_length]
        r   r)   Fr,   r   N)r/   rK   r   r;   r<   r8   r   )r   rG   rH   rI   r   r   r   decode_code   s   
	$zXCodec2Model.decode_codec              	   C   s   t  X | |dddddddf }|jd }|dd}| |}|}| |}|dd}t j||gdd}| |dddd}| j	|dd\}	}
}	|
W  d   S 1 s_w   Y  dS )	u   
        将输入的音频编码为代码表示。

        参数：
          input_waveform: [batch_size,1, waveform_length]
          input_features:  
        返回：
          编码后的代码 (Tensor)
        Nr   r(   r   r)   r*   Tr,   )
r/   rK   r   r7   r8   r   r   r:   r   r   )r   r=   r4   rA   rB   rC   r?   rD   rE   rF   rG   r   r   r   encode_batch_feats   s   

"


$zXCodec2Model.encode_batch_feats)r    )__name__
__module____qualname__r   config_classr   rJ   rL   rM   rN   __classcell__r   r   r   r   r
      s    

83r
   )r/   torch.nnr   transformersr   configuration_bigcodecr   vq.codec_encoderr   vq.codec_decoder_vocosr   	vq.moduler   r   r	   torch.nn.functionalr0   r2   r
   r   r   r   r   <module>   s    