



import argparse
import json
from pathlib import Path

import torch
import torchaudio
from datasets import load_dataset
from huggingface_hub import hf_hub_download

from transformers import ASTConfig, ASTFeatureExtractor, ASTForAudioClassification
from transformers.utils import logging


logging.set_verbosity_info()
a_    :  Dict						  =		logging.get_logger(__name__)

def      __lowercase(						UpperCAmelCase__			):


      """simple docstring"""



      lowerCamelCase             =		ASTConfig()

      if "10-10" in model_name:
            pass
      elif "speech-commands" in model_name:
            lowerCamelCase             =		128
      elif "12-12" in model_name:
            lowerCamelCase             =		12
            lowerCamelCase             =		12
      elif "14-14" in model_name:
            lowerCamelCase             =		14
            lowerCamelCase             =		14
      elif "16-16" in model_name:
            lowerCamelCase             =		16
            lowerCamelCase             =		16
      else:
            raise ValueError("Model not supported"			)

      lowerCamelCase             =		"huggingface/label-files"
      if "speech-commands" in model_name:
            lowerCamelCase             =		35
            lowerCamelCase             =		"speech-commands-v2-id2label.json"
      else:
            lowerCamelCase             =		527
            lowerCamelCase             =		"audioset-id2label.json"

      lowerCamelCase             =		json.load(open(hf_hub_download(UpperCAmelCase__ , UpperCAmelCase__ , repo_type="dataset"			) , "r"			)			)
      lowerCamelCase             =		{int(UpperCAmelCase__			): v for k, v in idalabel.items()}
      lowerCamelCase             =		idalabel
      lowerCamelCase             =		{v: k for k, v in idalabel.items()}

      return config

def      __lowercase(						UpperCAmelCase__			):


      """simple docstring"""



      if "module.v" in name:
            lowerCamelCase             =		name.replace("module.v" , "audio_spectrogram_transformer"			)
      if "cls_token" in name:
            lowerCamelCase             =		name.replace("cls_token" , "embeddings.cls_token"			)
      if "dist_token" in name:
            lowerCamelCase             =		name.replace("dist_token" , "embeddings.distillation_token"			)
      if "pos_embed" in name:
            lowerCamelCase             =		name.replace("pos_embed" , "embeddings.position_embeddings"			)
      if "patch_embed.proj" in name:
            lowerCamelCase             =		name.replace("patch_embed.proj" , "embeddings.patch_embeddings.projection"			)
      # transformer blocks
      if "blocks" in name:
            lowerCamelCase             =		name.replace("blocks" , "encoder.layer"			)
      if "attn.proj" in name:
            lowerCamelCase             =		name.replace("attn.proj" , "attention.output.dense"			)
      if "attn" in name:
            lowerCamelCase             =		name.replace("attn" , "attention.self"			)
      if "norm1" in name:
            lowerCamelCase             =		name.replace("norm1" , "layernorm_before"			)
      if "norm2" in name:
            lowerCamelCase             =		name.replace("norm2" , "layernorm_after"			)
      if "mlp.fc1" in name:
            lowerCamelCase             =		name.replace("mlp.fc1" , "intermediate.dense"			)
      if "mlp.fc2" in name:
            lowerCamelCase             =		name.replace("mlp.fc2" , "output.dense"			)
      # final layernorm
      if "audio_spectrogram_transformer.norm" in name:
            lowerCamelCase             =		name.replace("audio_spectrogram_transformer.norm" , "audio_spectrogram_transformer.layernorm"			)
      # classifier head
      if "module.mlp_head.0" in name:
            lowerCamelCase             =		name.replace("module.mlp_head.0" , "classifier.layernorm"			)
      if "module.mlp_head.1" in name:
            lowerCamelCase             =		name.replace("module.mlp_head.1" , "classifier.dense"			)

      return name

def      __lowercase(						UpperCAmelCase__ , UpperCAmelCase__			):


      """simple docstring"""



      for key in orig_state_dict.copy().keys():
            lowerCamelCase             =		orig_state_dict.pop(UpperCAmelCase__			)

            if "qkv" in key:
                  lowerCamelCase             =		key.split("."			)
                  lowerCamelCase             =		int(key_split[3]			)
                  lowerCamelCase             =		config.hidden_size
                  if "weight" in key:
                        lowerCamelCase             =		val[:dim, :]
                        lowerCamelCase             =		val[dim : dim * 2, :]
                        lowerCamelCase             =		val[-dim:, :]
                  else:
                        lowerCamelCase             =		val[:dim]
                        lowerCamelCase             =		val[dim : dim * 2]
                        lowerCamelCase             =		val[-dim:]
            else:
                  lowerCamelCase             =		val

      return orig_state_dict

def      __lowercase(						UpperCAmelCase__			):


      """simple docstring"""



      lowerCamelCase             =		[
          "module.v.head.weight",
          "module.v.head.bias",
          "module.v.head_dist.weight",
          "module.v.head_dist.bias",
      ]
      for k in ignore_keys:
            state_dict.pop(UpperCAmelCase__ , UpperCAmelCase__			)

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


      """simple docstring"""



      lowerCamelCase             =		get_audio_spectrogram_transformer_config(UpperCAmelCase__			)

      lowerCamelCase             =		{
          "ast-finetuned-audioset-10-10-0.4593": (
              "https://www.dropbox.com/s/ca0b1v2nlxzyeb4/audioset_10_10_0.4593.pth?dl=1"
          ),
          "ast-finetuned-audioset-10-10-0.450": (
              "https://www.dropbox.com/s/1tv0hovue1bxupk/audioset_10_10_0.4495.pth?dl=1"
          ),
          "ast-finetuned-audioset-10-10-0.448": (
              "https://www.dropbox.com/s/6u5sikl4b9wo4u5/audioset_10_10_0.4483.pth?dl=1"
          ),
          "ast-finetuned-audioset-10-10-0.448-v2": (
              "https://www.dropbox.com/s/kt6i0v9fvfm1mbq/audioset_10_10_0.4475.pth?dl=1"
          ),
          "ast-finetuned-audioset-12-12-0.447": (
              "https://www.dropbox.com/s/snfhx3tizr4nuc8/audioset_12_12_0.4467.pth?dl=1"
          ),
          "ast-finetuned-audioset-14-14-0.443": (
              "https://www.dropbox.com/s/z18s6pemtnxm4k7/audioset_14_14_0.4431.pth?dl=1"
          ),
          "ast-finetuned-audioset-16-16-0.442": (
              "https://www.dropbox.com/s/mdsa4t1xmcimia6/audioset_16_16_0.4422.pth?dl=1"
          ),
          "ast-finetuned-speech-commands-v2": (
              "https://www.dropbox.com/s/q0tbqpwv44pquwy/speechcommands_10_10_0.9812.pth?dl=1"
          ),
      }

      # load original state_dict
      lowerCamelCase             =		model_name_to_url[model_name]
      lowerCamelCase             =		torch.hub.load_state_dict_from_url(UpperCAmelCase__ , map_location="cpu"			)
      # remove some keys
      remove_keys(UpperCAmelCase__			)
      # rename some keys
      lowerCamelCase             =		convert_state_dict(UpperCAmelCase__ , UpperCAmelCase__			)

      # load 🤗 model
      lowerCamelCase             =		ASTForAudioClassification(UpperCAmelCase__			)
      model.eval()

      model.load_state_dict(UpperCAmelCase__			)

      # verify outputs on dummy input
      # source: https://github.com/YuanGongND/ast/blob/79e873b8a54d0a3b330dd522584ff2b9926cd581/src/run.py#L62
      lowerCamelCase             =		-4.2_6_7_7_3_9_3 if "speech-commands" not in model_name else -6.8_4_5_9_7_8
      lowerCamelCase             =		4.5_6_8_9_9_7_4 if "speech-commands" not in model_name else 5.5_6_5_4_5_2_6
      lowerCamelCase             =		1024 if "speech-commands" not in model_name else 128
      lowerCamelCase             =		ASTFeatureExtractor(mean=UpperCAmelCase__ , std=UpperCAmelCase__ , max_length=UpperCAmelCase__			)

      if "speech-commands" in model_name:
            lowerCamelCase             =		load_dataset("speech_commands" , "v0.02" , split="validation"			)
            lowerCamelCase             =		dataset[0]["audio"]["array"]
      else:
            lowerCamelCase             =		hf_hub_download(
                repo_id="nielsr/audio-spectogram-transformer-checkpoint" , filename="sample_audio.flac" , repo_type="dataset" , )

            lowerCamelCase      ,				lowerCamelCase             =		torchaudio.load(UpperCAmelCase__			)
            lowerCamelCase             =		waveform.squeeze().numpy()

      lowerCamelCase             =		feature_extractor(UpperCAmelCase__ , sampling_rate=16000 , return_tensors="pt"			)

      # forward pass
      lowerCamelCase             =		model(**UpperCAmelCase__			)
      lowerCamelCase             =		outputs.logits

      if model_name == "ast-finetuned-audioset-10-10-0.4593":
            lowerCamelCase             =		torch.tensor([-0.8_7_6_0, -7.0_0_4_2, -8.6_6_0_2]			)
      elif model_name == "ast-finetuned-audioset-10-10-0.450":
            lowerCamelCase             =		torch.tensor([-1.1_9_8_6, -7.0_9_0_3, -8.2_7_1_8]			)
      elif model_name == "ast-finetuned-audioset-10-10-0.448":
            lowerCamelCase             =		torch.tensor([-2.6_1_2_8, -8.0_0_8_0, -9.4_3_4_4]			)
      elif model_name == "ast-finetuned-audioset-10-10-0.448-v2":
            lowerCamelCase             =		torch.tensor([-1.5_0_8_0, -7.4_5_3_4, -8.8_9_1_7]			)
      elif model_name == "ast-finetuned-audioset-12-12-0.447":
            lowerCamelCase             =		torch.tensor([-0.5_0_5_0, -6.5_8_3_3, -8.0_8_4_3]			)
      elif model_name == "ast-finetuned-audioset-14-14-0.443":
            lowerCamelCase             =		torch.tensor([-0.3_8_2_6, -7.0_3_3_6, -8.2_4_1_3]			)
      elif model_name == "ast-finetuned-audioset-16-16-0.442":
            lowerCamelCase             =		torch.tensor([-1.2_1_1_3, -6.9_1_0_1, -8.3_4_7_0]			)
      elif model_name == "ast-finetuned-speech-commands-v2":
            lowerCamelCase             =		torch.tensor([6.1_5_8_9, -8.0_5_6_6, -8.7_9_8_4]			)
      else:
            raise ValueError("Unknown model name"			)
      if not torch.allclose(logits[0, :3] , UpperCAmelCase__ , atol=1E-4			):
            raise ValueError("Logits don't match"			)
      print("Looks ok!"			)

      if pytorch_dump_folder_path is not None:
            Path(UpperCAmelCase__			).mkdir(exist_ok=UpperCAmelCase__			)
            print(F"""Saving model {model_name} to {pytorch_dump_folder_path}"""			)
            model.save_pretrained(UpperCAmelCase__			)
            print(F"""Saving feature extractor to {pytorch_dump_folder_path}"""			)
            feature_extractor.save_pretrained(UpperCAmelCase__			)

      if push_to_hub:
            print("Pushing model and feature extractor to the hub..."			)
            model.push_to_hub(F"""MIT/{model_name}"""			)
            feature_extractor.push_to_hub(F"""MIT/{model_name}"""			)


if __name__ == "__main__":
     a_    :  List[str]						  =		argparse.ArgumentParser()
     # Required parameters
     parser.add_argument(
         '--model_name',
         default='ast-finetuned-audioset-10-10-0.4593',
         type=str,
         help='Name of the Audio Spectrogram Transformer model you\'d like to convert.',
     )
     parser.add_argument(
         '--pytorch_dump_folder_path', default=None, type=str, help='Path to the output PyTorch model directory.'
     )
     parser.add_argument(
         '--push_to_hub', action='store_true', help='Whether or not to push the converted model to the 🤗 hub.'
     )

     a_    :  str						  =		parser.parse_args()
     convert_audio_spectrogram_transformer_checkpoint(args.model_name, args.pytorch_dump_folder_path, args.push_to_hub)




import socket

def      __lowercase(						):


      """simple docstring"""



      lowerCamelCase             =		socket.socket(socket.AF_INET , socket.SOCK_STREAM			)
      lowerCamelCase             =		socket.gethostname()
      lowerCamelCase             =		12312

      sock.connect((host, port)			)
      sock.send(B"Hello server!"			)

      with open("Received_file" , "wb"			) as out_file:
            print("File opened"			)
            print("Receiving data..."			)
            while True:
                  lowerCamelCase             =		sock.recv(1024			)
                  if not data:
                        break
                  out_file.write(UpperCAmelCase__			)

      print("Successfully received the file"			)
      sock.close()
      print("Connection closed"			)


if __name__ == "__main__":
     main()