




from __future__ import annotations

import requests







def 			lowerCamelCase_		(       UpperCamelCase__				:      str      )     ->       dict:





				"""simple docstring"""


				__lowerCamelCase		       =    F"""https://hacker-news.firebaseio.com/v0/item/{story_id}.json?print=pretty"""
				return requests.get(UpperCamelCase__      ).json()







def 			lowerCamelCase_		(       UpperCamelCase__				:      int = 10      )     ->       list[dict]:





				"""simple docstring"""


				__lowerCamelCase		       =    'https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty'
				__lowerCamelCase		       =    requests.get(UpperCamelCase__      ).json()[:max_stories]
				return [get_hackernews_story(UpperCamelCase__      ) for story_id in story_ids]







def 			lowerCamelCase_		(       UpperCamelCase__				:      int = 10      )     ->       str:





				"""simple docstring"""


				__lowerCamelCase		       =    hackernews_top_stories(UpperCamelCase__      )
				return "\n".join('* [{title}]({url})'.format(**UpperCamelCase__      ) for story in stories      )


if __name__ == "__main__":
					print(hackernews_top_stories_as_markdown())








import copy
from typing import Any, Dict, List, Optional, Union

import numpy as np
import torch

from ...audio_utils import mel_filter_bank, spectrogram, window_function
from ...feature_extraction_sequence_utils import SequenceFeatureExtractor
from ...feature_extraction_utils import BatchFeature
from ...utils import TensorType, logging


__A        =    logging.get_logger(__name__)







class     __lowerCAmelCase (       __magic_name__ ):

			"""simple docstring"""







			snake_case_   		=       ['''input_features''', '''is_longer''']


			def __init__(      self			,						lowerCamelCase__=64			,						lowerCamelCase__=48_000			,						lowerCamelCase__=480			,						lowerCamelCase__=10			,						lowerCamelCase__=1_024			,						lowerCamelCase__=0.0			,						lowerCamelCase__=False			,						lowerCamelCase__ = 0			,						lowerCamelCase__ = 14_000			,						lowerCamelCase__ = None			,						lowerCamelCase__ = "fusion"			,						lowerCamelCase__ = "repeatpad"			,						**lowerCamelCase__			,						)    ->      Tuple:



							'''simple docstring'''
							super().__init__(
							    feature_size=lowerCamelCase__			,						sampling_rate=lowerCamelCase__			,						padding_value=lowerCamelCase__			,						return_attention_mask=lowerCamelCase__			,						**lowerCamelCase__			,						)
							__lowerCamelCase		       =    top_db
							__lowerCamelCase		       =    truncation
							__lowerCamelCase		       =    padding
							__lowerCamelCase		       =    fft_window_size
							__lowerCamelCase		       =    (fft_window_size >> 1) + 1
							__lowerCamelCase		       =    hop_length
							__lowerCamelCase		       =    max_length_s
							__lowerCamelCase		       =    max_length_s * sampling_rate
							__lowerCamelCase		       =    sampling_rate
							__lowerCamelCase		       =    frequency_min
							__lowerCamelCase		       =    frequency_max
							__lowerCamelCase		       =    mel_filter_bank(
							    num_frequency_bins=self.nb_frequency_bins			,						num_mel_filters=lowerCamelCase__			,						min_frequency=lowerCamelCase__			,						max_frequency=lowerCamelCase__			,						sampling_rate=lowerCamelCase__			,						norm=lowerCamelCase__			,						mel_scale='htk'			,						)
							__lowerCamelCase		       =    mel_filter_bank(
							    num_frequency_bins=self.nb_frequency_bins			,						num_mel_filters=lowerCamelCase__			,						min_frequency=lowerCamelCase__			,						max_frequency=lowerCamelCase__			,						sampling_rate=lowerCamelCase__			,						norm='slaney'			,						mel_scale='slaney'			,						)


			def       lowercase_    (      self							)    ->      Dict[str, Any]:



							'''simple docstring'''
							__lowerCamelCase		       =    copy.deepcopy(self.__dict__							)
							__lowerCamelCase		       =    self.__class__.__name__
							if "mel_filters" in output:
											del output["mel_filters"]
							if "mel_filters_slaney" in output:
											del output["mel_filters_slaney"]
							return output


			def       lowercase_    (      self			,						lowerCamelCase__			,						lowerCamelCase__ = None							)    ->      np.ndarray:



							'''simple docstring'''
							__lowerCamelCase		       =    spectrogram(
							    lowerCamelCase__			,						window_function(self.fft_window_size			,						'hann'							)			,						frame_length=self.fft_window_size			,						hop_length=self.hop_length			,						power=2.0			,						mel_filters=lowerCamelCase__			,						log_mel='dB'			,						)
							return log_mel_spectrogram.T


			def       lowercase_    (      self			,						lowerCamelCase__			,						lowerCamelCase__			,						lowerCamelCase__							)    ->      int:



							'''simple docstring'''
							__lowerCamelCase		       =    np.array_split(list(range(0			,						total_frames - chunk_frames + 1							)							)			,						3							)
							if len(ranges[1]							) == 0:
											# if the audio is too short, we just use the first chunk
											__lowerCamelCase		       =    [0]
							if len(ranges[2]							) == 0:
											# if the audio is too short, we just use the first chunk
											__lowerCamelCase		       =    [0]
							# randomly choose index for each part
							__lowerCamelCase		       =    np.random.choice(ranges[0]							)
							__lowerCamelCase		       =    np.random.choice(ranges[1]							)
							__lowerCamelCase		       =    np.random.choice(ranges[2]							)

							__lowerCamelCase		       =    mel[idx_front : idx_front + chunk_frames, :]
							__lowerCamelCase		       =    mel[idx_middle : idx_middle + chunk_frames, :]
							__lowerCamelCase		       =    mel[idx_back : idx_back + chunk_frames, :]

							__lowerCamelCase		       =    torch.tensor(mel[None, None, :]							)
							__lowerCamelCase		       =    torch.nn.functional.interpolate(
							    lowerCamelCase__			,						size=[chunk_frames, 64]			,						mode='bilinear'			,						align_corners=lowerCamelCase__							)
							__lowerCamelCase		       =    mel_shrink[0][0].numpy()
							__lowerCamelCase		       =    np.stack([mel_shrink, mel_chunk_front, mel_chunk_middle, mel_chunk_back]			,						axis=0							)
							return mel_fusion


			def       lowercase_    (      self			,						lowerCamelCase__			,						lowerCamelCase__			,						lowerCamelCase__			,						lowerCamelCase__							)    ->      np.array:



							'''simple docstring'''
							if waveform.shape[0] > max_length:
											if truncation == "rand_trunc":
															__lowerCamelCase		       =    True
															# random crop to max_length (for compatibility) -> this should be handled by self.pad
															__lowerCamelCase		       =    len(lowerCamelCase__							) - max_length
															__lowerCamelCase		       =    np.random.randint(0			,						overflow + 1							)
															__lowerCamelCase		       =    waveform[idx : idx + max_length]
															__lowerCamelCase		       =    self._np_extract_fbank_features(lowerCamelCase__			,						self.mel_filters_slaney							)[None, :]
											elif truncation == "fusion":
															__lowerCamelCase		       =    self._np_extract_fbank_features(lowerCamelCase__			,						self.mel_filters							)
															__lowerCamelCase		       =    max_length // self.hop_length + 1  # the +1 related to how the spectrogram is computed
															__lowerCamelCase		       =    mel.shape[0]
															if chunk_frames == total_frames:
																			# there is a corner case where the audio length is larger than max_length but smaller than max_length+hop_length.
																			# In this case, we just use the whole audio.
																			__lowerCamelCase		       =    np.stack([mel, mel, mel, mel]			,						axis=0							)
																			__lowerCamelCase		       =    False
															else:
																			__lowerCamelCase		       =    self._random_mel_fusion(lowerCamelCase__			,						lowerCamelCase__			,						lowerCamelCase__							)
																			__lowerCamelCase		       =    True
											else:
															raise NotImplementedError(f"""data_truncating {truncation} not implemented"""							)

							else:
											__lowerCamelCase		       =    False
											# only use repeat as a new possible value for padding. you repeat the audio before applying the usual max_length padding
											if waveform.shape[0] < max_length:
															if padding == "repeat":
																			__lowerCamelCase		       =    int(max_length / len(lowerCamelCase__							)							)
																			__lowerCamelCase		       =    np.stack(np.tile(lowerCamelCase__			,						n_repeat + 1							)							)[:max_length]
															if padding == "repeatpad":
																			__lowerCamelCase		       =    int(max_length / len(lowerCamelCase__							)							)
																			__lowerCamelCase		       =    np.stack(np.tile(lowerCamelCase__			,						lowerCamelCase__							)							)
															__lowerCamelCase		       =    np.pad(lowerCamelCase__			,						(0, max_length - waveform.shape[0])			,						mode='constant'			,						constant_values=0							)

											if truncation == "fusion":
															__lowerCamelCase		       =    self._np_extract_fbank_features(lowerCamelCase__			,						self.mel_filters							)
															__lowerCamelCase		       =    np.stack([input_mel, input_mel, input_mel, input_mel]			,						axis=0							)
											else:
															__lowerCamelCase		       =    self._np_extract_fbank_features(lowerCamelCase__			,						self.mel_filters_slaney							)[None, :]

							return input_mel, longer






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



							'''simple docstring'''
							__lowerCamelCase		       =    truncation if truncation is not None else self.truncation
							__lowerCamelCase		       =    padding if padding else self.padding

							if sampling_rate is not None:
											if sampling_rate != self.sampling_rate:
															raise ValueError(
															    f"""The model corresponding to this feature extractor: {self.__class__.__name__} was trained using a"""
															    f""" sampling rate of {self.sampling_rate}. Please make sure that the provided `raw_speech` input"""
															    f""" was sampled with {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		       =    [np.asarray(lowerCamelCase__							)]

							# convert to mel spectrogram, truncate and pad if needed.
							__lowerCamelCase		       =    [
							    self._get_input_mel(lowerCamelCase__			,						max_length if max_length else self.nb_max_samples			,						lowerCamelCase__			,						lowerCamelCase__							)
							    for waveform in raw_speech
							]

							__lowerCamelCase		       =    []
							__lowerCamelCase		       =    []
							for mel, longer in padded_inputs:
											input_mel.append(lowerCamelCase__							)
											is_longer.append(lowerCamelCase__							)

							if truncation == "fusion" and sum(lowerCamelCase__							) == 0:
											# if no audio is longer than 10s, then randomly select one audio to be longer
											__lowerCamelCase		       =    np.random.randint(0			,						len(lowerCamelCase__							)							)
											__lowerCamelCase		       =    True

							if isinstance(input_mel[0]			,						lowerCamelCase__							):
											__lowerCamelCase		       =    [np.asarray(lowerCamelCase__			,						dtype=np.floataa							) for feature in input_mel]

							# is_longer is a list of bool
							__lowerCamelCase		       =    [[longer] for longer in is_longer]

							__lowerCamelCase		       =    {'input_features': input_mel, 'is_longer': is_longer}
							__lowerCamelCase		       =    BatchFeature(lowerCamelCase__							)

							if return_tensors is not None:
											__lowerCamelCase		       =    input_features.convert_to_tensors(lowerCamelCase__							)

							return input_features


