

from typing import List, Optional, Union

import numpy as np

from ...feature_extraction_sequence_utils import SequenceFeatureExtractor
from ...feature_extraction_utils import BatchFeature
from ...utils import PaddingStrategy, TensorType, logging


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





class  __UpperCAmelCase					(	lowerCamelCase__						):
   UpperCamelCase       					=					["""input_values""", """padding_mask"""]



   def __init__(							self							:					int,		__A							:					int = 1,		__A							:					int = 2_4_0_0_0,		__A							:					float = 0.0,		__A							:					float = None,		__A							:					float = None,		**__A							:					int,		):
     super().__init__(feature_size=__A,		sampling_rate=__A,		padding_value=__A,		**__A						)
     UpperCAmelCase	:							List[str]						=			chunk_length_s
     UpperCAmelCase	:							int						=			overlap



   @property
   def 	__magic_name__   (							self							:					List[str]						):
     if self.chunk_length_s is None:
       return None
     else:
       return int(self.chunk_length_s * self.sampling_rate						)



   @property
   def 	__magic_name__   (							self							:					Tuple						):
     if self.chunk_length_s is None or self.overlap is None:
       return None
     else:
       return max(1,		int((1.0 - self.overlap) * self.chunk_length						)						)





   def __call__(							self							:					Dict,		__A							:					Union[np.ndarray, List[float], List[np.ndarray], List[List[float]]],		__A							:					Optional[Union[bool, str, PaddingStrategy]] = None,		__A							:					Optional[bool] = False,		__A							:					Optional[int] = None,		__A							:					Optional[Union[str, TensorType]] = None,		__A							:					Optional[int] = None,		):
     if sampling_rate is not None:
       if sampling_rate != self.sampling_rate:
         raise ValueError(
             F'''The model corresponding to this feature extractor: {self} was trained using a sampling rate of'''
             F''' {self.sampling_rate}. Please make sure that the provided audio input was sampled with'''
             F''' {self.sampling_rate} and not {sampling_rate}.'''						)
     else:
       logger.warning(
           '''It is strongly recommended to pass the `sampling_rate` argument to this function. '''
           '''Failing to do so can result in silent errors that might be hard to debug.'''						)

     if padding and truncation:
       raise ValueError('''Both padding and truncation were set. Make sure you only set one.'''						)
     elif padding is None:
       # by default let's pad the inputs
       UpperCAmelCase	:							Optional[int]						=			True

     UpperCAmelCase	:							str						=			bool(
         isinstance(__A,		(list, tuple)						) and (isinstance(raw_audio[0],		(np.ndarray, tuple, list)						))						)

     if is_batched:
       UpperCAmelCase	:							int						=			[np.asarray(__A,		dtype=np.floataa						).T for audio in raw_audio]
     elif not is_batched and not isinstance(__A,		np.ndarray						):
       UpperCAmelCase	:							List[Any]						=			np.asarray(__A,		dtype=np.floataa						)
     elif isinstance(__A,		np.ndarray						) and raw_audio.dtype is np.dtype(np.floataa						):
       UpperCAmelCase	:							Dict						=			raw_audio.astype(np.floataa						)

     # always return batch
     if not is_batched:
       UpperCAmelCase	:							Union[str, Any]						=			[np.asarray(__A						).T]

     # verify inputs are valid
     for idx, example in enumerate(__A						):
       if example.ndim > 2:
         raise ValueError(F'''Expected input shape (channels, length) but got shape {example.shape}'''						)
       if self.feature_size == 1 and example.ndim != 1:
         raise ValueError(F'''Expected mono audio but example has {example.shape[-1]} channels'''						)
       if self.feature_size == 2 and example.shape[-1] != 2:
         raise ValueError(F'''Expected stereo audio but example has {example.shape[-1]} channels'''						)

     UpperCAmelCase	:							Tuple						=			None
     UpperCAmelCase	:							str						=			BatchFeature({'''input_values''': raw_audio}						)
     if self.chunk_stride is not None and self.chunk_length is not None and max_length is None:
       if truncation:
         UpperCAmelCase	:							Optional[Any]						=			min(array.shape[0] for array in raw_audio						)
         UpperCAmelCase	:							Tuple						=			int(np.floor(max_length / self.chunk_stride						)						)
         UpperCAmelCase	:							Dict						=			(nb_step - 1) * self.chunk_stride + self.chunk_length
       elif padding:
         UpperCAmelCase	:							Union[str, Any]						=			max(array.shape[0] for array in raw_audio						)
         UpperCAmelCase	:							Union[str, Any]						=			int(np.ceil(max_length / self.chunk_stride						)						)
         UpperCAmelCase	:							List[str]						=			(nb_step - 1) * self.chunk_stride + self.chunk_length
         UpperCAmelCase	:							Optional[int]						=			'''max_length'''
       else:
         UpperCAmelCase	:							str						=			input_values

        # normal padding on batch
     if padded_inputs is None:
       UpperCAmelCase	:							Optional[int]						=			self.pad(
           __A,		max_length=__A,		truncation=__A,		padding=__A,		return_attention_mask=__A,		)
       if padding:
         UpperCAmelCase	:							Optional[Any]						=			padded_inputs.pop('''attention_mask'''						)

     UpperCAmelCase	:							Dict						=			[]
     for example in padded_inputs.pop('''input_values'''						):
       if self.feature_size == 1:
         UpperCAmelCase	:							Optional[int]						=			example[..., None]
       input_values.append(example.T						)

     UpperCAmelCase	:							List[Any]						=			input_values
     if return_tensors is not None:
       UpperCAmelCase	:							List[Any]						=			padded_inputs.convert_to_tensors(__A						)

     return padded_inputs








import os
from shutil import copyfile
from typing import List, Optional, Tuple

from tokenizers import processors

from ...tokenization_utils import AddedToken, BatchEncoding
from ...tokenization_utils_fast import PreTrainedTokenizerFast
from ...utils import is_sentencepiece_available, logging


if is_sentencepiece_available():
     from .tokenization_nllb import NllbTokenizer
else:
     _lowerCamelCase    :       List[Any]        =							None


_lowerCamelCase    :       str        =							logging.get_logger(__name__)


_lowerCamelCase    :       str        =							{"vocab_file": "sentencepiece.bpe.model", "tokenizer_file": "tokenizer.json"}

_lowerCamelCase    :       str        =							{
    "vocab_file": {
        "facebook/nllb-200-distilled-600M": (
            "https://huggingface.co/facebook/nllb-200-distilled-600M/resolve/main/sentencepiece.bpe.model"
        ),
    },
    "tokenizer_file": {
        "facebook/nllb-200-distilled-600M": (
            "https://huggingface.co/facebook/nllb-200-distilled-600M/resolve/main/tokenizer.json"
        ),
    },
}

_lowerCamelCase    :       Any        =							{
    "facebook/nllb-large-en-ro": 1_0_2_4,
    "facebook/nllb-200-distilled-600M": 1_0_2_4,
}

# fmt: off
_lowerCamelCase    :       int        =							["ace_Arab", "ace_Latn", "acm_Arab", "acq_Arab", "aeb_Arab", "afr_Latn", "ajp_Arab", "aka_Latn", "amh_Ethi", "apc_Arab", "arb_Arab", "ars_Arab", "ary_Arab", "arz_Arab", "asm_Beng", "ast_Latn", "awa_Deva", "ayr_Latn", "azb_Arab", "azj_Latn", "bak_Cyrl", "bam_Latn", "ban_Latn", "bel_Cyrl", "bem_Latn", "ben_Beng", "bho_Deva", "bjn_Arab", "bjn_Latn", "bod_Tibt", "bos_Latn", "bug_Latn", "bul_Cyrl", "cat_Latn", "ceb_Latn", "ces_Latn", "cjk_Latn", "ckb_Arab", "crh_Latn", "cym_Latn", "dan_Latn", "deu_Latn", "dik_Latn", "dyu_Latn", "dzo_Tibt", "ell_Grek", "eng_Latn", "epo_Latn", "est_Latn", "eus_Latn", "ewe_Latn", "fao_Latn", "pes_Arab", "fij_Latn", "fin_Latn", "fon_Latn", "fra_Latn", "fur_Latn", "fuv_Latn", "gla_Latn", "gle_Latn", "glg_Latn", "grn_Latn", "guj_Gujr", "hat_Latn", "hau_Latn", "heb_Hebr", "hin_Deva", "hne_Deva", "hrv_Latn", "hun_Latn", "hye_Armn", "ibo_Latn", "ilo_Latn", "ind_Latn", "isl_Latn", "ita_Latn", "jav_Latn", "jpn_Jpan", "kab_Latn", "kac_Latn", "kam_Latn", "kan_Knda", "kas_Arab", "kas_Deva", "kat_Geor", "knc_Arab", "knc_Latn", "kaz_Cyrl", "kbp_Latn", "kea_Latn", "khm_Khmr", "kik_Latn", "kin_Latn", "kir_Cyrl", "kmb_Latn", "kon_Latn", "kor_Hang", "kmr_Latn", "lao_Laoo", "lvs_Latn", "lij_Latn", "lim_Latn", "lin_Latn", "lit_Latn", "lmo_Latn", "ltg_Latn", "ltz_Latn", "lua_Latn", "lug_Latn", "luo_Latn", "lus_Latn", "mag_Deva", "mai_Deva", "mal_Mlym", "mar_Deva", "min_Latn", "mkd_Cyrl", "plt_Latn", "mlt_Latn", "mni_Beng", "khk_Cyrl", "mos_Latn", "mri_Latn", "zsm_Latn", "mya_Mymr", "nld_Latn", "nno_Latn", "nob_Latn", "npi_Deva", "nso_Latn", "nus_Latn", "nya_Latn", "oci_Latn", "gaz_Latn", "ory_Orya", "pag_Latn", "pan_Guru", "pap_Latn", "pol_Latn", "por_Latn", "prs_Arab", "pbt_Arab", "quy_Latn", "ron_Latn", "run_Latn", "rus_Cyrl", "sag_Latn", "san_Deva", "sat_Beng", "scn_Latn", "shn_Mymr", "sin_Sinh", "slk_Latn", "slv_Latn", "smo_Latn", "sna_Latn", "snd_Arab", "som_Latn", "sot_Latn", "spa_Latn", "als_Latn", "srd_Latn", "srp_Cyrl", "ssw_Latn", "sun_Latn", "swe_Latn", "swh_Latn", "szl_Latn", "tam_Taml", "tat_Cyrl", "tel_Telu", "tgk_Cyrl", "tgl_Latn", "tha_Thai", "tir_Ethi", "taq_Latn", "taq_Tfng", "tpi_Latn", "tsn_Latn", "tso_Latn", "tuk_Latn", "tum_Latn", "tur_Latn", "twi_Latn", "tzm_Tfng", "uig_Arab", "ukr_Cyrl", "umb_Latn", "urd_Arab", "uzn_Latn", "vec_Latn", "vie_Latn", "war_Latn", "wol_Latn", "xho_Latn", "ydd_Hebr", "yor_Latn", "yue_Hant", "zho_Hans", "zho_Hant", "zul_Latn"]





class  __UpperCAmelCase					(	lowerCamelCase__						):
   UpperCamelCase       					=					VOCAB_FILES_NAMES
   UpperCamelCase       					=					PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES
   UpperCamelCase       					=					PRETRAINED_VOCAB_FILES_MAP
   UpperCamelCase       					=					["""input_ids""", """attention_mask"""]
   UpperCamelCase       					=					NllbTokenizer

   UpperCamelCase       					=					[]
   UpperCamelCase       					=					[]



   def __init__(							self							:					Optional[Any],		__A							:					Tuple=None,		__A							:					int=None,		__A							:					List[Any]="<s>",		__A							:					Tuple="</s>",		__A							:					Any="</s>",		__A							:					Optional[Any]="<s>",		__A							:					Tuple="<unk>",		__A							:					str="<pad>",		__A							:					Dict="<mask>",		__A							:					Optional[Any]=None,		__A							:					List[Any]=None,		__A							:					List[Any]=None,		__A							:					str=False,		**__A							:					Tuple,		):
     # Mask token behave like a normal word, i.e. include the space before it
     UpperCAmelCase	:							int						=			AddedToken(__A,		lstrip=__A,		rstrip=__A						) if isinstance(__A,		__A						) else mask_token
     UpperCAmelCase	:							str						=			legacy_behaviour
     super().__init__(
         vocab_file=__A,		tokenizer_file=__A,		bos_token=__A,		eos_token=__A,		sep_token=__A,		cls_token=__A,		unk_token=__A,		pad_token=__A,		mask_token=__A,		src_lang=__A,		tgt_lang=__A,		additional_special_tokens=__A,		legacy_behaviour=__A,		**__A,		)

     UpperCAmelCase	:							Optional[int]						=			vocab_file
     UpperCAmelCase	:							Optional[Any]						=			False if not self.vocab_file else True

     UpperCAmelCase	:							Optional[int]						=			FAIRSEQ_LANGUAGE_CODES.copy()

     if additional_special_tokens is not None:
       # Only add those special tokens if they are not already there.
       _additional_special_tokens.extend(
           [t for t in additional_special_tokens if t not in _additional_special_tokens]						)

     self.add_special_tokens({'''additional_special_tokens''': _additional_special_tokens}						)
     UpperCAmelCase	:							List[Any]						=			{
         lang_code: self.convert_tokens_to_ids(__A						) for lang_code in FAIRSEQ_LANGUAGE_CODES
     }

     UpperCAmelCase	:							List[Any]						=			src_lang if src_lang is not None else '''eng_Latn'''
     UpperCAmelCase	:							List[Any]						=			self.convert_tokens_to_ids(self._src_lang						)
     UpperCAmelCase	:							List[str]						=			tgt_lang
     self.set_src_lang_special_tokens(self._src_lang						)



   @property
   def 	__magic_name__   (							self							:					Optional[int]						):
     return self._src_lang



   @src_lang.setter
   def 	__magic_name__   (							self							:					Union[str, Any],		__A							:					str						):
     UpperCAmelCase	:							Tuple						=			new_src_lang
     self.set_src_lang_special_tokens(self._src_lang						)



   def 	__magic_name__   (							self							:					Any,		__A							:					List[int],		__A							:					Optional[List[int]] = None						):
     if token_ids_a is None:
       return self.prefix_tokens + token_ids_a + self.suffix_tokens
     # We don't expect to process pairs, but leave the pair logic for API consistency
     return self.prefix_tokens + token_ids_a + token_ids_a + self.suffix_tokens



   def 	__magic_name__   (							self							:					Tuple,		__A							:					List[int],		__A							:					Optional[List[int]] = None						):
     UpperCAmelCase	:							Union[str, Any]						=			[self.sep_token_id]
     UpperCAmelCase	:							Any						=			[self.cls_token_id]

     if token_ids_a is None:
       return len(cls + token_ids_a + sep						) * [0]
     return len(cls + token_ids_a + sep + sep + token_ids_a + sep						) * [0]



   def 	__magic_name__   (							self							:					str,		__A							:					Optional[int],		__A							:					str,		__A							:					Optional[str],		__A							:					Optional[str],		**__A							:					Union[str, Any]						):
     if src_lang is None or tgt_lang is None:
       raise ValueError('''Translation requires a `src_lang` and a `tgt_lang` for this model'''						)
     UpperCAmelCase	:							Optional[Any]						=			src_lang
     UpperCAmelCase	:							Optional[Any]						=			self(__A,		add_special_tokens=__A,		return_tensors=__A,		**__A						)
     UpperCAmelCase	:							Union[str, Any]						=			self.convert_tokens_to_ids(__A						)
     UpperCAmelCase	:							int						=			tgt_lang_id
     return inputs



   def 	__magic_name__   (							self							:					List[str],		__A							:					List[str],		__A							:					str = "eng_Latn",		__A							:					Optional[List[str]] = None,		__A							:					str = "fra_Latn",		**__A							:					Tuple,		):
     UpperCAmelCase	:							Any						=			src_lang
     UpperCAmelCase	:							Tuple						=			tgt_lang
     return super().prepare_seqaseq_batch(__A,		__A,		**__A						)



   def 	__magic_name__   (							self							:					List[str]						):
     return self.set_src_lang_special_tokens(self.src_lang						)



   def 	__magic_name__   (							self							:					Optional[Any]						):
     return self.set_tgt_lang_special_tokens(self.tgt_lang						)



   def 	__magic_name__   (							self							:					Union[str, Any],		__A							:					List[str]						):
     UpperCAmelCase	:							int						=			self.convert_tokens_to_ids(__A						)

     if self.legacy_behaviour:
       UpperCAmelCase	:							Tuple						=			[]
       UpperCAmelCase	:							Optional[int]						=			[self.eos_token_id, self.cur_lang_code]
     else:
       UpperCAmelCase	:							Any						=			[self.cur_lang_code]
       UpperCAmelCase	:							Optional[Any]						=			[self.eos_token_id]

     UpperCAmelCase	:							Dict						=			self.convert_ids_to_tokens(self.prefix_tokens						)
     UpperCAmelCase	:							Union[str, Any]						=			self.convert_ids_to_tokens(self.suffix_tokens						)

     UpperCAmelCase	:							int						=			processors.TemplateProcessing(
         single=prefix_tokens_str + ['''$A'''] + suffix_tokens_str,		pair=prefix_tokens_str + ['''$A''', '''$B'''] + suffix_tokens_str,		special_tokens=list(zip(prefix_tokens_str + suffix_tokens_str,		self.prefix_tokens + self.suffix_tokens						)						),		)



   def 	__magic_name__   (							self							:					Dict,		__A							:					str						):
     UpperCAmelCase	:							Optional[int]						=			self.convert_tokens_to_ids(__A						)
     if self.legacy_behaviour:
       UpperCAmelCase	:							List[Any]						=			[]
       UpperCAmelCase	:							Any						=			[self.eos_token_id, self.cur_lang_code]
     else:
       UpperCAmelCase	:							int						=			[self.cur_lang_code]
       UpperCAmelCase	:							List[Any]						=			[self.eos_token_id]

     UpperCAmelCase	:							str						=			self.convert_ids_to_tokens(self.prefix_tokens						)
     UpperCAmelCase	:							List[Any]						=			self.convert_ids_to_tokens(self.suffix_tokens						)

     UpperCAmelCase	:							List[str]						=			processors.TemplateProcessing(
         single=prefix_tokens_str + ['''$A'''] + suffix_tokens_str,		pair=prefix_tokens_str + ['''$A''', '''$B'''] + suffix_tokens_str,		special_tokens=list(zip(prefix_tokens_str + suffix_tokens_str,		self.prefix_tokens + self.suffix_tokens						)						),		)





   def 	__magic_name__   (							self							:					Dict,		__A							:					str,		__A							:					Optional[str] = None						):
     if not self.can_save_slow_tokenizer:
       raise ValueError(
           '''Your fast tokenizer does not have the necessary information to save the vocabulary for a slow '''
           '''tokenizer.'''						)

     if not os.path.isdir(__A						):
       logger.error(F'''Vocabulary path ({save_directory}) should be a directory.'''						)
       return
     UpperCAmelCase	:							Tuple						=			os.path.join(
         __A,		(filename_prefix + '''-''' if filename_prefix else '''''') + VOCAB_FILES_NAMES['''vocab_file''']						)

     if os.path.abspath(self.vocab_file						) != os.path.abspath(__A						):
       copyfile(self.vocab_file,		__A						)

     return (out_vocab_file,)





