



import argparse

import fairseq
import torch

from transformers import UniSpeechSatConfig, UniSpeechSatForCTC, UniSpeechSatForPreTraining, logging


logging.set_verbosity_info()
a_						:     Optional[int]	     = logging.get_logger(__name__)

a_						:     Optional[int]	     = {
    'post_extract_proj': 'feature_projection.projection',
    'encoder.pos_conv.0': 'encoder.pos_conv_embed.conv',
    'self_attn.k_proj': 'encoder.layers.*.attention.k_proj',
    'self_attn.v_proj': 'encoder.layers.*.attention.v_proj',
    'self_attn.q_proj': 'encoder.layers.*.attention.q_proj',
    'self_attn.out_proj': 'encoder.layers.*.attention.out_proj',
    'self_attn_layer_norm': 'encoder.layers.*.layer_norm',
    'fc1': 'encoder.layers.*.feed_forward.intermediate_dense',
    'fc2': 'encoder.layers.*.feed_forward.output_dense',
    'final_layer_norm': 'encoder.layers.*.final_layer_norm',
    'encoder.layer_norm': 'encoder.layer_norm',
    'encoder.layer_norm_for_extract': 'layer_norm_for_extract',
    'w2v_model.layer_norm': 'feature_projection.layer_norm',
    'quantizer.weight_proj': 'quantizer.weight_proj',
    'quantizer.vars': 'quantizer.codevectors',
    'project_q': 'project_q',
    'final_proj': 'project_hid',
    'w2v_encoder.proj': 'lm_head',
    'label_embs_concat': 'label_embeddings_concat',
    'mask_emb': 'masked_spec_embed',
    'spk_proj': 'speaker_proj',
}
a_						:     Optional[int]	     = [
    'lm_head',
    'quantizer.weight_proj',
    'quantizer.codevectors',
    'project_q',
    'project_hid',
    'label_embeddings_concat',
    'speaker_proj',
    'layer_norm_for_extract',
]

def     __lowercase(	UpperCAmelCase__   ,   UpperCAmelCase__   ,   UpperCAmelCase__   ,   UpperCAmelCase__   ,   UpperCAmelCase__ ):


      """simple docstring"""



      for attribute in key.split("." ):
            lowerCamelCase								=		getattr(UpperCAmelCase__   ,   UpperCAmelCase__ )

      if weight_type is not None:
            lowerCamelCase								=		getattr(UpperCAmelCase__   ,   UpperCAmelCase__ ).shape
      else:
            lowerCamelCase								=		hf_pointer.shape

      if hf_shape != value.shape:
            raise ValueError(
                F"""Shape of hf {key + "." + weight_type if weight_type is not None else ""} is {hf_shape}, but should be"""
                F""" {value.shape} for {full_name}""" )

      if weight_type == "weight":
            lowerCamelCase								=		value
      elif weight_type == "weight_g":
            lowerCamelCase								=		value
      elif weight_type == "weight_v":
            lowerCamelCase								=		value
      elif weight_type == "bias":
            lowerCamelCase								=		value
      else:
            lowerCamelCase								=		value

      logger.info(F"""{key + "." + weight_type if weight_type is not None else ""} was initialized from {full_name}.""" )

def     __lowercase(	UpperCAmelCase__   ,   UpperCAmelCase__ ):


      """simple docstring"""



      lowerCamelCase								=		[]
      lowerCamelCase								=		fairseq_model.state_dict()

      lowerCamelCase								=		hf_model.unispeech_sat.feature_extractor

      for name, value in fairseq_dict.items():
            lowerCamelCase								=		False
            if "conv_layers" in name:
                  load_conv_layer(
                      UpperCAmelCase__   ,   UpperCAmelCase__   ,   UpperCAmelCase__   ,   UpperCAmelCase__   ,   hf_model.config.feat_extract_norm == "group"   ,   )
                  lowerCamelCase								=		True
            else:
                  for key, mapped_key in MAPPING.items():
                        lowerCamelCase								=		"unispeech_sat." + mapped_key if mapped_key not in TOP_LEVEL_KEYS else mapped_key
                        if key in name or key.split("w2v_model." )[-1] == name.split("." )[0]:
                              if "layer_norm_for_extract" in name and (".".join(name.split("." )[:-1] ) != key):
                                    # special case since naming is very similar
                                    continue
                              lowerCamelCase								=		True
                              if "*" in mapped_key:
                                    lowerCamelCase								=		name.split(UpperCAmelCase__ )[0].split("." )[-2]
                                    lowerCamelCase								=		mapped_key.replace("*"   ,   UpperCAmelCase__ )
                              if "weight_g" in name:
                                    lowerCamelCase								=		"weight_g"
                              elif "weight_v" in name:
                                    lowerCamelCase								=		"weight_v"
                              elif "bias" in name:
                                    lowerCamelCase								=		"bias"
                              elif "weight" in name:
                                    # TODO: don't match quantizer.weight_proj
                                    lowerCamelCase								=		"weight"
                              else:
                                    lowerCamelCase								=		None
                              set_recursively(UpperCAmelCase__   ,   UpperCAmelCase__   ,   UpperCAmelCase__   ,   UpperCAmelCase__   ,   UpperCAmelCase__ )
                        continue
            if not is_used:
                  unused_weights.append(UpperCAmelCase__ )

      logger.warning(F"""Unused weights: {unused_weights}""" )

def     __lowercase(	UpperCAmelCase__   ,   UpperCAmelCase__   ,   UpperCAmelCase__   ,   UpperCAmelCase__   ,   UpperCAmelCase__ ):


      """simple docstring"""



      lowerCamelCase								=		full_name.split("conv_layers." )[-1]
      lowerCamelCase								=		name.split("." )
      lowerCamelCase								=		int(items[0] )
      lowerCamelCase								=		int(items[1] )

      if type_id == 0:
            if "bias" in name:
                  if value.shape != feature_extractor.conv_layers[layer_id].conv.bias.data.shape:
                        raise ValueError(
                            F"""{full_name} has size {value.shape}, but"""
                            F""" {feature_extractor.conv_layers[layer_id].conv.bias.data.shape} was found.""" )
                  lowerCamelCase								=		value
                  logger.info(F"""Feat extract conv layer {layer_id} was initialized from {full_name}.""" )
            elif "weight" in name:
                  if value.shape != feature_extractor.conv_layers[layer_id].conv.weight.data.shape:
                        raise ValueError(
                            F"""{full_name} has size {value.shape}, but"""
                            F""" {feature_extractor.conv_layers[layer_id].conv.weight.data.shape} was found.""" )
                  lowerCamelCase								=		value
                  logger.info(F"""Feat extract conv layer {layer_id} was initialized from {full_name}.""" )
      elif (type_id == 2 and not use_group_norm) or (type_id == 2 and layer_id == 0 and use_group_norm):
            if "bias" in name:
                  if value.shape != feature_extractor.conv_layers[layer_id].layer_norm.bias.data.shape:
                        raise ValueError(
                            F"""{full_name} has size {value.shape}, but"""
                            F""" {feature_extractor[layer_id].layer_norm.bias.data.shape} was found.""" )
                  lowerCamelCase								=		value
                  logger.info(F"""Feat extract layer norm weight of layer {layer_id} was initialized from {full_name}.""" )
            elif "weight" in name:
                  if value.shape != feature_extractor.conv_layers[layer_id].layer_norm.weight.data.shape:
                        raise ValueError(
                            F"""{full_name} has size {value.shape}, but"""
                            F""" {feature_extractor[layer_id].layer_norm.weight.data.shape} was found.""" )
                  lowerCamelCase								=		value
                  logger.info(F"""Feat extract layer norm weight of layer {layer_id} was initialized from {full_name}.""" )
      else:
            unused_weights.append(UpperCAmelCase__ )

@torch.no_grad()
def     __lowercase(	UpperCAmelCase__   ,   UpperCAmelCase__   ,   UpperCAmelCase__=None   ,   UpperCAmelCase__=None   ,   UpperCAmelCase__=True ):


      """simple docstring"""



      if config_path is not None:
            lowerCamelCase								=		UniSpeechSatConfig.from_pretrained(UpperCAmelCase__ )
      else:
            lowerCamelCase								=		UniSpeechSatConfig()

      lowerCamelCase								=		""

      if is_finetuned:
            lowerCamelCase								=		UniSpeechSatForCTC(UpperCAmelCase__ )
      else:
            lowerCamelCase								=		UniSpeechSatForPreTraining(UpperCAmelCase__ )

      lowerCamelCase			,							lowerCamelCase			,							lowerCamelCase								=		fairseq.checkpoint_utils.load_model_ensemble_and_task(
          [checkpoint_path]   ,   arg_overrides={"data": "/".join(dict_path.split("/" )[:-1] )} )
      lowerCamelCase								=		model[0].eval()

      recursively_load_weights(UpperCAmelCase__   ,   UpperCAmelCase__ )

      hf_wavavec.save_pretrained(UpperCAmelCase__ )


if __name__ == "__main__":
     a_						:     Optional[int]	     = argparse.ArgumentParser()
     parser.add_argument('--pytorch_dump_folder_path', default=None, type=str, help='Path to the output PyTorch model.')
     parser.add_argument('--checkpoint_path', default=None, type=str, help='Path to fairseq checkpoint')
     parser.add_argument('--dict_path', default=None, type=str, help='Path to dict of fine-tuned model')
     parser.add_argument('--config_path', default=None, type=str, help='Path to hf config.json of model to convert')
     parser.add_argument(
         '--not_finetuned', action='store_true', help='Whether the model to convert is a fine-tuned model or not'
     )
     a_						:     str	     = parser.parse_args()
     convert_unispeech_sat_checkpoint(
         args.checkpoint_path, args.pytorch_dump_folder_path, args.config_path, args.dict_path, not args.not_finetuned
     )




# Copyright 2023 The HuggingFace Team. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from typing import TYPE_CHECKING

from ...utils import OptionalDependencyNotAvailable, _LazyModule, is_torch_available


a_						:     Tuple	     =		{
    'configuration_xmod': [
        'XMOD_PRETRAINED_CONFIG_ARCHIVE_MAP',
        'XmodConfig',
        'XmodOnnxConfig',
    ],
}

try:
     if not is_torch_available():
          raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
     pass
else:
     a_						:     List[Any]	     =		[
         'XMOD_PRETRAINED_MODEL_ARCHIVE_LIST',
         'XmodForCausalLM',
         'XmodForMaskedLM',
         'XmodForMultipleChoice',
         'XmodForQuestionAnswering',
         'XmodForSequenceClassification',
         'XmodForTokenClassification',
         'XmodModel',
         'XmodPreTrainedModel',
     ]

if TYPE_CHECKING:
     from .configuration_xmod import XMOD_PRETRAINED_CONFIG_ARCHIVE_MAP, XmodConfig, XmodOnnxConfig

     try:
          if not is_torch_available():
               raise OptionalDependencyNotAvailable()
     except OptionalDependencyNotAvailable:
          pass
     else:
          from .modeling_xmod import (
              XMOD_PRETRAINED_MODEL_ARCHIVE_LIST,
              XmodForCausalLM,
              XmodForMaskedLM,
              XmodForMultipleChoice,
              XmodForQuestionAnswering,
              XmodForSequenceClassification,
              XmodForTokenClassification,
              XmodModel,
              XmodPreTrainedModel,
          )

else:
     import sys

     a_						:     str	     =		_LazyModule(__name__, globals()['__file__'], _import_structure, module_spec=__spec__)