
'''simple docstring'''



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


_lowercase          =						logging.get_logger(__name__)




class     UpperCAmelCase_	(						_SCREAMING_SNAKE_CASE					):






						'''simple docstring'''






						_lowercase						: List[str]										=  ['''input_values''', '''padding_mask''']




						def __init__(   self       ,  _lowercase = 1       ,  _lowercase = 24_000       ,  _lowercase = 0.0       ,  _lowercase = None       ,  _lowercase = None       ,  **_lowercase       ,  ):

												"""simple docstring"""



												super().__init__(feature_size=_lowercase       ,  sampling_rate=_lowercase       ,  padding_value=_lowercase       ,  **_lowercase )
												_lowerCAmelCase    		=					chunk_length_s
												_lowerCAmelCase    		=					overlap




						@property
						def    _lowercase      (   self ):

												"""simple docstring"""



												if self.chunk_length_s is None:
																		return None
												else:
																		return int(self.chunk_length_s * self.sampling_rate )




						@property
						def    _lowercase      (   self ):

												"""simple docstring"""



												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       ,  _lowercase       ,  _lowercase = None       ,  _lowercase = False       ,  _lowercase = None       ,  _lowercase = None       ,  _lowercase = None       ,  ):

												"""simple docstring"""



												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
																		_lowerCAmelCase    		=					True

												_lowerCAmelCase    		=					bool(
												    isinstance(_lowercase       ,  (list, tuple) ) and (isinstance(raw_audio[0]       ,  (np.ndarray, tuple, list) )) )

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

												# always return batch
												if not is_batched:
																		_lowerCAmelCase    		=					[np.asarray(_lowercase ).T]

												# verify inputs are valid
												for idx, example in enumerate(_lowercase ):
																		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' )

												_lowerCAmelCase    		=					None
												_lowerCAmelCase    		=					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:
																								_lowerCAmelCase    		=					min(array.shape[0] for array in raw_audio )
																								_lowerCAmelCase    		=					int(np.floor(max_length / self.chunk_stride ) )
																								_lowerCAmelCase    		=					(nb_step - 1) * self.chunk_stride + self.chunk_length
																		elif padding:
																								_lowerCAmelCase    		=					max(array.shape[0] for array in raw_audio )
																								_lowerCAmelCase    		=					int(np.ceil(max_length / self.chunk_stride ) )
																								_lowerCAmelCase    		=					(nb_step - 1) * self.chunk_stride + self.chunk_length
																								_lowerCAmelCase    		=					"""max_length"""
																		else:
																								_lowerCAmelCase    		=					input_values

        # normal padding on batch
												if padded_inputs is None:
																		_lowerCAmelCase    		=					self.pad(
																		    _lowercase       ,  max_length=_lowercase       ,  truncation=_lowercase       ,  padding=_lowercase       ,  return_attention_mask=_lowercase       ,  )
																		if padding:
																								_lowerCAmelCase    		=					padded_inputs.pop("""attention_mask""" )

												_lowerCAmelCase    		=					[]
												for example in padded_inputs.pop("""input_values""" ):
																		if self.feature_size == 1:
																								_lowerCAmelCase    		=					example[..., None]
																		input_values.append(example.T )

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

												return padded_inputs



# Copyright 2021 The HuggingFace Team. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import argparse

from ...utils.dataclasses import (
    ComputeEnvironment,
    DistributedType,
    DynamoBackend,
    PrecisionType,
    SageMakerDistributedType,
)
from ..menu import BulletMenu


a_     :    str     		=   [
    "EAGER",
    "AOT_EAGER",
    "INDUCTOR",
    "NVFUSER",
    "AOT_NVFUSER",
    "AOT_CUDAGRAPHS",
    "OFI",
    "FX2TRT",
    "ONNXRT",
    "IPEX",
]


def 							__lowerCAmelCase     (							_UpperCamelCase		:	int		,				_UpperCamelCase		:	List[Any]=None		,				_UpperCamelCase		:	Dict=None		,				_UpperCamelCase		:	str=None						)		->				Any:
 '''simple docstring'''


 SCREAMING_SNAKE_CASE		    =      True
 while ask_again:
  SCREAMING_SNAKE_CASE		    =      input(_UpperCamelCase						)
  try:
   if default is not None and len(_UpperCamelCase						) == 0:
    return default
   return convert_value(_UpperCamelCase						) if convert_value is not None else result
  except Exception:
   if error_message is not None:
    print(_UpperCamelCase						)


def 							__lowerCAmelCase     (							_UpperCamelCase		:	Optional[Any]		,				_UpperCamelCase		:	Union[str, Any]=[]		,				_UpperCamelCase		:	Optional[int]=None		,				_UpperCamelCase		:	Optional[Any]=0						)		->				List[Any]:
 '''simple docstring'''


 SCREAMING_SNAKE_CASE		    =      BulletMenu(_UpperCamelCase		,				_UpperCamelCase						)
 SCREAMING_SNAKE_CASE		    =      menu.run(default_choice=_UpperCamelCase						)
 return convert_value(_UpperCamelCase						) if convert_value is not None else result


def 							__lowerCAmelCase     (							_UpperCamelCase		:	List[str]						)		->				int:
 '''simple docstring'''


 SCREAMING_SNAKE_CASE		    =      int(_UpperCamelCase						)
 return ComputeEnvironment(['LOCAL_MACHINE', 'AMAZON_SAGEMAKER'][value]						)


def 							__lowerCAmelCase     (							_UpperCamelCase		:	Tuple						)		->				Tuple:
 '''simple docstring'''


 SCREAMING_SNAKE_CASE		    =      int(_UpperCamelCase						)
 return DistributedType(['NO', 'MULTI_CPU', 'MULTI_XPU', 'MULTI_GPU', 'MULTI_NPU', 'TPU'][value]						)


def 							__lowerCAmelCase     (							_UpperCamelCase		:	List[Any]						)		->				List[str]:
 '''simple docstring'''


 SCREAMING_SNAKE_CASE		    =      int(_UpperCamelCase						)
 return DynamoBackend(DYNAMO_BACKENDS[value]						).value


def 							__lowerCAmelCase     (							_UpperCamelCase		:	Union[str, Any]						)		->				Dict:
 '''simple docstring'''


 SCREAMING_SNAKE_CASE		    =      int(_UpperCamelCase						)
 return PrecisionType(['no', 'fp16', 'bf16', 'fp8'][value]						)


def 							__lowerCAmelCase     (							_UpperCamelCase		:	Tuple						)		->				str:
 '''simple docstring'''


 SCREAMING_SNAKE_CASE		    =      int(_UpperCamelCase						)
 return SageMakerDistributedType(['NO', 'DATA_PARALLEL', 'MODEL_PARALLEL'][value]						)


def 							__lowerCAmelCase     (							_UpperCamelCase		:	Dict						)		->				str:
 '''simple docstring'''


 return {"yes": True, "no": False}[value.lower()]




class   UpperCamelCase			(  argparse.RawDescriptionHelpFormatter ):

    def UpperCamelCase      (      self			:   Union[str, Any]				,     snake_case__			:   Tuple				,     snake_case__			:   Optional[Any]				,     snake_case__			:   List[str]				,     snake_case__			:   Dict     ):

     """simple docstring"""






     SCREAMING_SNAKE_CASE		    =      super()._format_usage(snake_case__				,     snake_case__				,     snake_case__				,     snake_case__     )
     SCREAMING_SNAKE_CASE		    =      usage.replace('<command> [<args>] '				,     ''     )
     return usage

