
'''simple docstring'''




import absl  # noqa: F401 # Here to have a nice missing dependency error message early on
import nltk  # noqa: F401 # Here to have a nice missing dependency error message early on
import numpy  # noqa: F401 # Here to have a nice missing dependency error message early on
import six  # noqa: F401 # Here to have a nice missing dependency error message early on
from rouge_score import rouge_scorer, scoring

import datasets


lowercase			:				Any    		=			'\\n@inproceedings{lin-2004-rouge,\n    title = "{ROUGE}: A Package for Automatic Evaluation of Summaries",\n    author = "Lin, Chin-Yew",\n    booktitle = "Text Summarization Branches Out",\n    month = jul,\n    year = "2004",\n    address = "Barcelona, Spain",\n    publisher = "Association for Computational Linguistics",\n    url = "https://www.aclweb.org/anthology/W04-1013",\n    pages = "74--81",\n}\n'

lowercase			:				Any    		=			'\\nROUGE, or Recall-Oriented Understudy for Gisting Evaluation, is a set of metrics and a software package used for\nevaluating automatic summarization and machine translation software in natural language processing.\nThe metrics compare an automatically produced summary or translation against a reference or a set of references (human-produced) summary or translation.\n\nNote that ROUGE is case insensitive, meaning that upper case letters are treated the same way as lower case letters.\n\nThis metrics is a wrapper around Google Research reimplementation of ROUGE:\nhttps://github.com/google-research/google-research/tree/master/rouge\n'

lowercase			:				List[Any]    		=			'\nCalculates average rouge scores for a list of hypotheses and references\nArgs:\n    predictions: list of predictions to score. Each prediction\n        should be a string with tokens separated by spaces.\n    references: list of reference for each prediction. Each\n        reference should be a string with tokens separated by spaces.\n    rouge_types: A list of rouge types to calculate.\n        Valid names:\n        `"rouge{n}"` (e.g. `"rouge1"`, `"rouge2"`) where: {n} is the n-gram based scoring,\n        `"rougeL"`: Longest common subsequence based scoring.\n        `"rougeLSum"`: rougeLsum splits text using `"\n"`.\n        See details in https://github.com/huggingface/datasets/issues/617\n    use_stemmer: Bool indicating whether Porter stemmer should be used to strip word suffixes.\n    use_aggregator: Return aggregates if this is set to True\nReturns:\n    rouge1: rouge_1 (precision, recall, f1),\n    rouge2: rouge_2 (precision, recall, f1),\n    rougeL: rouge_l (precision, recall, f1),\n    rougeLsum: rouge_lsum (precision, recall, f1)\nExamples:\n\n    >>> rouge = datasets.load_metric(\'rouge\')\n    >>> predictions = ["hello there", "general kenobi"]\n    >>> references = ["hello there", "general kenobi"]\n    >>> results = rouge.compute(predictions=predictions, references=references)\n    >>> print(list(results.keys()))\n    [\'rouge1\', \'rouge2\', \'rougeL\', \'rougeLsum\']\n    >>> print(results["rouge1"])\n    AggregateScore(low=Score(precision=1.0, recall=1.0, fmeasure=1.0), mid=Score(precision=1.0, recall=1.0, fmeasure=1.0), high=Score(precision=1.0, recall=1.0, fmeasure=1.0))\n    >>> print(results["rouge1"].mid.fmeasure)\n    1.0\n'





@datasets.utils.file_utils.add_start_docstrings(_DESCRIPTION    ,			_KWARGS_DESCRIPTION						)
class  A				(							datasets.Metric						):





     def 				__lowerCAmelCase							(							self	) ->				Dict:






         """simple docstring"""






         return datasets.MetricInfo(
             description=_DESCRIPTION						,			citation=_CITATION						,			inputs_description=_KWARGS_DESCRIPTION						,			features=datasets.Features(
                 {
                     '''predictions''': datasets.Value('''string'''						,			id='''sequence'''	),
                     '''references''': datasets.Value('''string'''						,			id='''sequence'''	),
                 }	)						,			codebase_urls=['''https://github.com/google-research/google-research/tree/master/rouge''']						,			reference_urls=[
                 '''https://en.wikipedia.org/wiki/ROUGE_(metric)''',
                 '''https://github.com/google-research/google-research/tree/master/rouge''',
             ]						,			)





     def 				__lowerCAmelCase							(							self						,			SCREAMING_SNAKE_CASE						,			SCREAMING_SNAKE_CASE						,			SCREAMING_SNAKE_CASE=None						,			SCREAMING_SNAKE_CASE=True						,			SCREAMING_SNAKE_CASE=False	) ->				List[str]:






         """simple docstring"""






         if rouge_types is None:
             A       :   Union[str, Any]					=						['''rouge1''', '''rouge2''', '''rougeL''', '''rougeLsum''']

         A       :   Any					=						rouge_scorer.RougeScorer(rouge_types=SCREAMING_SNAKE_CASE						,			use_stemmer=SCREAMING_SNAKE_CASE	)
         if use_aggregator:
             A       :   List[str]					=						scoring.BootstrapAggregator()
         else:
             A       :   Any					=						[]

         for ref, pred in zip(SCREAMING_SNAKE_CASE						,			SCREAMING_SNAKE_CASE	):
             A       :   List[str]					=						scorer.score(SCREAMING_SNAKE_CASE						,			SCREAMING_SNAKE_CASE	)
             if use_aggregator:
                 aggregator.add_scores(SCREAMING_SNAKE_CASE	)
             else:
                 scores.append(SCREAMING_SNAKE_CASE	)

         if use_aggregator:
             A       :   int					=						aggregator.aggregate()
         else:
             A       :   List[str]					=						{}
             for key in scores[0]:
                 A       :   Optional[Any]					=						[score[key] for score in scores]

         return result






'''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


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





class  A				(							__snake_case						):
     __magic_name__						=		['''input_features''', '''attention_mask''']





     def __init__(							self						,			SCREAMING_SNAKE_CASE=80						,			SCREAMING_SNAKE_CASE=16000						,			SCREAMING_SNAKE_CASE=80						,			SCREAMING_SNAKE_CASE=0.0						,			SCREAMING_SNAKE_CASE=True						,			SCREAMING_SNAKE_CASE=True						,			SCREAMING_SNAKE_CASE=True						,			**SCREAMING_SNAKE_CASE						,			) ->				int:






         """simple docstring"""






         super().__init__(feature_size=SCREAMING_SNAKE_CASE						,			sampling_rate=SCREAMING_SNAKE_CASE						,			padding_value=SCREAMING_SNAKE_CASE						,			**SCREAMING_SNAKE_CASE	)
         A       :   Optional[int]					=						num_mel_bins
         A       :   Tuple					=						do_ceptral_normalize
         A       :   Dict					=						normalize_means
         A       :   List[Any]					=						normalize_vars
         A       :   List[str]					=						True





     def 				__lowerCAmelCase							(							self						,			SCREAMING_SNAKE_CASE						,			) ->				np.ndarray:






         """simple docstring"""






         A       :   List[Any]					=						waveform * (2**15)  # Kaldi compliance: 16-bit signed integers
         A       :   Any					=						torch.from_numpy(SCREAMING_SNAKE_CASE	).unsqueeze(0	)
         A       :   Any					=						ta_kaldi.fbank(SCREAMING_SNAKE_CASE						,			num_mel_bins=self.num_mel_bins						,			sample_frequency=self.sampling_rate	)
         return features.numpy()





     @staticmethod
     def 				__lowerCAmelCase							(							SCREAMING_SNAKE_CASE						,			SCREAMING_SNAKE_CASE						,			SCREAMING_SNAKE_CASE = True						,			SCREAMING_SNAKE_CASE = True						,			SCREAMING_SNAKE_CASE = 0.0						,			) ->				np.ndarray:






         """simple docstring"""






         if normalize_means:
             A       :   Dict					=						x[:input_length].mean(axis=0	)
             A       :   Optional[Any]					=						np.subtract(SCREAMING_SNAKE_CASE						,			SCREAMING_SNAKE_CASE	)
         if normalize_vars:
             A       :   str					=						x[:input_length].std(axis=0	)
             A       :   int					=						np.divide(SCREAMING_SNAKE_CASE						,			SCREAMING_SNAKE_CASE	)

         if input_length < x.shape[0]:
             A       :   List[str]					=						padding_value

         # make sure array is in float32
         A       :   Tuple					=						x.astype(np.floataa	)

         return x





     def 				__lowerCAmelCase							(							self						,			SCREAMING_SNAKE_CASE						,			SCREAMING_SNAKE_CASE = None	) ->				List[np.ndarray]:






         """simple docstring"""






         A       :   List[Any]					=						attention_mask.sum(-1	) if attention_mask is not None else [x.shape[0] for x in input_features]
         return [
             self.utterance_cmvn(SCREAMING_SNAKE_CASE						,			SCREAMING_SNAKE_CASE						,			self.normalize_means						,			self.normalize_vars						,			self.padding_value	)
             for x, n in zip(SCREAMING_SNAKE_CASE						,			SCREAMING_SNAKE_CASE	)
         ]





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






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

         A       :   List[Any]					=						isinstance(SCREAMING_SNAKE_CASE						,			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}'	)
         A       :   Tuple					=						is_batched_numpy or (
             isinstance(SCREAMING_SNAKE_CASE						,			(list, tuple)	) and (isinstance(raw_speech[0]						,			(np.ndarray, tuple, list)	))
         )

         if is_batched:
             A       :   Union[str, Any]					=						[np.asarray(SCREAMING_SNAKE_CASE						,			dtype=np.floataa	) for speech in raw_speech]
         elif not is_batched and not isinstance(SCREAMING_SNAKE_CASE						,			np.ndarray	):
             A       :   Union[str, Any]					=						np.asarray(SCREAMING_SNAKE_CASE						,			dtype=np.floataa	)
         elif isinstance(SCREAMING_SNAKE_CASE						,			np.ndarray	) and raw_speech.dtype is np.dtype(np.floataa	):
             A       :   Optional[int]					=						raw_speech.astype(np.floataa	)

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

         # extract fbank features
         A       :   List[str]					=						[self._extract_fbank_features(SCREAMING_SNAKE_CASE	) for waveform in raw_speech]

         # convert into correct format for padding
         A       :   str					=						BatchFeature({'''input_features''': features}	)

         A       :   Union[str, Any]					=						self.pad(
             SCREAMING_SNAKE_CASE						,			padding=SCREAMING_SNAKE_CASE						,			max_length=SCREAMING_SNAKE_CASE						,			truncation=SCREAMING_SNAKE_CASE						,			pad_to_multiple_of=SCREAMING_SNAKE_CASE						,			return_attention_mask=SCREAMING_SNAKE_CASE						,			**SCREAMING_SNAKE_CASE						,			)

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

         A       :   Union[str, Any]					=						padded_inputs.get('''attention_mask'''	)
         if attention_mask is not None:
             A       :   Union[str, Any]					=						[np.asarray(SCREAMING_SNAKE_CASE						,			dtype=np.intaa	) for array in attention_mask]

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

         if return_tensors is not None:
             A       :   int					=						padded_inputs.convert_to_tensors(SCREAMING_SNAKE_CASE	)

         return padded_inputs




