
"""simple docstring"""

def 		UpperCAmelCase (		a_,						a_ = False      ):





		'''simple docstring'''


		if not isinstance(a_,						a_      ):
				lowerCamelCase					:      Any          =   F"""Expected string as input, found {type(a_      )}"""
				raise ValueError(a_      )
		if not isinstance(a_,						a_      ):
				lowerCamelCase					:      Any          =   F"""Expected boolean as use_pascal parameter, found {type(a_      )}"""
				raise ValueError(a_      )

		lowerCamelCase					:      List[Any]          =   input_str.split('_'      )

		lowerCamelCase					:      str          =   0 if use_pascal else 1

		lowerCamelCase					:      Union[str, Any]          =   words[start_index:]

		lowerCamelCase					:      int          =   [word[0].upper() + word[1:] for word in words_to_capitalize]

		lowerCamelCase					:      Any          =   '' if use_pascal else words[0]

		return "".join([initial_word, *capitalized_words]      )


if __name__ == "__main__":
					from doctest import testmod

					testmod()







"""simple docstring"""

import argparse
import hashlib
import os
import urllib
import warnings

import torch
from torch import nn
from tqdm import tqdm

from transformers import WhisperConfig, WhisperForConditionalGeneration


_A						=			{
    'tiny.en': 'https://openaipublic.azureedge.net/main/whisper/models/d3dd57d32accea0b295c96e26691aa14d8822fac7d9d27d5dc00b4ca2826dd03/tiny.en.pt',
    'tiny': 'https://openaipublic.azureedge.net/main/whisper/models/65147644a518d12f04e32d6f3b26facc3f8dd46e5390956a9424a650c0ce22b9/tiny.pt',
    'base.en': 'https://openaipublic.azureedge.net/main/whisper/models/25a8566e1d0c1e2231d1c762132cd20e0f96a85d16145c3a00adf5d1ac670ead/base.en.pt',
    'base': 'https://openaipublic.azureedge.net/main/whisper/models/ed3a0b6b1c0edf879ad9b11b1af5a0e6ab5db9205f891f668f8b0e6c6326e34e/base.pt',
    'small.en': 'https://openaipublic.azureedge.net/main/whisper/models/f953ad0fd29cacd07d5a9eda5624af0f6bcf2258be67c92b79389873d91e0872/small.en.pt',
    'small': 'https://openaipublic.azureedge.net/main/whisper/models/9ecf779972d90ba49c06d968637d720dd632c55bbf19d441fb42bf17a411e794/small.pt',
    'medium.en': 'https://openaipublic.azureedge.net/main/whisper/models/d7440d1dc186f76616474e0ff0b3b6b879abc9d1a4926b7adfa41db2d497ab4f/medium.en.pt',
    'medium': 'https://openaipublic.azureedge.net/main/whisper/models/345ae4da62f9b3d59415adc60127b97c714f32e89e936602e85993674d08dcb1/medium.pt',
    'large': 'https://openaipublic.azureedge.net/main/whisper/models/e4b87e7e0bf463eb8e6956e646f1e277e901512310def2c24bf0e11bd3c28e9a/large.pt',
    'large-v2': 'https://openaipublic.azureedge.net/main/whisper/models/81f7c96c852ee8fc832187b0132e569d6c3065a3252ed18e56effd0b6a73e524/large-v2.pt',
}
def 		UpperCAmelCase (		a_      ):





		'''simple docstring'''


		lowerCamelCase					:      str          =   ['layers', 'blocks']
		for k in ignore_keys:
				state_dict.pop(a_,						a_      )


_A						=			{
    'blocks': 'layers',
    'mlp.0': 'fc1',
    'mlp.2': 'fc2',
    'mlp_ln': 'final_layer_norm',
    '.attn.query': '.self_attn.q_proj',
    '.attn.key': '.self_attn.k_proj',
    '.attn.value': '.self_attn.v_proj',
    '.attn_ln': '.self_attn_layer_norm',
    '.attn.out': '.self_attn.out_proj',
    '.cross_attn.query': '.encoder_attn.q_proj',
    '.cross_attn.key': '.encoder_attn.k_proj',
    '.cross_attn.value': '.encoder_attn.v_proj',
    '.cross_attn_ln': '.encoder_attn_layer_norm',
    '.cross_attn.out': '.encoder_attn.out_proj',
    'decoder.ln.': 'decoder.layer_norm.',
    'encoder.ln.': 'encoder.layer_norm.',
    'token_embedding': 'embed_tokens',
    'encoder.positional_embedding': 'encoder.embed_positions.weight',
    'decoder.positional_embedding': 'decoder.embed_positions.weight',
    'ln_post': 'layer_norm',
}
def 		UpperCAmelCase (		a_      ):





		'''simple docstring'''


		lowerCamelCase					:      Tuple          =   list(s_dict.keys()      )
		for key in keys:
				lowerCamelCase					:      List[Any]          =   key
				for k, v in WHISPER_MAPPING.items():
						if k in key:
								lowerCamelCase					:      Optional[int]          =   new_key.replace(a_,						a_      )

				print(F"""{key} -> {new_key}"""      )

				lowerCamelCase					:      Any          =   s_dict.pop(a_      )
		return s_dict
def 		UpperCAmelCase (		a_      ):





		'''simple docstring'''


		lowerCamelCase     ,   lowerCamelCase					:      int          =   emb.weight.shape
		lowerCamelCase					:      Dict          =   nn.Linear(a_,						a_,						bias=a_      )
		lowerCamelCase					:      Union[str, Any]          =   emb.weight.data
		return lin_layer
def 		UpperCAmelCase (		a_,						a_      ):





		'''simple docstring'''


		os.makedirs(a_,						exist_ok=a_      )
		lowerCamelCase					:      Union[str, Any]          =   os.path.basename(a_      )

		lowerCamelCase					:      Any          =   url.split('/'      )[-2]
		lowerCamelCase					:      Tuple          =   os.path.join(a_,						a_      )

		if os.path.exists(a_      ) and not os.path.isfile(a_      ):
				raise RuntimeError(F"""{download_target} exists and is not a regular file"""      )

		if os.path.isfile(a_      ):
				lowerCamelCase					:      Union[str, Any]          =   open(a_,						'rb'      ).read()
				if hashlib.shaaaa(a_      ).hexdigest() == expected_shaaaa:
						return model_bytes
				else:
						warnings.warn(F"""{download_target} exists, but the SHA256 checksum does not match; re-downloading the file"""      )

		with urllib.request.urlopen(a_      ) as source, open(a_,						'wb'      ) as output:
				with tqdm(
				    total=int(source.info().get('Content-Length'      )      ),						ncols=80,						unit='iB',						unit_scale=a_,						unit_divisor=1024      ) as loop:
						while True:
								lowerCamelCase					:      Union[str, Any]          =   source.read(8192      )
								if not buffer:
										break

								output.write(a_      )
								loop.update(len(a_      )      )

		lowerCamelCase					:      int          =   open(a_,						'rb'      ).read()
		if hashlib.shaaaa(a_      ).hexdigest() != expected_shaaaa:
				raise RuntimeError(
				    'Model has been downloaded but the SHA256 checksum does not not match. Please retry loading the model.'      )

		return model_bytes
def 		UpperCAmelCase (		a_,						a_      ):





		'''simple docstring'''


		if ".pt" not in checkpoint_path:
				lowerCamelCase					:      str          =   _download(_MODELS[checkpoint_path]      )
		else:
				lowerCamelCase					:      Any          =   torch.load(a_,						map_location='cpu'      )
		lowerCamelCase					:      List[str]          =   original_checkpoint['dims']
		lowerCamelCase					:      Any          =   original_checkpoint['model_state_dict']
		lowerCamelCase					:      Tuple          =   state_dict['decoder.token_embedding.weight']
		remove_ignore_keys_(a_      )
		rename_keys(a_      )
		lowerCamelCase					:      List[Any]          =   True
		lowerCamelCase					:      str          =   state_dict['decoder.layers.0.fc1.weight'].shape[0]

		lowerCamelCase					:      Optional[int]          =   WhisperConfig(
		    vocab_size=dimensions['n_vocab'],						encoder_ffn_dim=a_,						decoder_ffn_dim=a_,						num_mel_bins=dimensions['n_mels'],						d_model=dimensions['n_audio_state'],						max_target_positions=dimensions['n_text_ctx'],						encoder_layers=dimensions['n_audio_layer'],						encoder_attention_heads=dimensions['n_audio_head'],						decoder_layers=dimensions['n_text_layer'],						decoder_attention_heads=dimensions['n_text_state'],						max_source_positions=dimensions['n_audio_ctx'],						)

		lowerCamelCase					:      Union[str, Any]          =   WhisperForConditionalGeneration(a_      )
		lowerCamelCase     ,   lowerCamelCase					:      Optional[int]          =   model.model.load_state_dict(a_,						strict=a_      )
		if len(a_      ) > 0 and not set(a_      ) <= {
		    "encoder.embed_positions.weights",
		    "decoder.embed_positions.weights",
		}:
				raise ValueError(
				    'Only `encoder.embed_positions.weights` and `decoder.embed_positions.weights`  are allowed to be missing,'
				    F""" but all the following weights are missing {missing}"""      )

		if tie_embeds:
				lowerCamelCase					:      List[Any]          =   make_linear_from_emb(model.model.decoder.embed_tokens      )
		else:
				lowerCamelCase					:      Tuple          =   proj_out_weights

		model.save_pretrained(a_      )


if __name__ == "__main__":
					_A						=			argparse.ArgumentParser()
					# # Required parameters
					parser.add_argument('--checkpoint_path', type=str, help='Patht to the downloaded checkpoints')
					parser.add_argument('--pytorch_dump_folder_path', default=None, type=str, help='Path to the output PyTorch model.')
					_A						=			parser.parse_args()

					convert_openai_whisper_to_tfms(args.checkpoint_path, args.pytorch_dump_folder_path)






