





'''simple docstring'''


from typing import List, Optional, Union

import numpy as np
import torch
import torchaudio.compliance.kaldi as ta_kaldi

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


_SCREAMING_SNAKE_CASE									=				logging.get_logger(__name__)

class  lowerCAmelCase_		(		__magic_name__		):
 __lowerCamelCase    :				List[Any]								=       ["input_features", "attention_mask"]




 def __init__(						self      ,  _lowerCAmelCase=80      ,  _lowerCAmelCase=16000      ,  _lowerCAmelCase=80      ,  _lowerCAmelCase=0.0      ,  _lowerCAmelCase=True      ,  _lowerCAmelCase=True      ,  _lowerCAmelCase=True      ,  **_lowerCAmelCase      ,  )     ->				Tuple:
     super().__init__(feature_size=_lowerCAmelCase      ,  sampling_rate=_lowerCAmelCase      ,  padding_value=_lowerCAmelCase      ,  **_lowerCAmelCase		)
     _lowerCAmelCase						      =   num_mel_bins
     _lowerCAmelCase						      =   do_ceptral_normalize
     _lowerCAmelCase						      =   normalize_means
     _lowerCAmelCase						      =   normalize_vars
     _lowerCAmelCase						      =   True




 def 				_snake_case (						self      ,  _lowerCAmelCase      ,  )     ->				np.ndarray:
     _lowerCAmelCase						      =   waveform * (2**15)  # Kaldi compliance: 16-bit signed integers
     _lowerCAmelCase						      =   torch.from_numpy(_lowerCAmelCase		).unsqueeze(0		)
     _lowerCAmelCase						      =   ta_kaldi.fbank(_lowerCAmelCase      ,  num_mel_bins=self.num_mel_bins      ,  sample_frequency=self.sampling_rate		)
     return features.numpy()




 @staticmethod
 def 				_snake_case (						_lowerCAmelCase      ,  _lowerCAmelCase      ,  _lowerCAmelCase = True      ,  _lowerCAmelCase = True      ,  _lowerCAmelCase = 0.0      ,  )     ->				np.ndarray:
     # make sure we normalize float32 arrays
     if normalize_means:
         _lowerCAmelCase						      =   x[:input_length].mean(axis=0		)
         _lowerCAmelCase						      =   np.subtract(_lowerCAmelCase      ,  _lowerCAmelCase		)
     if normalize_vars:
         _lowerCAmelCase						      =   x[:input_length].std(axis=0		)
         _lowerCAmelCase						      =   np.divide(_lowerCAmelCase      ,  _lowerCAmelCase		)

     if input_length < x.shape[0]:
         _lowerCAmelCase						      =   padding_value

     # make sure array is in float32
     _lowerCAmelCase						      =   x.astype(np.floataa		)

     return x




 def 				_snake_case (						self      ,  _lowerCAmelCase      ,  _lowerCAmelCase = None		)     ->				List[np.ndarray]:
     _lowerCAmelCase						      =   attention_mask.sum(-1		) if attention_mask is not None else [x.shape[0] for x in input_features]
     return [
         self.utterance_cmvn(_lowerCAmelCase      ,  _lowerCAmelCase      ,  self.normalize_means      ,  self.normalize_vars      ,  self.padding_value		)
         for x, n in zip(_lowerCAmelCase      ,  _lowerCAmelCase		)
     ]





 def __call__(						self      ,  _lowerCAmelCase      ,  _lowerCAmelCase = False      ,  _lowerCAmelCase = None      ,  _lowerCAmelCase = False      ,  _lowerCAmelCase = None      ,  _lowerCAmelCase = None      ,  _lowerCAmelCase = None      ,  _lowerCAmelCase = None      ,  **_lowerCAmelCase      ,  )     ->				BatchFeature:

     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 `raw_speech` 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."		)

     _lowerCAmelCase						      =   isinstance(_lowerCAmelCase      ,  np.ndarray		) and len(raw_speech.shape		) > 1
     if is_batched_numpy and len(raw_speech.shape		) > 2:
         raise ValueError(f'''Only mono-channel audio is supported for input to {self}'''		)
     _lowerCAmelCase						      =   is_batched_numpy or (
         isinstance(_lowerCAmelCase      ,  (list, tuple)		) and (isinstance(raw_speech[0]      ,  (np.ndarray, tuple, list)		))
     )

     if is_batched:
         _lowerCAmelCase						      =   [np.asarray(_lowerCAmelCase      ,  dtype=np.floataa		) for speech in raw_speech]
     elif not is_batched and not isinstance(_lowerCAmelCase      ,  np.ndarray		):
         _lowerCAmelCase						      =   np.asarray(_lowerCAmelCase      ,  dtype=np.floataa		)
     elif isinstance(_lowerCAmelCase      ,  np.ndarray		) and raw_speech.dtype is np.dtype(np.floataa		):
         _lowerCAmelCase						      =   raw_speech.astype(np.floataa		)

     # always return batch
     if not is_batched:
         _lowerCAmelCase						      =   [raw_speech]

     # extract fbank features
     _lowerCAmelCase						      =   [self._extract_fbank_features(_lowerCAmelCase		) for waveform in raw_speech]

     # convert into correct format for padding
     _lowerCAmelCase						      =   BatchFeature({"input_features": features}		)

     _lowerCAmelCase						      =   self.pad(
         _lowerCAmelCase      ,  padding=_lowerCAmelCase      ,  max_length=_lowerCAmelCase      ,  truncation=_lowerCAmelCase      ,  pad_to_multiple_of=_lowerCAmelCase      ,  return_attention_mask=_lowerCAmelCase      ,  **_lowerCAmelCase      ,  )

     # make sure list is in array format
     _lowerCAmelCase						      =   padded_inputs.get("input_features"		)
     if isinstance(input_features[0]      ,  _lowerCAmelCase		):
         _lowerCAmelCase						      =   [np.asarray(_lowerCAmelCase      ,  dtype=np.floataa		) for feature in input_features]

     _lowerCAmelCase						      =   padded_inputs.get("attention_mask"		)
     if attention_mask is not None:
         _lowerCAmelCase						      =   [np.asarray(_lowerCAmelCase      ,  dtype=np.intaa		) for array in attention_mask]

     # Utterance-level cepstral mean and variance normalization
     if self.do_ceptral_normalize:
         _lowerCAmelCase						      =   (
             np.array(_lowerCAmelCase      ,  dtype=np.intaa		)
             if self._get_padding_strategies(_lowerCAmelCase      ,  max_length=_lowerCAmelCase		) is not PaddingStrategy.DO_NOT_PAD
             else None
         )
         _lowerCAmelCase						      =   self.normalize(
             padded_inputs["input_features"]      ,  attention_mask=_lowerCAmelCase		)

     if return_tensors is not None:
         _lowerCAmelCase						      =   padded_inputs.convert_to_tensors(_lowerCAmelCase		)

     return padded_inputs






from ..utils import DummyObject, requires_backends







class        __lowercase       (							metaclass=a_  ):



		"""simple docstring"""

		UpperCamelCase     :					Tuple			       =		["flax"]







		def __init__( self		,      *A		,      **A	)  -> str:







					'''simple docstring'''







					requires_backends(self		,      ["""flax"""]	)







		@classmethod
		def 					__A   ( cls		,      *A		,      **A	)  -> int:







					'''simple docstring'''







					requires_backends(cls		,      ["""flax"""]	)







		@classmethod
		def 					__A   ( cls		,      *A		,      **A	)  -> str:







					'''simple docstring'''







					requires_backends(cls		,      ["""flax"""]	)







class        __lowercase       (							metaclass=a_  ):



		"""simple docstring"""

		UpperCamelCase     :					Optional[Any]			       =		["flax"]







		def __init__( self		,      *A		,      **A	)  -> Dict:







					'''simple docstring'''







					requires_backends(self		,      ["""flax"""]	)







		@classmethod
		def 					__A   ( cls		,      *A		,      **A	)  -> List[str]:







					'''simple docstring'''







					requires_backends(cls		,      ["""flax"""]	)







		@classmethod
		def 					__A   ( cls		,      *A		,      **A	)  -> Dict:







					'''simple docstring'''







					requires_backends(cls		,      ["""flax"""]	)







class        __lowercase       (							metaclass=a_  ):



		"""simple docstring"""

		UpperCamelCase     :					str			       =		["flax"]







		def __init__( self		,      *A		,      **A	)  -> Dict:







					'''simple docstring'''







					requires_backends(self		,      ["""flax"""]	)







		@classmethod
		def 					__A   ( cls		,      *A		,      **A	)  -> Union[str, Any]:







					'''simple docstring'''







					requires_backends(cls		,      ["""flax"""]	)







		@classmethod
		def 					__A   ( cls		,      *A		,      **A	)  -> Optional[int]:







					'''simple docstring'''







					requires_backends(cls		,      ["""flax"""]	)







class        __lowercase       (							metaclass=a_  ):



		"""simple docstring"""

		UpperCamelCase     :					str			       =		["flax"]







		def __init__( self		,      *A		,      **A	)  -> List[Any]:







					'''simple docstring'''







					requires_backends(self		,      ["""flax"""]	)







		@classmethod
		def 					__A   ( cls		,      *A		,      **A	)  -> Any:







					'''simple docstring'''







					requires_backends(cls		,      ["""flax"""]	)







		@classmethod
		def 					__A   ( cls		,      *A		,      **A	)  -> Union[str, Any]:







					'''simple docstring'''







					requires_backends(cls		,      ["""flax"""]	)







class        __lowercase       (							metaclass=a_  ):



		"""simple docstring"""

		UpperCamelCase     :					Dict			       =		["flax"]







		def __init__( self		,      *A		,      **A	)  -> Optional[Any]:







					'''simple docstring'''







					requires_backends(self		,      ["""flax"""]	)







		@classmethod
		def 					__A   ( cls		,      *A		,      **A	)  -> Optional[Any]:







					'''simple docstring'''







					requires_backends(cls		,      ["""flax"""]	)







		@classmethod
		def 					__A   ( cls		,      *A		,      **A	)  -> Any:







					'''simple docstring'''







					requires_backends(cls		,      ["""flax"""]	)







class        __lowercase       (							metaclass=a_  ):



		"""simple docstring"""

		UpperCamelCase     :					Optional[int]			       =		["flax"]







		def __init__( self		,      *A		,      **A	)  -> int:







					'''simple docstring'''







					requires_backends(self		,      ["""flax"""]	)







		@classmethod
		def 					__A   ( cls		,      *A		,      **A	)  -> int:







					'''simple docstring'''







					requires_backends(cls		,      ["""flax"""]	)







		@classmethod
		def 					__A   ( cls		,      *A		,      **A	)  -> str:







					'''simple docstring'''







					requires_backends(cls		,      ["""flax"""]	)







class        __lowercase       (							metaclass=a_  ):



		"""simple docstring"""

		UpperCamelCase     :					Union[str, Any]			       =		["flax"]







		def __init__( self		,      *A		,      **A	)  -> List[Any]:







					'''simple docstring'''







					requires_backends(self		,      ["""flax"""]	)







		@classmethod
		def 					__A   ( cls		,      *A		,      **A	)  -> Tuple:







					'''simple docstring'''







					requires_backends(cls		,      ["""flax"""]	)







		@classmethod
		def 					__A   ( cls		,      *A		,      **A	)  -> Optional[int]:







					'''simple docstring'''







					requires_backends(cls		,      ["""flax"""]	)







class        __lowercase       (							metaclass=a_  ):



		"""simple docstring"""

		UpperCamelCase     :					Optional[Any]			       =		["flax"]







		def __init__( self		,      *A		,      **A	)  -> Optional[Any]:







					'''simple docstring'''







					requires_backends(self		,      ["""flax"""]	)







		@classmethod
		def 					__A   ( cls		,      *A		,      **A	)  -> int:







					'''simple docstring'''







					requires_backends(cls		,      ["""flax"""]	)







		@classmethod
		def 					__A   ( cls		,      *A		,      **A	)  -> int:







					'''simple docstring'''







					requires_backends(cls		,      ["""flax"""]	)







class        __lowercase       (							metaclass=a_  ):



		"""simple docstring"""

		UpperCamelCase     :					Tuple			       =		["flax"]







		def __init__( self		,      *A		,      **A	)  -> str:







					'''simple docstring'''







					requires_backends(self		,      ["""flax"""]	)







		@classmethod
		def 					__A   ( cls		,      *A		,      **A	)  -> List[Any]:







					'''simple docstring'''







					requires_backends(cls		,      ["""flax"""]	)







		@classmethod
		def 					__A   ( cls		,      *A		,      **A	)  -> str:







					'''simple docstring'''







					requires_backends(cls		,      ["""flax"""]	)







class        __lowercase       (							metaclass=a_  ):



		"""simple docstring"""

		UpperCamelCase     :					Any			       =		["flax"]







		def __init__( self		,      *A		,      **A	)  -> List[str]:







					'''simple docstring'''







					requires_backends(self		,      ["""flax"""]	)







		@classmethod
		def 					__A   ( cls		,      *A		,      **A	)  -> int:







					'''simple docstring'''







					requires_backends(cls		,      ["""flax"""]	)







		@classmethod
		def 					__A   ( cls		,      *A		,      **A	)  -> str:







					'''simple docstring'''







					requires_backends(cls		,      ["""flax"""]	)







class        __lowercase       (							metaclass=a_  ):



		"""simple docstring"""

		UpperCamelCase     :					str			       =		["flax"]







		def __init__( self		,      *A		,      **A	)  -> Dict:







					'''simple docstring'''







					requires_backends(self		,      ["""flax"""]	)







		@classmethod
		def 					__A   ( cls		,      *A		,      **A	)  -> Optional[int]:







					'''simple docstring'''







					requires_backends(cls		,      ["""flax"""]	)







		@classmethod
		def 					__A   ( cls		,      *A		,      **A	)  -> Dict:







					'''simple docstring'''







					requires_backends(cls		,      ["""flax"""]	)







class        __lowercase       (							metaclass=a_  ):



		"""simple docstring"""

		UpperCamelCase     :					Optional[int]			       =		["flax"]







		def __init__( self		,      *A		,      **A	)  -> List[str]:







					'''simple docstring'''







					requires_backends(self		,      ["""flax"""]	)







		@classmethod
		def 					__A   ( cls		,      *A		,      **A	)  -> Any:







					'''simple docstring'''







					requires_backends(cls		,      ["""flax"""]	)







		@classmethod
		def 					__A   ( cls		,      *A		,      **A	)  -> Any:







					'''simple docstring'''







					requires_backends(cls		,      ["""flax"""]	)







class        __lowercase       (							metaclass=a_  ):



		"""simple docstring"""

		UpperCamelCase     :					Tuple			       =		["flax"]







		def __init__( self		,      *A		,      **A	)  -> str:







					'''simple docstring'''







					requires_backends(self		,      ["""flax"""]	)







		@classmethod
		def 					__A   ( cls		,      *A		,      **A	)  -> Dict:







					'''simple docstring'''







					requires_backends(cls		,      ["""flax"""]	)







		@classmethod
		def 					__A   ( cls		,      *A		,      **A	)  -> Union[str, Any]:







					'''simple docstring'''







					requires_backends(cls		,      ["""flax"""]	)

