



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()
_snake_case	=						logging.get_logger(__name__)






def        A       (      _lowerCamelCase						):





							'''simple docstring'''




							_lowerCAmelCase  :							List[str]				     =					ASTConfig()

							if "10-10" in model_name:
														pass
							elif "speech-commands" in model_name:
														_lowerCAmelCase  :							str				     =					128
							elif "12-12" in model_name:
														_lowerCAmelCase  :							str				     =					12
														_lowerCAmelCase  :							int				     =					12
							elif "14-14" in model_name:
														_lowerCAmelCase  :							str				     =					14
														_lowerCAmelCase  :							Optional[Any]				     =					14
							elif "16-16" in model_name:
														_lowerCAmelCase  :							Dict				     =					16
														_lowerCAmelCase  :							int				     =					16
							else:
														raise ValueError("Model not supported"						)

							_lowerCAmelCase  :							Dict				     =					"huggingface/label-files"
							if "speech-commands" in model_name:
														_lowerCAmelCase  :							str				     =					35
														_lowerCAmelCase  :							str				     =					"speech-commands-v2-id2label.json"
							else:
														_lowerCAmelCase  :							Dict				     =					527
														_lowerCAmelCase  :							List[Any]				     =					"audioset-id2label.json"

							_lowerCAmelCase  :							List[Any]				     =					json.load(open(hf_hub_download(_lowerCamelCase       ,				_lowerCamelCase       ,				repo_type="dataset"						)       ,				"r"						)						)
							_lowerCAmelCase  :							Tuple				     =					{int(_lowerCamelCase						): v for k, v in idalabel.items()}
							_lowerCAmelCase  :							Union[str, Any]				     =					idalabel
							_lowerCAmelCase  :							Optional[Any]				     =					{v: k for k, v in idalabel.items()}

							return config






def        A       (      _lowerCamelCase						):





							'''simple docstring'''




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

							return name






def        A       (      _lowerCamelCase       ,				_lowerCamelCase						):





							'''simple docstring'''




							for key in orig_state_dict.copy().keys():
														_lowerCAmelCase  :							Tuple				     =					orig_state_dict.pop(_lowerCamelCase						)

														if "qkv" in key:
																					_lowerCAmelCase  :							Optional[Any]				     =					key.split("."						)
																					_lowerCAmelCase  :							List[Any]				     =					int(key_split[3]						)
																					_lowerCAmelCase  :							Any				     =					config.hidden_size
																					if "weight" in key:
																												_lowerCAmelCase  :							Any				     =					val[:dim, :]
																												_lowerCAmelCase  :							Tuple				     =					val[dim : dim * 2, :]
																												_lowerCAmelCase  :							Tuple				     =					val[-dim:, :]
																					else:
																												_lowerCAmelCase  :							Optional[Any]				     =					val[:dim]
																												_lowerCAmelCase  :							Dict				     =					val[dim : dim * 2]
																												_lowerCAmelCase  :							str				     =					val[-dim:]
														else:
																					_lowerCAmelCase  :							int				     =					val

							return orig_state_dict






def        A       (      _lowerCamelCase						):





							'''simple docstring'''




							_lowerCAmelCase  :							List[str]				     =					[
							    "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(_lowerCamelCase       ,				_lowerCamelCase						)






@torch.no_grad()
def        A       (      _lowerCamelCase       ,				_lowerCamelCase       ,				_lowerCamelCase=False						):





							'''simple docstring'''




							_lowerCAmelCase  :							Union[str, Any]				     =					get_audio_spectrogram_transformer_config(_lowerCamelCase						)

							_lowerCAmelCase  :							List[str]				     =					{
							    "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  :							Optional[Any]				     =					model_name_to_url[model_name]
							_lowerCAmelCase  :							Optional[Any]				     =					torch.hub.load_state_dict_from_url(_lowerCamelCase       ,				map_location="cpu"						)
							# remove some keys
							remove_keys(_lowerCamelCase						)
							# rename some keys
							_lowerCAmelCase  :							Tuple				     =					convert_state_dict(_lowerCamelCase       ,				_lowerCamelCase						)

							# load 🤗 model
							_lowerCAmelCase  :							str				     =					ASTForAudioClassification(_lowerCamelCase						)
							model.eval()

							model.load_state_dict(_lowerCamelCase						)

							# verify outputs on dummy input
							# source: https://github.com/YuanGongND/ast/blob/79e873b8a54d0a3b330dd522584ff2b9926cd581/src/run.py#L62
							_lowerCAmelCase  :							Any				     =					-4.2_67_73_93 if "speech-commands" not in model_name else -6.84_59_78
							_lowerCAmelCase  :							str				     =					4.5_68_99_74 if "speech-commands" not in model_name else 5.5_65_45_26
							_lowerCAmelCase  :							List[Any]				     =					1_024 if "speech-commands" not in model_name else 128
							_lowerCAmelCase  :							int				     =					ASTFeatureExtractor(mean=_lowerCamelCase       ,				std=_lowerCamelCase       ,				max_length=_lowerCamelCase						)

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

														_lowerCAmelCase     ,					_lowerCAmelCase  :							Optional[int]				     =					torchaudio.load(_lowerCamelCase						)
														_lowerCAmelCase  :							List[str]				     =					waveform.squeeze().numpy()

							_lowerCAmelCase  :							Union[str, Any]				     =					feature_extractor(_lowerCamelCase       ,				sampling_rate=16_000       ,				return_tensors="pt"						)

							# forward pass
							_lowerCAmelCase  :							Any				     =					model(**_lowerCamelCase						)
							_lowerCAmelCase  :							List[Any]				     =					outputs.logits

							if model_name == "ast-finetuned-audioset-10-10-0.4593":
														_lowerCAmelCase  :							Tuple				     =					torch.tensor([-0.87_60, -7.00_42, -8.66_02]						)
							elif model_name == "ast-finetuned-audioset-10-10-0.450":
														_lowerCAmelCase  :							Union[str, Any]				     =					torch.tensor([-1.19_86, -7.09_03, -8.27_18]						)
							elif model_name == "ast-finetuned-audioset-10-10-0.448":
														_lowerCAmelCase  :							Any				     =					torch.tensor([-2.61_28, -8.00_80, -9.43_44]						)
							elif model_name == "ast-finetuned-audioset-10-10-0.448-v2":
														_lowerCAmelCase  :							str				     =					torch.tensor([-1.50_80, -7.45_34, -8.89_17]						)
							elif model_name == "ast-finetuned-audioset-12-12-0.447":
														_lowerCAmelCase  :							List[str]				     =					torch.tensor([-0.50_50, -6.58_33, -8.08_43]						)
							elif model_name == "ast-finetuned-audioset-14-14-0.443":
														_lowerCAmelCase  :							Tuple				     =					torch.tensor([-0.38_26, -7.03_36, -8.24_13]						)
							elif model_name == "ast-finetuned-audioset-16-16-0.442":
														_lowerCAmelCase  :							int				     =					torch.tensor([-1.21_13, -6.91_01, -8.34_70]						)
							elif model_name == "ast-finetuned-speech-commands-v2":
														_lowerCAmelCase  :							int				     =					torch.tensor([6.15_89, -8.05_66, -8.79_84]						)
							else:
														raise ValueError("Unknown model name"						)
							if not torch.allclose(logits[0, :3]       ,				_lowerCamelCase       ,				atol=1e-4						):
														raise ValueError("Logits don't match"						)
							print("Looks ok!"						)

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

							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__":
						_snake_case	=						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."
						)

						_snake_case	=						parser.parse_args()
						convert_audio_spectrogram_transformer_checkpoint(args.model_name, args.pytorch_dump_folder_path, args.push_to_hub)





import baseaa






def        A       (      _lowerCamelCase						):





							'''simple docstring'''




							return baseaa.aaaencode(string.encode("utf-8"						)						)






def        A       (      _lowerCamelCase						):





							'''simple docstring'''




							return baseaa.aaadecode(_lowerCamelCase						).decode("utf-8"						)


if __name__ == "__main__":
						import doctest

						doctest.testmod()
