From 20548d47db6bd1f411641cb1e0b59e42bce582ae Mon Sep 17 00:00:00 2001 From: Kevin Guevara Date: Tue, 14 Jan 2025 15:19:07 -0500 Subject: [PATCH] fix: speech to text async fix --- scope3ai/tracers/huggingface/instrument.py | 6 + .../tracers/huggingface/speech_to_text.py | 25 +- .../test_huggingface_hub_speech_to_text.yaml | 769 ++++++++++++++++- ..._huggingface_hub_speech_to_text_async.yaml | 801 ++++++++++++++++++ tests/test_huggingface_tracer.py | 27 +- 5 files changed, 1602 insertions(+), 26 deletions(-) create mode 100644 tests/cassettes/test_huggingface_hub_speech_to_text_async.yaml diff --git a/scope3ai/tracers/huggingface/instrument.py b/scope3ai/tracers/huggingface/instrument.py index df26048..84e42cd 100644 --- a/scope3ai/tracers/huggingface/instrument.py +++ b/scope3ai/tracers/huggingface/instrument.py @@ -10,6 +10,7 @@ ) from scope3ai.tracers.huggingface.speech_to_text import ( huggingface_automatic_recognition_output_wrapper, + huggingface_automatic_recognition_output_wrapper_async, ) from scope3ai.tracers.huggingface.text_to_image import ( huggingface_text_to_image_wrapper, @@ -75,6 +76,11 @@ def __init__(self) -> None: "name": "InferenceClient.automatic_speech_recognition", "wrapper": huggingface_automatic_recognition_output_wrapper, }, + { + "module": "huggingface_hub.inference._generated._async_client", + "name": "AsyncInferenceClient.automatic_speech_recognition", + "wrapper": huggingface_automatic_recognition_output_wrapper_async, + }, { "module": "huggingface_hub.inference._generated._async_client", "name": "AsyncInferenceClient.chat_completion", diff --git a/scope3ai/tracers/huggingface/speech_to_text.py b/scope3ai/tracers/huggingface/speech_to_text.py index c726b5a..11952c5 100644 --- a/scope3ai/tracers/huggingface/speech_to_text.py +++ b/scope3ai/tracers/huggingface/speech_to_text.py @@ -5,6 +5,7 @@ from aiohttp import ClientResponse from huggingface_hub import ( AutomaticSpeechRecognitionOutput as _AutomaticSpeechRecognitionOutput, + AsyncInferenceClient, ) from huggingface_hub import InferenceClient # type: ignore[import-untyped] from requests import Response @@ -13,6 +14,7 @@ from scope3ai.api.typesgen import Task from scope3ai.constants import PROVIDERS from scope3ai.lib import Scope3AI +from scope3ai.response_interceptor.aiohttp_interceptor import aiohttp_response_capture from scope3ai.response_interceptor.requests_interceptor import requests_response_capture PROVIDER = PROVIDERS.HUGGINGFACE_HUB.value @@ -32,13 +34,14 @@ def _hugging_face_automatic_recognition_wrapper( args: Any, kwargs: Any, ) -> AutomaticSpeechRecognitionOutput: + compute_audio_length = None if http_response: compute_audio_length = http_response.headers.get("x-compute-audio-length") compute_time = http_response.headers.get("x-compute-time") else: - compute_audio_length = 0 compute_time = time.perf_counter() - timer_start - + if not compute_audio_length: + compute_audio_length = 0 scope3_row = ImpactRow( model=Model(id=model), task=Task.text_to_speech, @@ -69,3 +72,21 @@ def huggingface_automatic_recognition_output_wrapper( return _hugging_face_automatic_recognition_wrapper( timer_start, model, response, http_response, args, kwargs ) + + +async def huggingface_automatic_recognition_output_wrapper_async( + wrapped: Callable, instance: AsyncInferenceClient, args: Any, kwargs: Any +) -> AutomaticSpeechRecognitionOutput: + timer_start = time.perf_counter() + http_response: ClientResponse | None = None + with aiohttp_response_capture() as responses: + response = await wrapped(*args, **kwargs) + http_responses = responses.get() + if len(http_responses) > 0: + http_response = http_responses[-1] + model = kwargs.get("model") or instance.get_recommended_model( + HUGGING_FACE_SPEECH_TO_TEXT_TASK + ) + return _hugging_face_automatic_recognition_wrapper( + timer_start, model, response, http_response, args, kwargs + ) diff --git a/tests/cassettes/test_huggingface_hub_speech_to_text.yaml b/tests/cassettes/test_huggingface_hub_speech_to_text.yaml index 6d45e36..7ad5f40 100644 --- a/tests/cassettes/test_huggingface_hub_speech_to_text.yaml +++ b/tests/cassettes/test_huggingface_hub_speech_to_text.yaml @@ -1,4 +1,751 @@ interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + X-Amzn-Trace-Id: + - 964b3b38-f229-4b27-8441-35ae7f273c74 + authorization: + - DUMMY + user-agent: + - unknown/None; hf_hub/0.26.5; python/3.12.8 + method: GET + uri: https://huggingface.co/api/tasks + response: + body: + string: "{\"any-to-any\":{\"datasets\":[],\"demo\":{\"inputs\":[],\"outputs\":[]},\"isPlaceholder\":true,\"metrics\":[],\"models\":[],\"spaces\":[],\"summary\":\"\",\"widgetModels\":[],\"id\":\"any-to-any\",\"label\":\"Any-to-Any\",\"libraries\":[\"transformers\"]},\"audio-classification\":{\"datasets\":[{\"description\":\"A + benchmark of 10 different audio tasks.\",\"id\":\"s3prl/superb\"},{\"description\":\"A + dataset of YouTube clips and their sound categories.\",\"id\":\"agkphysics/AudioSet\"}],\"demo\":{\"inputs\":[{\"filename\":\"audio.wav\",\"type\":\"audio\"}],\"outputs\":[{\"data\":[{\"label\":\"Up\",\"score\":0.2},{\"label\":\"Down\",\"score\":0.8}],\"type\":\"chart\"}]},\"metrics\":[{\"description\":\"\",\"id\":\"accuracy\"},{\"description\":\"\",\"id\":\"recall\"},{\"description\":\"\",\"id\":\"precision\"},{\"description\":\"\",\"id\":\"f1\"}],\"models\":[{\"description\":\"An + easy-to-use model for command recognition.\",\"id\":\"speechbrain/google_speech_command_xvector\"},{\"description\":\"An + emotion recognition model.\",\"id\":\"ehcalabres/wav2vec2-lg-xlsr-en-speech-emotion-recognition\"},{\"description\":\"A + language identification model.\",\"id\":\"facebook/mms-lid-126\"}],\"spaces\":[{\"description\":\"An + application that can classify music into different genre.\",\"id\":\"kurianbenoy/audioclassification\"}],\"summary\":\"Audio + classification is the task of assigning a label or class to a given audio. + It can be used for recognizing which command a user is giving or the emotion + of a statement, as well as identifying a speaker.\",\"widgetModels\":[\"MIT/ast-finetuned-audioset-10-10-0.4593\"],\"youtubeId\":\"KWwzcmG98Ds\",\"id\":\"audio-classification\",\"label\":\"Audio + Classification\",\"libraries\":[\"speechbrain\",\"transformers\",\"transformers.js\"]},\"audio-to-audio\":{\"datasets\":[{\"description\":\"512-element + X-vector embeddings of speakers from CMU ARCTIC dataset.\",\"id\":\"Matthijs/cmu-arctic-xvectors\"}],\"demo\":{\"inputs\":[{\"filename\":\"input.wav\",\"type\":\"audio\"}],\"outputs\":[{\"filename\":\"label-0.wav\",\"type\":\"audio\"},{\"filename\":\"label-1.wav\",\"type\":\"audio\"}]},\"metrics\":[{\"description\":\"The + Signal-to-Noise ratio is the relationship between the target signal level + and the background noise level. It is calculated as the logarithm of the target + signal divided by the background noise, in decibels.\",\"id\":\"snri\"},{\"description\":\"The + Signal-to-Distortion ratio is the relationship between the target signal and + the sum of noise, interference, and artifact errors\",\"id\":\"sdri\"}],\"models\":[{\"description\":\"A + solid model of audio source separation.\",\"id\":\"speechbrain/sepformer-wham\"},{\"description\":\"A + speech enhancement model.\",\"id\":\"ResembleAI/resemble-enhance\"},{\"description\":\"A + model that can change the voice in a speech recording.\",\"id\":\"microsoft/speecht5_vc\"}],\"spaces\":[{\"description\":\"An + application for speech separation.\",\"id\":\"younver/speechbrain-speech-separation\"},{\"description\":\"An + application for audio style transfer.\",\"id\":\"nakas/audio-diffusion_style_transfer\"}],\"summary\":\"Audio-to-Audio + is a family of tasks in which the input is an audio and the output is one + or multiple generated audios. Some example tasks are speech enhancement and + source separation.\",\"widgetModels\":[\"speechbrain/sepformer-wham\"],\"youtubeId\":\"iohj7nCCYoM\",\"id\":\"audio-to-audio\",\"label\":\"Audio-to-Audio\",\"libraries\":[\"asteroid\",\"fairseq\",\"speechbrain\"]},\"audio-text-to-text\":{\"datasets\":[],\"demo\":{\"inputs\":[],\"outputs\":[]},\"isPlaceholder\":true,\"metrics\":[],\"models\":[],\"spaces\":[],\"summary\":\"\",\"widgetModels\":[],\"id\":\"audio-text-to-text\",\"label\":\"Audio-Text-to-Text\",\"libraries\":[]},\"automatic-speech-recognition\":{\"datasets\":[{\"description\":\"31,175 + hours of multilingual audio-text dataset in 108 languages.\",\"id\":\"mozilla-foundation/common_voice_17_0\"},{\"description\":\"Multilingual + and diverse audio dataset with 101k hours of audio.\",\"id\":\"amphion/Emilia-Dataset\"},{\"description\":\"A + dataset with 44.6k hours of English speaker data and 6k hours of other language + speakers.\",\"id\":\"parler-tts/mls_eng\"},{\"description\":\"A multilingual + audio dataset with 370K hours of audio.\",\"id\":\"espnet/yodas\"}],\"demo\":{\"inputs\":[{\"filename\":\"input.flac\",\"type\":\"audio\"}],\"outputs\":[{\"label\":\"Transcript\",\"content\":\"Going + along slushy country roads and speaking to damp audiences in...\",\"type\":\"text\"}]},\"metrics\":[{\"description\":\"\",\"id\":\"wer\"},{\"description\":\"\",\"id\":\"cer\"}],\"models\":[{\"description\":\"A + powerful ASR model by OpenAI.\",\"id\":\"openai/whisper-large-v3\"},{\"description\":\"A + good generic speech model by MetaAI for fine-tuning.\",\"id\":\"facebook/w2v-bert-2.0\"},{\"description\":\"An + end-to-end model that performs ASR and Speech Translation by MetaAI.\",\"id\":\"facebook/seamless-m4t-v2-large\"},{\"description\":\"A + powerful multilingual ASR and Speech Translation model by Nvidia.\",\"id\":\"nvidia/canary-1b\"},{\"description\":\"Powerful + speaker diarization model.\",\"id\":\"pyannote/speaker-diarization-3.1\"}],\"spaces\":[{\"description\":\"A + powerful general-purpose speech recognition application.\",\"id\":\"hf-audio/whisper-large-v3\"},{\"description\":\"Latest + ASR model from Useful Sensors.\",\"id\":\"mrfakename/Moonshinex\"},{\"description\":\"A + high quality speech and text translation model by Meta.\",\"id\":\"facebook/seamless_m4t\"},{\"description\":\"A + powerful multilingual ASR and Speech Translation model by Nvidia\",\"id\":\"nvidia/canary-1b\"}],\"summary\":\"Automatic + Speech Recognition (ASR), also known as Speech to Text (STT), is the task + of transcribing a given audio to text. It has many applications, such as voice + user interfaces.\",\"widgetModels\":[\"openai/whisper-large-v3\"],\"youtubeId\":\"TksaY_FDgnk\",\"id\":\"automatic-speech-recognition\",\"label\":\"Automatic + Speech Recognition\",\"libraries\":[\"espnet\",\"nemo\",\"speechbrain\",\"transformers\",\"transformers.js\"]},\"depth-estimation\":{\"datasets\":[{\"description\":\"NYU + Depth V2 Dataset: Video dataset containing both RGB and depth sensor data.\",\"id\":\"sayakpaul/nyu_depth_v2\"},{\"description\":\"Monocular + depth estimation benchmark based without noise and errors.\",\"id\":\"depth-anything/DA-2K\"}],\"demo\":{\"inputs\":[{\"filename\":\"depth-estimation-input.jpg\",\"type\":\"img\"}],\"outputs\":[{\"filename\":\"depth-estimation-output.png\",\"type\":\"img\"}]},\"metrics\":[],\"models\":[{\"description\":\"Cutting-edge + depth estimation model.\",\"id\":\"depth-anything/Depth-Anything-V2-Large\"},{\"description\":\"A + strong monocular depth estimation model.\",\"id\":\"jingheya/lotus-depth-g-v1-0\"},{\"description\":\"A + depth estimation model that predicts depth in videos.\",\"id\":\"tencent/DepthCrafter\"},{\"description\":\"A + robust depth estimation model.\",\"id\":\"apple/DepthPro\"}],\"spaces\":[{\"description\":\"An + application that predicts the depth of an image and then reconstruct the 3D + model as voxels.\",\"id\":\"radames/dpt-depth-estimation-3d-voxels\"},{\"description\":\"An + application for bleeding-edge depth estimation.\",\"id\":\"akhaliq/depth-pro\"},{\"description\":\"An + application on cutting-edge depth estimation in videos.\",\"id\":\"tencent/DepthCrafter\"},{\"description\":\"A + human-centric depth estimation application.\",\"id\":\"facebook/sapiens-depth\"}],\"summary\":\"Depth + estimation is the task of predicting depth of the objects present in an image.\",\"widgetModels\":[\"\"],\"youtubeId\":\"\",\"id\":\"depth-estimation\",\"label\":\"Depth + Estimation\",\"libraries\":[\"transformers\",\"transformers.js\"]},\"document-question-answering\":{\"datasets\":[{\"description\":\"Largest + document understanding dataset.\",\"id\":\"HuggingFaceM4/Docmatix\"},{\"description\":\"Dataset + from the 2020 DocVQA challenge. The documents are taken from the UCSF Industry + Documents Library.\",\"id\":\"eliolio/docvqa\"}],\"demo\":{\"inputs\":[{\"label\":\"Question\",\"content\":\"What + is the idea behind the consumer relations efficiency team?\",\"type\":\"text\"},{\"filename\":\"document-question-answering-input.png\",\"type\":\"img\"}],\"outputs\":[{\"label\":\"Answer\",\"content\":\"Balance + cost efficiency with quality customer service\",\"type\":\"text\"}]},\"metrics\":[{\"description\":\"The + evaluation metric for the DocVQA challenge is the Average Normalized Levenshtein + Similarity (ANLS). This metric is flexible to character regognition errors + and compares the predicted answer with the ground truth answer.\",\"id\":\"anls\"},{\"description\":\"Exact + Match is a metric based on the strict character match of the predicted answer + and the right answer. For answers predicted correctly, the Exact Match will + be 1. Even if only one character is different, Exact Match will be 0\",\"id\":\"exact-match\"}],\"models\":[{\"description\":\"A + robust document question answering model.\",\"id\":\"impira/layoutlm-document-qa\"},{\"description\":\"A + document question answering model specialized in invoices.\",\"id\":\"impira/layoutlm-invoices\"},{\"description\":\"A + special model for OCR-free document question answering.\",\"id\":\"microsoft/udop-large\"},{\"description\":\"A + powerful model for document question answering.\",\"id\":\"google/pix2struct-docvqa-large\"}],\"spaces\":[{\"description\":\"A + robust document question answering application.\",\"id\":\"impira/docquery\"},{\"description\":\"An + application that can answer questions from invoices.\",\"id\":\"impira/invoices\"},{\"description\":\"An + application to compare different document question answering models.\",\"id\":\"merve/compare_docvqa_models\"}],\"summary\":\"Document + Question Answering (also known as Document Visual Question Answering) is the + task of answering questions on document images. Document question answering + models take a (document, question) pair as input and return an answer in natural + language. Models usually rely on multi-modal features, combining text, position + of words (bounding-boxes) and image.\",\"widgetModels\":[\"impira/layoutlm-invoices\"],\"youtubeId\":\"\",\"id\":\"document-question-answering\",\"label\":\"Document + Question Answering\",\"libraries\":[\"transformers\",\"transformers.js\"]},\"feature-extraction\":{\"datasets\":[{\"description\":\"Wikipedia + dataset containing cleaned articles of all languages. Can be used to train + `feature-extraction` models.\",\"id\":\"wikipedia\"}],\"demo\":{\"inputs\":[{\"label\":\"Input\",\"content\":\"India, + officially the Republic of India, is a country in South Asia.\",\"type\":\"text\"}],\"outputs\":[{\"table\":[[\"Dimension + 1\",\"Dimension 2\",\"Dimension 3\"],[\"2.583383083343506\",\"2.757075071334839\",\"0.9023529887199402\"],[\"8.29393482208252\",\"1.1071064472198486\",\"2.03399395942688\"],[\"-0.7754912972450256\",\"-1.647324562072754\",\"-0.6113331913948059\"],[\"0.07087723910808563\",\"1.5942802429199219\",\"1.4610432386398315\"]],\"type\":\"tabular\"}]},\"metrics\":[],\"models\":[{\"description\":\"A + powerful feature extraction model for natural language processing tasks.\",\"id\":\"thenlper/gte-large\"},{\"description\":\"A + strong feature extraction model for retrieval.\",\"id\":\"Alibaba-NLP/gte-Qwen1.5-7B-instruct\"}],\"spaces\":[{\"description\":\"A + leaderboard to rank text feature extraction models based on a benchmark.\",\"id\":\"mteb/leaderboard\"},{\"description\":\"A + leaderboard to rank best feature extraction models based on human feedback.\",\"id\":\"mteb/arena\"}],\"summary\":\"Feature + extraction is the task of extracting features learnt in a model.\",\"widgetModels\":[\"facebook/bart-base\"],\"id\":\"feature-extraction\",\"label\":\"Feature + Extraction\",\"libraries\":[\"sentence-transformers\",\"transformers\",\"transformers.js\"]},\"fill-mask\":{\"datasets\":[{\"description\":\"A + common dataset that is used to train models for many languages.\",\"id\":\"wikipedia\"},{\"description\":\"A + large English dataset with text crawled from the web.\",\"id\":\"c4\"}],\"demo\":{\"inputs\":[{\"label\":\"Input\",\"content\":\"The + barked at me\",\"type\":\"text\"}],\"outputs\":[{\"type\":\"chart\",\"data\":[{\"label\":\"wolf\",\"score\":0.487},{\"label\":\"dog\",\"score\":0.061},{\"label\":\"cat\",\"score\":0.058},{\"label\":\"fox\",\"score\":0.047},{\"label\":\"squirrel\",\"score\":0.025}]}]},\"metrics\":[{\"description\":\"Cross + Entropy is a metric that calculates the difference between two probability + distributions. Each probability distribution is the distribution of predicted + words\",\"id\":\"cross_entropy\"},{\"description\":\"Perplexity is the exponential + of the cross-entropy loss. It evaluates the probabilities assigned to the + next word by the model. Lower perplexity indicates better performance\",\"id\":\"perplexity\"}],\"models\":[{\"description\":\"The + famous BERT model.\",\"id\":\"google-bert/bert-base-uncased\"},{\"description\":\"A + multilingual model trained on 100 languages.\",\"id\":\"FacebookAI/xlm-roberta-base\"}],\"spaces\":[],\"summary\":\"Masked + language modeling is the task of masking some of the words in a sentence and + predicting which words should replace those masks. These models are useful + when we want to get a statistical understanding of the language in which the + model is trained in.\",\"widgetModels\":[\"distilroberta-base\"],\"youtubeId\":\"mqElG5QJWUg\",\"id\":\"fill-mask\",\"label\":\"Fill-Mask\",\"libraries\":[\"transformers\",\"transformers.js\"]},\"image-classification\":{\"datasets\":[{\"description\":\"Benchmark + dataset used for image classification with images that belong to 100 classes.\",\"id\":\"cifar100\"},{\"description\":\"Dataset + consisting of images of garments.\",\"id\":\"fashion_mnist\"}],\"demo\":{\"inputs\":[{\"filename\":\"image-classification-input.jpeg\",\"type\":\"img\"}],\"outputs\":[{\"type\":\"chart\",\"data\":[{\"label\":\"Egyptian + cat\",\"score\":0.514},{\"label\":\"Tabby cat\",\"score\":0.193},{\"label\":\"Tiger + cat\",\"score\":0.068}]}]},\"metrics\":[{\"description\":\"\",\"id\":\"accuracy\"},{\"description\":\"\",\"id\":\"recall\"},{\"description\":\"\",\"id\":\"precision\"},{\"description\":\"\",\"id\":\"f1\"}],\"models\":[{\"description\":\"A + strong image classification model.\",\"id\":\"google/vit-base-patch16-224\"},{\"description\":\"A + robust image classification model.\",\"id\":\"facebook/deit-base-distilled-patch16-224\"},{\"description\":\"A + strong image classification model.\",\"id\":\"facebook/convnext-large-224\"}],\"spaces\":[{\"description\":\"An + application that classifies what a given image is about.\",\"id\":\"nielsr/perceiver-image-classification\"}],\"summary\":\"Image + classification is the task of assigning a label or class to an entire image. + Images are expected to have only one class for each image. Image classification + models take an image as input and return a prediction about which class the + image belongs to.\",\"widgetModels\":[\"google/vit-base-patch16-224\"],\"youtubeId\":\"tjAIM7BOYhw\",\"id\":\"image-classification\",\"label\":\"Image + Classification\",\"libraries\":[\"keras\",\"timm\",\"transformers\",\"transformers.js\"]},\"image-feature-extraction\":{\"datasets\":[{\"description\":\"ImageNet-1K + is a image classification dataset in which images are used to train image-feature-extraction + models.\",\"id\":\"imagenet-1k\"}],\"demo\":{\"inputs\":[{\"filename\":\"mask-generation-input.png\",\"type\":\"img\"}],\"outputs\":[{\"table\":[[\"Dimension + 1\",\"Dimension 2\",\"Dimension 3\"],[\"0.21236686408519745\",\"1.0919708013534546\",\"0.8512550592422485\"],[\"0.809657871723175\",\"-0.18544459342956543\",\"-0.7851548194885254\"],[\"1.3103108406066895\",\"-0.2479034662246704\",\"-0.9107287526130676\"],[\"1.8536205291748047\",\"-0.36419737339019775\",\"0.09717650711536407\"]],\"type\":\"tabular\"}]},\"metrics\":[],\"models\":[{\"description\":\"A + powerful image feature extraction model.\",\"id\":\"timm/vit_large_patch14_dinov2.lvd142m\"},{\"description\":\"A + strong image feature extraction model.\",\"id\":\"nvidia/MambaVision-T-1K\"},{\"description\":\"A + robust image feature extraction model.\",\"id\":\"facebook/dino-vitb16\"},{\"description\":\"Strong + image feature extraction model made for information retrieval from documents.\",\"id\":\"vidore/colpali\"},{\"description\":\"Strong + image feature extraction model that can be used on images and documents.\",\"id\":\"OpenGVLab/InternViT-6B-448px-V1-2\"}],\"spaces\":[],\"summary\":\"Image + feature extraction is the task of extracting features learnt in a computer + vision model.\",\"widgetModels\":[],\"id\":\"image-feature-extraction\",\"label\":\"Image + Feature Extraction\",\"libraries\":[\"timm\",\"transformers\"]},\"image-segmentation\":{\"datasets\":[{\"description\":\"Scene + segmentation dataset.\",\"id\":\"scene_parse_150\"}],\"demo\":{\"inputs\":[{\"filename\":\"image-segmentation-input.jpeg\",\"type\":\"img\"}],\"outputs\":[{\"filename\":\"image-segmentation-output.png\",\"type\":\"img\"}]},\"metrics\":[{\"description\":\"Average + Precision (AP) is the Area Under the PR Curve (AUC-PR). It is calculated for + each semantic class separately\",\"id\":\"Average Precision\"},{\"description\":\"Mean + Average Precision (mAP) is the overall average of the AP values\",\"id\":\"Mean + Average Precision\"},{\"description\":\"Intersection over Union (IoU) is the + overlap of segmentation masks. Mean IoU is the average of the IoU of all semantic + classes\",\"id\":\"Mean Intersection over Union\"},{\"description\":\"AP\u03B1 + is the Average Precision at the IoU threshold of a \u03B1 value, for example, + AP50 and AP75\",\"id\":\"AP\u03B1\"}],\"models\":[{\"description\":\"Solid + semantic segmentation model trained on ADE20k.\",\"id\":\"openmmlab/upernet-convnext-small\"},{\"description\":\"Background + removal model.\",\"id\":\"briaai/RMBG-1.4\"},{\"description\":\"A multipurpose + image segmentation model for high resolution images.\",\"id\":\"ZhengPeng7/BiRefNet\"},{\"description\":\"Powerful + human-centric image segmentation model.\",\"id\":\"facebook/sapiens-seg-1b\"},{\"description\":\"Panoptic + segmentation model trained on the COCO (common objects) dataset.\",\"id\":\"facebook/mask2former-swin-large-coco-panoptic\"}],\"spaces\":[{\"description\":\"A + semantic segmentation application that can predict unseen instances out of + the box.\",\"id\":\"facebook/ov-seg\"},{\"description\":\"One of the strongest + segmentation applications.\",\"id\":\"jbrinkma/segment-anything\"},{\"description\":\"A + human-centric segmentation model.\",\"id\":\"facebook/sapiens-pose\"},{\"description\":\"An + instance segmentation application to predict neuronal cell types from microscopy + images.\",\"id\":\"rashmi/sartorius-cell-instance-segmentation\"},{\"description\":\"An + application that segments videos.\",\"id\":\"ArtGAN/Segment-Anything-Video\"},{\"description\":\"An + panoptic segmentation application built for outdoor environments.\",\"id\":\"segments/panoptic-segment-anything\"}],\"summary\":\"Image + Segmentation divides an image into segments where each pixel in the image + is mapped to an object. This task has multiple variants such as instance segmentation, + panoptic segmentation and semantic segmentation.\",\"widgetModels\":[\"nvidia/segformer-b0-finetuned-ade-512-512\"],\"youtubeId\":\"dKE8SIt9C-w\",\"id\":\"image-segmentation\",\"label\":\"Image + Segmentation\",\"libraries\":[\"transformers\",\"transformers.js\"]},\"image-to-image\":{\"datasets\":[{\"description\":\"Synthetic + dataset, for image relighting\",\"id\":\"VIDIT\"},{\"description\":\"Multiple + images of celebrities, used for facial expression translation\",\"id\":\"huggan/CelebA-faces\"}],\"demo\":{\"inputs\":[{\"filename\":\"image-to-image-input.jpeg\",\"type\":\"img\"}],\"outputs\":[{\"filename\":\"image-to-image-output.png\",\"type\":\"img\"}]},\"isPlaceholder\":false,\"metrics\":[{\"description\":\"Peak + Signal to Noise Ratio (PSNR) is an approximation of the human perception, + considering the ratio of the absolute intensity with respect to the variations. + Measured in dB, a high value indicates a high fidelity.\",\"id\":\"PSNR\"},{\"description\":\"Structural + Similarity Index (SSIM) is a perceptual metric which compares the luminance, + contrast and structure of two images. The values of SSIM range between -1 + and 1, and higher values indicate closer resemblance to the original image.\",\"id\":\"SSIM\"},{\"description\":\"Inception + Score (IS) is an analysis of the labels predicted by an image classification + model when presented with a sample of the generated images.\",\"id\":\"IS\"}],\"models\":[{\"description\":\"An + image-to-image model to improve image resolution.\",\"id\":\"fal/AuraSR-v2\"},{\"description\":\"A + model that increases the resolution of an image.\",\"id\":\"keras-io/super-resolution\"},{\"description\":\"A + model that creates a set of variations of the input image in the style of + DALL-E using Stable Diffusion.\",\"id\":\"lambdalabs/sd-image-variations-diffusers\"},{\"description\":\"A + model that generates images based on segments in the input image and the text + prompt.\",\"id\":\"mfidabel/controlnet-segment-anything\"},{\"description\":\"A + model that takes an image and an instruction to edit the image.\",\"id\":\"timbrooks/instruct-pix2pix\"}],\"spaces\":[{\"description\":\"Image + enhancer application for low light.\",\"id\":\"keras-io/low-light-image-enhancement\"},{\"description\":\"Style + transfer application.\",\"id\":\"keras-io/neural-style-transfer\"},{\"description\":\"An + application that generates images based on segment control.\",\"id\":\"mfidabel/controlnet-segment-anything\"},{\"description\":\"Image + generation application that takes image control and text prompt.\",\"id\":\"hysts/ControlNet\"},{\"description\":\"Colorize + any image using this app.\",\"id\":\"ioclab/brightness-controlnet\"},{\"description\":\"Edit + images with instructions.\",\"id\":\"timbrooks/instruct-pix2pix\"}],\"summary\":\"Image-to-image + is the task of transforming an input image through a variety of possible manipulations + and enhancements, such as super-resolution, image inpainting, colorization, + and more.\",\"widgetModels\":[\"stabilityai/stable-diffusion-2-inpainting\"],\"youtubeId\":\"\",\"id\":\"image-to-image\",\"label\":\"Image-to-Image\",\"libraries\":[\"diffusers\",\"transformers\",\"transformers.js\"]},\"image-text-to-text\":{\"datasets\":[{\"description\":\"Instructions + composed of image and text.\",\"id\":\"liuhaotian/LLaVA-Instruct-150K\"},{\"description\":\"Conversation + turns where questions involve image and text.\",\"id\":\"liuhaotian/LLaVA-Pretrain\"},{\"description\":\"A + collection of datasets made for model fine-tuning.\",\"id\":\"HuggingFaceM4/the_cauldron\"},{\"description\":\"Screenshots + of websites with their HTML/CSS codes.\",\"id\":\"HuggingFaceM4/WebSight\"}],\"demo\":{\"inputs\":[{\"filename\":\"image-text-to-text-input.png\",\"type\":\"img\"},{\"label\":\"Text + Prompt\",\"content\":\"Describe the position of the bee in detail.\",\"type\":\"text\"}],\"outputs\":[{\"label\":\"Answer\",\"content\":\"The + bee is sitting on a pink flower, surrounded by other flowers. The bee is positioned + in the center of the flower, with its head and front legs sticking out.\",\"type\":\"text\"}]},\"metrics\":[],\"models\":[{\"description\":\"Powerful + vision language model with great visual understanding and reasoning capabilities.\",\"id\":\"meta-llama/Llama-3.2-11B-Vision-Instruct\"},{\"description\":\"Cutting-edge + vision language models.\",\"id\":\"allenai/Molmo-7B-D-0924\"},{\"description\":\"Small + yet powerful model.\",\"id\":\"vikhyatk/moondream2\"},{\"description\":\"Strong + image-text-to-text model.\",\"id\":\"Qwen/Qwen2-VL-7B-Instruct\"},{\"description\":\"Strong + image-text-to-text model.\",\"id\":\"mistralai/Pixtral-12B-2409\"},{\"description\":\"Strong + image-text-to-text model focused on documents.\",\"id\":\"stepfun-ai/GOT-OCR2_0\"}],\"spaces\":[{\"description\":\"Leaderboard + to evaluate vision language models.\",\"id\":\"opencompass/open_vlm_leaderboard\"},{\"description\":\"Vision + language models arena, where models are ranked by votes of users.\",\"id\":\"WildVision/vision-arena\"},{\"description\":\"Powerful + vision-language model assistant.\",\"id\":\"akhaliq/Molmo-7B-D-0924\"},{\"description\":\"An + image-text-to-text application focused on documents.\",\"id\":\"stepfun-ai/GOT_official_online_demo\"},{\"description\":\"An + application to compare outputs of different vision language models.\",\"id\":\"merve/compare_VLMs\"},{\"description\":\"An + application for chatting with an image-text-to-text model.\",\"id\":\"GanymedeNil/Qwen2-VL-7B\"}],\"summary\":\"Image-text-to-text + models take in an image and text prompt and output text. These models are + also called vision-language models, or VLMs. The difference from image-to-text + models is that these models take an additional text input, not restricting + the model to certain use cases like image captioning, and may also be trained + to accept a conversation as input.\",\"widgetModels\":[\"meta-llama/Llama-3.2-11B-Vision-Instruct\"],\"youtubeId\":\"IoGaGfU1CIg\",\"id\":\"image-text-to-text\",\"label\":\"Image-Text-to-Text\",\"libraries\":[\"transformers\"]},\"image-to-text\":{\"datasets\":[{\"description\":\"Dataset + from 12M image-text of Reddit\",\"id\":\"red_caps\"},{\"description\":\"Dataset + from 3.3M images of Google\",\"id\":\"datasets/conceptual_captions\"}],\"demo\":{\"inputs\":[{\"filename\":\"savanna.jpg\",\"type\":\"img\"}],\"outputs\":[{\"label\":\"Detailed + description\",\"content\":\"a herd of giraffes and zebras grazing in a field\",\"type\":\"text\"}]},\"metrics\":[],\"models\":[{\"description\":\"A + robust image captioning model.\",\"id\":\"Salesforce/blip2-opt-2.7b\"},{\"description\":\"A + powerful and accurate image-to-text model that can also localize concepts + in images.\",\"id\":\"microsoft/kosmos-2-patch14-224\"},{\"description\":\"A + strong optical character recognition model.\",\"id\":\"facebook/nougat-base\"},{\"description\":\"A + powerful model that lets you have a conversation with the image.\",\"id\":\"llava-hf/llava-1.5-7b-hf\"}],\"spaces\":[{\"description\":\"An + application that compares various image captioning models.\",\"id\":\"nielsr/comparing-captioning-models\"},{\"description\":\"A + robust image captioning application.\",\"id\":\"flax-community/image-captioning\"},{\"description\":\"An + application that transcribes handwritings into text.\",\"id\":\"nielsr/TrOCR-handwritten\"},{\"description\":\"An + application that can caption images and answer questions about a given image.\",\"id\":\"Salesforce/BLIP\"},{\"description\":\"An + application that can caption images and answer questions with a conversational + agent.\",\"id\":\"Salesforce/BLIP2\"},{\"description\":\"An image captioning + application that demonstrates the effect of noise on captions.\",\"id\":\"johko/capdec-image-captioning\"}],\"summary\":\"Image + to text models output a text from a given image. Image captioning or optical + character recognition can be considered as the most common applications of + image to text.\",\"widgetModels\":[\"Salesforce/blip-image-captioning-large\"],\"youtubeId\":\"\",\"id\":\"image-to-text\",\"label\":\"Image-to-Text\",\"libraries\":[\"transformers\",\"transformers.js\"]},\"keypoint-detection\":{\"datasets\":[{\"description\":\"A + dataset of hand keypoints of over 500k examples.\",\"id\":\"Vincent-luo/hagrid-mediapipe-hands\"}],\"demo\":{\"inputs\":[{\"filename\":\"keypoint-detection-input.png\",\"type\":\"img\"}],\"outputs\":[{\"filename\":\"keypoint-detection-output.png\",\"type\":\"img\"}]},\"metrics\":[],\"models\":[{\"description\":\"A + robust keypoint detection model.\",\"id\":\"magic-leap-community/superpoint\"},{\"description\":\"Strong + keypoint detection model used to detect human pose.\",\"id\":\"facebook/sapiens-pose-1b\"}],\"spaces\":[{\"description\":\"An + application that detects hand keypoints in real-time.\",\"id\":\"datasciencedojo/Hand-Keypoint-Detection-Realtime\"},{\"description\":\"An + application to try a universal keypoint detection model.\",\"id\":\"merve/SuperPoint\"}],\"summary\":\"Keypoint + detection is the task of identifying meaningful distinctive points or features + in an image.\",\"widgetModels\":[],\"youtubeId\":\"\",\"id\":\"keypoint-detection\",\"label\":\"Keypoint + Detection\",\"libraries\":[\"transformers\"]},\"mask-generation\":{\"datasets\":[{\"description\":\"Widely + used benchmark dataset for multiple Vision tasks.\",\"id\":\"merve/coco2017\"},{\"description\":\"Medical + Imaging dataset of the Human Brain for segmentation and mask generating tasks\",\"id\":\"rocky93/BraTS_segmentation\"}],\"demo\":{\"inputs\":[{\"filename\":\"mask-generation-input.png\",\"type\":\"img\"}],\"outputs\":[{\"filename\":\"mask-generation-output.png\",\"type\":\"img\"}]},\"metrics\":[{\"description\":\"IoU + is used to measure the overlap between predicted mask and the ground truth + mask.\",\"id\":\"Intersection over Union (IoU)\"}],\"models\":[{\"description\":\"Small + yet powerful mask generation model.\",\"id\":\"Zigeng/SlimSAM-uniform-50\"},{\"description\":\"Very + strong mask generation model.\",\"id\":\"facebook/sam2-hiera-large\"}],\"spaces\":[{\"description\":\"An + application that combines a mask generation model with a zero-shot object + detection model for text-guided image segmentation.\",\"id\":\"merve/OWLSAM2\"},{\"description\":\"An + application that compares the performance of a large and a small mask generation + model.\",\"id\":\"merve/slimsam\"},{\"description\":\"An application based + on an improved mask generation model.\",\"id\":\"SkalskiP/segment-anything-model-2\"},{\"description\":\"An + application to remove objects from videos using mask generation models.\",\"id\":\"SkalskiP/SAM_and_ProPainter\"}],\"summary\":\"Mask + generation is the task of generating masks that identify a specific object + or region of interest in a given image. Masks are often used in segmentation + tasks, where they provide a precise way to isolate the object of interest + for further processing or analysis.\",\"widgetModels\":[],\"youtubeId\":\"\",\"id\":\"mask-generation\",\"label\":\"Mask + Generation\",\"libraries\":[\"transformers\"]},\"object-detection\":{\"datasets\":[{\"description\":\"Widely + used benchmark dataset for multiple vision tasks.\",\"id\":\"merve/coco2017\"},{\"description\":\"Multi-task + computer vision benchmark.\",\"id\":\"merve/pascal-voc\"}],\"demo\":{\"inputs\":[{\"filename\":\"object-detection-input.jpg\",\"type\":\"img\"}],\"outputs\":[{\"filename\":\"object-detection-output.jpg\",\"type\":\"img\"}]},\"metrics\":[{\"description\":\"The + Average Precision (AP) metric is the Area Under the PR Curve (AUC-PR). It + is calculated for each class separately\",\"id\":\"Average Precision\"},{\"description\":\"The + Mean Average Precision (mAP) metric is the overall average of the AP values\",\"id\":\"Mean + Average Precision\"},{\"description\":\"The AP\u03B1 metric is the Average + Precision at the IoU threshold of a \u03B1 value, for example, AP50 and AP75\",\"id\":\"AP\u03B1\"}],\"models\":[{\"description\":\"Solid + object detection model pre-trained on the COCO 2017 dataset.\",\"id\":\"facebook/detr-resnet-50\"},{\"description\":\"Real-time + and accurate object detection model.\",\"id\":\"jameslahm/yolov10x\"},{\"description\":\"Fast + and accurate object detection model trained on COCO and Object365 datasets.\",\"id\":\"PekingU/rtdetr_r18vd_coco_o365\"}],\"spaces\":[{\"description\":\"Leaderboard + to compare various object detection models across several metrics.\",\"id\":\"hf-vision/object_detection_leaderboard\"},{\"description\":\"An + application that contains various object detection models to try from.\",\"id\":\"Gradio-Blocks/Object-Detection-With-DETR-and-YOLOS\"},{\"description\":\"An + application that shows multiple cutting edge techniques for object detection + and tracking.\",\"id\":\"kadirnar/torchyolo\"},{\"description\":\"An object + tracking, segmentation and inpainting application.\",\"id\":\"VIPLab/Track-Anything\"},{\"description\":\"Very + fast object tracking application based on object detection.\",\"id\":\"merve/RT-DETR-tracking-coco\"}],\"summary\":\"Object + Detection models allow users to identify objects of certain defined classes. + Object detection models receive an image as input and output the images with + bounding boxes and labels on detected objects.\",\"widgetModels\":[\"facebook/detr-resnet-50\"],\"youtubeId\":\"WdAeKSOpxhw\",\"id\":\"object-detection\",\"label\":\"Object + Detection\",\"libraries\":[\"transformers\",\"transformers.js\"]},\"video-classification\":{\"datasets\":[{\"description\":\"Benchmark + dataset used for video classification with videos that belong to 400 classes.\",\"id\":\"kinetics400\"}],\"demo\":{\"inputs\":[{\"filename\":\"video-classification-input.gif\",\"type\":\"img\"}],\"outputs\":[{\"type\":\"chart\",\"data\":[{\"label\":\"Playing + Guitar\",\"score\":0.514},{\"label\":\"Playing Tennis\",\"score\":0.193},{\"label\":\"Cooking\",\"score\":0.068}]}]},\"metrics\":[{\"description\":\"\",\"id\":\"accuracy\"},{\"description\":\"\",\"id\":\"recall\"},{\"description\":\"\",\"id\":\"precision\"},{\"description\":\"\",\"id\":\"f1\"}],\"models\":[{\"description\":\"Strong + Video Classification model trained on the Kinetics 400 dataset.\",\"id\":\"google/vivit-b-16x2-kinetics400\"},{\"description\":\"Strong + Video Classification model trained on the Kinetics 400 dataset.\",\"id\":\"microsoft/xclip-base-patch32\"}],\"spaces\":[{\"description\":\"An + application that classifies video at different timestamps.\",\"id\":\"nateraw/lavila\"},{\"description\":\"An + application that classifies video.\",\"id\":\"fcakyon/video-classification\"}],\"summary\":\"Video + classification is the task of assigning a label or class to an entire video. + Videos are expected to have only one class for each video. Video classification + models take a video as input and return a prediction about which class the + video belongs to.\",\"widgetModels\":[],\"youtubeId\":\"\",\"id\":\"video-classification\",\"label\":\"Video + Classification\",\"libraries\":[\"transformers\"]},\"question-answering\":{\"datasets\":[{\"description\":\"A + famous question answering dataset based on English articles from Wikipedia.\",\"id\":\"squad_v2\"},{\"description\":\"A + dataset of aggregated anonymized actual queries issued to the Google search + engine.\",\"id\":\"natural_questions\"}],\"demo\":{\"inputs\":[{\"label\":\"Question\",\"content\":\"Which + name is also used to describe the Amazon rainforest in English?\",\"type\":\"text\"},{\"label\":\"Context\",\"content\":\"The + Amazon rainforest, also known in English as Amazonia or the Amazon Jungle\",\"type\":\"text\"}],\"outputs\":[{\"label\":\"Answer\",\"content\":\"Amazonia\",\"type\":\"text\"}]},\"metrics\":[{\"description\":\"Exact + Match is a metric based on the strict character match of the predicted answer + and the right answer. For answers predicted correctly, the Exact Match will + be 1. Even if only one character is different, Exact Match will be 0\",\"id\":\"exact-match\"},{\"description\":\" + The F1-Score metric is useful if we value both false positives and false negatives + equally. The F1-Score is calculated on each word in the predicted sequence + against the correct answer\",\"id\":\"f1\"}],\"models\":[{\"description\":\"A + robust baseline model for most question answering domains.\",\"id\":\"deepset/roberta-base-squad2\"},{\"description\":\"Small + yet robust model that can answer questions.\",\"id\":\"distilbert/distilbert-base-cased-distilled-squad\"},{\"description\":\"A + special model that can answer questions from tables.\",\"id\":\"google/tapas-base-finetuned-wtq\"}],\"spaces\":[{\"description\":\"An + application that can answer a long question from Wikipedia.\",\"id\":\"deepset/wikipedia-assistant\"}],\"summary\":\"Question + Answering models can retrieve the answer to a question from a given text, + which is useful for searching for an answer in a document. Some question answering + models can generate answers without context!\",\"widgetModels\":[\"deepset/roberta-base-squad2\"],\"youtubeId\":\"ajPx5LwJD-I\",\"id\":\"question-answering\",\"label\":\"Question + Answering\",\"libraries\":[\"adapter-transformers\",\"allennlp\",\"transformers\",\"transformers.js\"]},\"reinforcement-learning\":{\"datasets\":[{\"description\":\"A + curation of widely used datasets for Data Driven Deep Reinforcement Learning + (D4RL)\",\"id\":\"edbeeching/decision_transformer_gym_replay\"}],\"demo\":{\"inputs\":[{\"label\":\"State\",\"content\":\"Red + traffic light, pedestrians are about to pass.\",\"type\":\"text\"}],\"outputs\":[{\"label\":\"Action\",\"content\":\"Stop + the car.\",\"type\":\"text\"},{\"label\":\"Next State\",\"content\":\"Yellow + light, pedestrians have crossed.\",\"type\":\"text\"}]},\"metrics\":[{\"description\":\"Accumulated + reward across all time steps discounted by a factor that ranges between 0 + and 1 and determines how much the agent optimizes for future relative to immediate + rewards. Measures how good is the policy ultimately found by a given algorithm + considering uncertainty over the future.\",\"id\":\"Discounted Total Reward\"},{\"description\":\"Average + return obtained after running the policy for a certain number of evaluation + episodes. As opposed to total reward, mean reward considers how much reward + a given algorithm receives while learning.\",\"id\":\"Mean Reward\"},{\"description\":\"Measures + how good a given algorithm is after a predefined time. Some algorithms may + be guaranteed to converge to optimal behavior across many time steps. However, + an agent that reaches an acceptable level of optimality after a given time + horizon may be preferable to one that ultimately reaches optimality but takes + a long time.\",\"id\":\"Level of Performance After Some Time\"}],\"models\":[{\"description\":\"A + Reinforcement Learning model trained on expert data from the Gym Hopper environment\",\"id\":\"edbeeching/decision-transformer-gym-hopper-expert\"},{\"description\":\"A + PPO agent playing seals/CartPole-v0 using the stable-baselines3 library and + the RL Zoo.\",\"id\":\"HumanCompatibleAI/ppo-seals-CartPole-v0\"}],\"spaces\":[{\"description\":\"An + application for a cute puppy agent learning to catch a stick.\",\"id\":\"ThomasSimonini/Huggy\"},{\"description\":\"An + application to play Snowball Fight with a reinforcement learning agent.\",\"id\":\"ThomasSimonini/SnowballFight\"}],\"summary\":\"Reinforcement + learning is the computational approach of learning from action by interacting + with an environment through trial and error and receiving rewards (negative + or positive) as feedback\",\"widgetModels\":[],\"youtubeId\":\"q0BiUn5LiBc\",\"id\":\"reinforcement-learning\",\"label\":\"Reinforcement + Learning\",\"libraries\":[\"transformers\",\"stable-baselines3\",\"ml-agents\",\"sample-factory\"]},\"sentence-similarity\":{\"datasets\":[{\"description\":\"Bing + queries with relevant passages from various web sources.\",\"id\":\"ms_marco\"}],\"demo\":{\"inputs\":[{\"label\":\"Source + sentence\",\"content\":\"Machine learning is so easy.\",\"type\":\"text\"},{\"label\":\"Sentences + to compare to\",\"content\":\"Deep learning is so straightforward.\",\"type\":\"text\"},{\"label\":\"\",\"content\":\"This + is so difficult, like rocket science.\",\"type\":\"text\"},{\"label\":\"\",\"content\":\"I + can't believe how much I struggled with this.\",\"type\":\"text\"}],\"outputs\":[{\"type\":\"chart\",\"data\":[{\"label\":\"Deep + learning is so straightforward.\",\"score\":0.623},{\"label\":\"This is so + difficult, like rocket science.\",\"score\":0.413},{\"label\":\"I can't believe + how much I struggled with this.\",\"score\":0.256}]}]},\"metrics\":[{\"description\":\"Reciprocal + Rank is a measure used to rank the relevancy of documents given a set of documents. + Reciprocal Rank is the reciprocal of the rank of the document retrieved, meaning, + if the rank is 3, the Reciprocal Rank is 0.33. If the rank is 1, the Reciprocal + Rank is 1\",\"id\":\"Mean Reciprocal Rank\"},{\"description\":\"The similarity + of the embeddings is evaluated mainly on cosine similarity. It is calculated + as the cosine of the angle between two vectors. It is particularly useful + when your texts are not the same length\",\"id\":\"Cosine Similarity\"}],\"models\":[{\"description\":\"This + model works well for sentences and paragraphs and can be used for clustering/grouping + and semantic searches.\",\"id\":\"sentence-transformers/all-mpnet-base-v2\"},{\"description\":\"A + multilingual robust sentence similarity model..\",\"id\":\"BAAI/bge-m3\"}],\"spaces\":[{\"description\":\"An + application that leverages sentence similarity to answer questions from YouTube + videos.\",\"id\":\"Gradio-Blocks/Ask_Questions_To_YouTube_Videos\"},{\"description\":\"An + application that retrieves relevant PubMed abstracts for a given online article + which can be used as further references.\",\"id\":\"Gradio-Blocks/pubmed-abstract-retriever\"},{\"description\":\"An + application that leverages sentence similarity to summarize text.\",\"id\":\"nickmuchi/article-text-summarizer\"},{\"description\":\"A + guide that explains how Sentence Transformers can be used for semantic search.\",\"id\":\"sentence-transformers/Sentence_Transformers_for_semantic_search\"}],\"summary\":\"Sentence + Similarity is the task of determining how similar two texts are. Sentence + similarity models convert input texts into vectors (embeddings) that capture + semantic information and calculate how close (similar) they are between them. + This task is particularly useful for information retrieval and clustering/grouping.\",\"widgetModels\":[\"BAAI/bge-small-en-v1.5\"],\"youtubeId\":\"VCZq5AkbNEU\",\"id\":\"sentence-similarity\",\"label\":\"Sentence + Similarity\",\"libraries\":[\"sentence-transformers\",\"spacy\",\"transformers.js\"]},\"summarization\":{\"canonicalId\":\"text2text-generation\",\"datasets\":[{\"description\":\"News + articles in five different languages along with their summaries. Widely used + for benchmarking multilingual summarization models.\",\"id\":\"mlsum\"},{\"description\":\"English + conversations and their summaries. Useful for benchmarking conversational + agents.\",\"id\":\"samsum\"}],\"demo\":{\"inputs\":[{\"label\":\"Input\",\"content\":\"The + tower is 324 metres (1,063 ft) tall, about the same height as an 81-storey + building, and the tallest structure in Paris. Its base is square, measuring + 125 metres (410 ft) on each side. It was the first structure to reach a height + of 300 metres. Excluding transmitters, the Eiffel Tower is the second tallest + free-standing structure in France after the Millau Viaduct.\",\"type\":\"text\"}],\"outputs\":[{\"label\":\"Output\",\"content\":\"The + tower is 324 metres (1,063 ft) tall, about the same height as an 81-storey + building. It was the first structure to reach a height of 300 metres.\",\"type\":\"text\"}]},\"metrics\":[{\"description\":\"The + generated sequence is compared against its summary, and the overlap of tokens + are counted. ROUGE-N refers to overlap of N subsequent tokens, ROUGE-1 refers + to overlap of single tokens and ROUGE-2 is the overlap of two subsequent tokens.\",\"id\":\"rouge\"}],\"models\":[{\"description\":\"A + strong summarization model trained on English news articles. Excels at generating + factual summaries.\",\"id\":\"facebook/bart-large-cnn\"},{\"description\":\"A + summarization model trained on medical articles.\",\"id\":\"Falconsai/medical_summarization\"}],\"spaces\":[{\"description\":\"An + application that can summarize long paragraphs.\",\"id\":\"pszemraj/summarize-long-text\"},{\"description\":\"A + much needed summarization application for terms and conditions.\",\"id\":\"ml6team/distilbart-tos-summarizer-tosdr\"},{\"description\":\"An + application that summarizes long documents.\",\"id\":\"pszemraj/document-summarization\"},{\"description\":\"An + application that can detect errors in abstractive summarization.\",\"id\":\"ml6team/post-processing-summarization\"}],\"summary\":\"Summarization + is the task of producing a shorter version of a document while preserving + its important information. Some models can extract text from the original + input, while other models can generate entirely new text.\",\"widgetModels\":[\"facebook/bart-large-cnn\"],\"youtubeId\":\"yHnr5Dk2zCI\",\"id\":\"summarization\",\"label\":\"Summarization\",\"libraries\":[\"transformers\",\"transformers.js\"]},\"table-question-answering\":{\"datasets\":[{\"description\":\"The + WikiTableQuestions dataset is a large-scale dataset for the task of question + answering on semi-structured tables.\",\"id\":\"wikitablequestions\"},{\"description\":\"WikiSQL + is a dataset of 80654 hand-annotated examples of questions and SQL queries + distributed across 24241 tables from Wikipedia.\",\"id\":\"wikisql\"}],\"demo\":{\"inputs\":[{\"table\":[[\"Rank\",\"Name\",\"No.of + reigns\",\"Combined days\"],[\"1\",\"lou Thesz\",\"3\",\"3749\"],[\"2\",\"Ric + Flair\",\"8\",\"3103\"],[\"3\",\"Harley Race\",\"7\",\"1799\"]],\"type\":\"tabular\"},{\"label\":\"Question\",\"content\":\"What + is the number of reigns for Harley Race?\",\"type\":\"text\"}],\"outputs\":[{\"label\":\"Result\",\"content\":\"7\",\"type\":\"text\"}]},\"metrics\":[{\"description\":\"Checks + whether the predicted answer(s) is the same as the ground-truth answer(s).\",\"id\":\"Denotation + Accuracy\"}],\"models\":[{\"description\":\"A table question answering model + that is capable of neural SQL execution, i.e., employ TAPEX to execute a SQL + query on a given table.\",\"id\":\"microsoft/tapex-base\"},{\"description\":\"A + robust table question answering model.\",\"id\":\"google/tapas-base-finetuned-wtq\"}],\"spaces\":[{\"description\":\"An + application that answers questions based on table CSV files.\",\"id\":\"katanaml/table-query\"}],\"summary\":\"Table + Question Answering (Table QA) is the answering a question about an information + on a given table.\",\"widgetModels\":[\"google/tapas-base-finetuned-wtq\"],\"id\":\"table-question-answering\",\"label\":\"Table + Question Answering\",\"libraries\":[\"transformers\"]},\"tabular-classification\":{\"datasets\":[{\"description\":\"A + comprehensive curation of datasets covering all benchmarks.\",\"id\":\"inria-soda/tabular-benchmark\"}],\"demo\":{\"inputs\":[{\"table\":[[\"Glucose\",\"Blood + Pressure \",\"Skin Thickness\",\"Insulin\",\"BMI\"],[\"148\",\"72\",\"35\",\"0\",\"33.6\"],[\"150\",\"50\",\"30\",\"0\",\"35.1\"],[\"141\",\"60\",\"29\",\"1\",\"39.2\"]],\"type\":\"tabular\"}],\"outputs\":[{\"table\":[[\"Diabetes\"],[\"1\"],[\"1\"],[\"0\"]],\"type\":\"tabular\"}]},\"metrics\":[{\"description\":\"\",\"id\":\"accuracy\"},{\"description\":\"\",\"id\":\"recall\"},{\"description\":\"\",\"id\":\"precision\"},{\"description\":\"\",\"id\":\"f1\"}],\"models\":[{\"description\":\"Breast + cancer prediction model based on decision trees.\",\"id\":\"scikit-learn/cancer-prediction-trees\"}],\"spaces\":[{\"description\":\"An + application that can predict defective products on a production line.\",\"id\":\"scikit-learn/tabular-playground\"},{\"description\":\"An + application that compares various tabular classification techniques on different + datasets.\",\"id\":\"scikit-learn/classification\"}],\"summary\":\"Tabular + classification is the task of classifying a target category (a group) based + on set of attributes.\",\"widgetModels\":[\"scikit-learn/tabular-playground\"],\"youtubeId\":\"\",\"id\":\"tabular-classification\",\"label\":\"Tabular + Classification\",\"libraries\":[\"sklearn\"]},\"tabular-regression\":{\"datasets\":[{\"description\":\"A + comprehensive curation of datasets covering all benchmarks.\",\"id\":\"inria-soda/tabular-benchmark\"}],\"demo\":{\"inputs\":[{\"table\":[[\"Car + Name\",\"Horsepower\",\"Weight\"],[\"ford torino\",\"140\",\"3,449\"],[\"amc + hornet\",\"97\",\"2,774\"],[\"toyota corolla\",\"65\",\"1,773\"]],\"type\":\"tabular\"}],\"outputs\":[{\"table\":[[\"MPG + (miles per gallon)\"],[\"17\"],[\"18\"],[\"31\"]],\"type\":\"tabular\"}]},\"metrics\":[{\"description\":\"\",\"id\":\"mse\"},{\"description\":\"Coefficient + of determination (or R-squared) is a measure of how well the model fits the + data. Higher R-squared is considered a better fit.\",\"id\":\"r-squared\"}],\"models\":[{\"description\":\"Fish + weight prediction based on length measurements and species.\",\"id\":\"scikit-learn/Fish-Weight\"}],\"spaces\":[{\"description\":\"An + application that can predict weight of a fish based on set of attributes.\",\"id\":\"scikit-learn/fish-weight-prediction\"}],\"summary\":\"Tabular + regression is the task of predicting a numerical value given a set of attributes.\",\"widgetModels\":[\"scikit-learn/Fish-Weight\"],\"youtubeId\":\"\",\"id\":\"tabular-regression\",\"label\":\"Tabular + Regression\",\"libraries\":[\"sklearn\"]},\"text-classification\":{\"datasets\":[{\"description\":\"A + widely used dataset used to benchmark multiple variants of text classification.\",\"id\":\"nyu-mll/glue\"},{\"description\":\"A + text classification dataset used to benchmark natural language inference models\",\"id\":\"stanfordnlp/snli\"}],\"demo\":{\"inputs\":[{\"label\":\"Input\",\"content\":\"I + love Hugging Face!\",\"type\":\"text\"}],\"outputs\":[{\"type\":\"chart\",\"data\":[{\"label\":\"POSITIVE\",\"score\":0.9},{\"label\":\"NEUTRAL\",\"score\":0.1},{\"label\":\"NEGATIVE\",\"score\":0}]}]},\"metrics\":[{\"description\":\"\",\"id\":\"accuracy\"},{\"description\":\"\",\"id\":\"recall\"},{\"description\":\"\",\"id\":\"precision\"},{\"description\":\"The + F1 metric is the harmonic mean of the precision and recall. It can be calculated + as: F1 = 2 * (precision * recall) / (precision + recall)\",\"id\":\"f1\"}],\"models\":[{\"description\":\"A + robust model trained for sentiment analysis.\",\"id\":\"distilbert/distilbert-base-uncased-finetuned-sst-2-english\"},{\"description\":\"A + sentiment analysis model specialized in financial sentiment.\",\"id\":\"ProsusAI/finbert\"},{\"description\":\"A + sentiment analysis model specialized in analyzing tweets.\",\"id\":\"cardiffnlp/twitter-roberta-base-sentiment-latest\"},{\"description\":\"A + model that can classify languages.\",\"id\":\"papluca/xlm-roberta-base-language-detection\"},{\"description\":\"A + model that can classify text generation attacks.\",\"id\":\"meta-llama/Prompt-Guard-86M\"}],\"spaces\":[{\"description\":\"An + application that can classify financial sentiment.\",\"id\":\"IoannisTr/Tech_Stocks_Trading_Assistant\"},{\"description\":\"A + dashboard that contains various text classification tasks.\",\"id\":\"miesnerjacob/Multi-task-NLP\"},{\"description\":\"An + application that analyzes user reviews in healthcare.\",\"id\":\"spacy/healthsea-demo\"}],\"summary\":\"Text + Classification is the task of assigning a label or class to a given text. + Some use cases are sentiment analysis, natural language inference, and assessing + grammatical correctness.\",\"widgetModels\":[\"distilbert/distilbert-base-uncased-finetuned-sst-2-english\"],\"youtubeId\":\"leNG9fN9FQU\",\"id\":\"text-classification\",\"label\":\"Text + Classification\",\"libraries\":[\"adapter-transformers\",\"setfit\",\"spacy\",\"transformers\",\"transformers.js\"]},\"text-generation\":{\"datasets\":[{\"description\":\"A + large multilingual dataset of text crawled from the web.\",\"id\":\"mc4\"},{\"description\":\"Diverse + open-source data consisting of 22 smaller high-quality datasets. It was used + to train GPT-Neo.\",\"id\":\"the_pile\"},{\"description\":\"Truly open-source, + curated and cleaned dialogue dataset.\",\"id\":\"HuggingFaceH4/ultrachat_200k\"},{\"description\":\"An + instruction dataset with preference ratings on responses.\",\"id\":\"openbmb/UltraFeedback\"},{\"description\":\"A + large synthetic dataset for alignment of text generation models.\",\"id\":\"argilla/magpie-ultra-v0.1\"}],\"demo\":{\"inputs\":[{\"label\":\"Input\",\"content\":\"Once + upon a time,\",\"type\":\"text\"}],\"outputs\":[{\"label\":\"Output\",\"content\":\"Once + upon a time, we knew that our ancestors were on the verge of extinction. The + great explorers and poets of the Old World, from Alexander the Great to Chaucer, + are dead and gone. A good many of our ancient explorers and poets have\",\"type\":\"text\"}]},\"metrics\":[{\"description\":\"Cross + Entropy is a metric that calculates the difference between two probability + distributions. Each probability distribution is the distribution of predicted + words\",\"id\":\"Cross Entropy\"},{\"description\":\"The Perplexity metric + is the exponential of the cross-entropy loss. It evaluates the probabilities + assigned to the next word by the model. Lower perplexity indicates better + performance\",\"id\":\"Perplexity\"}],\"models\":[{\"description\":\"A text-generation + model trained to follow instructions.\",\"id\":\"google/gemma-2-2b-it\"},{\"description\":\"Very + powerful text generation model trained to follow instructions.\",\"id\":\"meta-llama/Meta-Llama-3.1-8B-Instruct\"},{\"description\":\"Small + yet powerful text generation model.\",\"id\":\"microsoft/Phi-3-mini-4k-instruct\"},{\"description\":\"A + very powerful model that can solve mathematical problems.\",\"id\":\"AI-MO/NuminaMath-7B-TIR\"},{\"description\":\"Strong + text generation model to follow instructions.\",\"id\":\"Qwen/Qwen2.5-7B-Instruct\"},{\"description\":\"Very + strong open-source large language model.\",\"id\":\"nvidia/Llama-3.1-Nemotron-70B-Instruct\"}],\"spaces\":[{\"description\":\"A + leaderboard to compare different open-source text generation models based + on various benchmarks.\",\"id\":\"open-llm-leaderboard/open_llm_leaderboard\"},{\"description\":\"A + leaderboard for comparing chain-of-thought performance of models.\",\"id\":\"logikon/open_cot_leaderboard\"},{\"description\":\"An + text generation based application based on a very powerful LLaMA2 model.\",\"id\":\"ysharma/Explore_llamav2_with_TGI\"},{\"description\":\"An + text generation based application to converse with Zephyr model.\",\"id\":\"HuggingFaceH4/zephyr-chat\"},{\"description\":\"A + leaderboard that ranks text generation models based on blind votes from people.\",\"id\":\"lmsys/chatbot-arena-leaderboard\"},{\"description\":\"An + chatbot to converse with a very powerful text generation model.\",\"id\":\"mlabonne/phixtral-chat\"}],\"summary\":\"Generating + text is the task of generating new text given another text. These models can, + for example, fill in incomplete text or paraphrase.\",\"widgetModels\":[\"mistralai/Mistral-Nemo-Instruct-2407\"],\"youtubeId\":\"e9gNEAlsOvU\",\"id\":\"text-generation\",\"label\":\"Text + Generation\",\"libraries\":[\"transformers\",\"transformers.js\"]},\"text-to-image\":{\"datasets\":[{\"description\":\"RedCaps + is a large-scale dataset of 12M image-text pairs collected from Reddit.\",\"id\":\"red_caps\"},{\"description\":\"Conceptual + Captions is a dataset consisting of ~3.3M images annotated with captions.\",\"id\":\"conceptual_captions\"}],\"demo\":{\"inputs\":[{\"label\":\"Input\",\"content\":\"A + city above clouds, pastel colors, Victorian style\",\"type\":\"text\"}],\"outputs\":[{\"filename\":\"image.jpeg\",\"type\":\"img\"}]},\"metrics\":[{\"description\":\"The + Inception Score (IS) measure assesses diversity and meaningfulness. It uses + a generated image sample to predict its label. A higher score signifies more + diverse and meaningful images.\",\"id\":\"IS\"},{\"description\":\"The Fr\xE9chet + Inception Distance (FID) calculates the distance between distributions between + synthetic and real samples. A lower FID score indicates better similarity + between the distributions of real and generated images.\",\"id\":\"FID\"},{\"description\":\"R-precision + assesses how the generated image aligns with the provided text description. + It uses the generated images as queries to retrieve relevant text descriptions. + The top 'r' relevant descriptions are selected and used to calculate R-precision + as r/R, where 'R' is the number of ground truth descriptions associated with + the generated images. A higher R-precision value indicates a better model.\",\"id\":\"R-Precision\"}],\"models\":[{\"description\":\"One + of the most powerful image generation models that can generate realistic outputs.\",\"id\":\"black-forest-labs/FLUX.1-dev\"},{\"description\":\"A + powerful yet fast image generation model.\",\"id\":\"latent-consistency/lcm-lora-sdxl\"},{\"description\":\"Text-to-image + model for photorealistic generation.\",\"id\":\"Kwai-Kolors/Kolors\"},{\"description\":\"A + powerful text-to-image model.\",\"id\":\"stabilityai/stable-diffusion-3-medium-diffusers\"}],\"spaces\":[{\"description\":\"A + powerful text-to-image application.\",\"id\":\"stabilityai/stable-diffusion-3-medium\"},{\"description\":\"A + text-to-image application to generate comics.\",\"id\":\"jbilcke-hf/ai-comic-factory\"},{\"description\":\"An + application to match multiple custom image generation models.\",\"id\":\"multimodalart/flux-lora-lab\"},{\"description\":\"A + powerful yet very fast image generation application.\",\"id\":\"latent-consistency/lcm-lora-for-sdxl\"},{\"description\":\"A + gallery to explore various text-to-image models.\",\"id\":\"multimodalart/LoraTheExplorer\"},{\"description\":\"An + application for `text-to-image`, `image-to-image` and image inpainting.\",\"id\":\"ArtGAN/Stable-Diffusion-ControlNet-WebUI\"},{\"description\":\"An + application to generate realistic images given photos of a person and a prompt.\",\"id\":\"InstantX/InstantID\"}],\"summary\":\"Text-to-image + is the task of generating images from input text. These pipelines can also + be used to modify and edit images based on text prompts.\",\"widgetModels\":[\"black-forest-labs/FLUX.1-dev\"],\"youtubeId\":\"\",\"id\":\"text-to-image\",\"label\":\"Text-to-Image\",\"libraries\":[\"diffusers\"]},\"text-to-speech\":{\"canonicalId\":\"text-to-audio\",\"datasets\":[{\"description\":\"10K + hours of multi-speaker English dataset.\",\"id\":\"parler-tts/mls_eng_10k\"},{\"description\":\"Multi-speaker + English dataset.\",\"id\":\"mythicinfinity/libritts_r\"},{\"description\":\"Mulit-lingual + dataset.\",\"id\":\"facebook/multilingual_librispeech\"}],\"demo\":{\"inputs\":[{\"label\":\"Input\",\"content\":\"I + love audio models on the Hub!\",\"type\":\"text\"}],\"outputs\":[{\"filename\":\"audio.wav\",\"type\":\"audio\"}]},\"metrics\":[{\"description\":\"The + Mel Cepstral Distortion (MCD) metric is used to calculate the quality of generated + speech.\",\"id\":\"mel cepstral distortion\"}],\"models\":[{\"description\":\"A + prompt based, powerful TTS model.\",\"id\":\"parler-tts/parler-tts-large-v1\"},{\"description\":\"A + powerful TTS model that supports English and Chinese.\",\"id\":\"SWivid/F5-TTS\"},{\"description\":\"A + massively multi-lingual TTS model.\",\"id\":\"coqui/XTTS-v2\"},{\"description\":\"A + powerful TTS model.\",\"id\":\"amphion/MaskGCT\"},{\"description\":\"A Llama + based TTS model.\",\"id\":\"OuteAI/OuteTTS-0.1-350M\"}],\"spaces\":[{\"description\":\"An + application for generate highly realistic, multilingual speech.\",\"id\":\"suno/bark\"},{\"description\":\"An + application on XTTS, a voice generation model that lets you clone voices into + different languages.\",\"id\":\"coqui/xtts\"},{\"description\":\"An application + that generates speech in different styles in English and Chinese.\",\"id\":\"mrfakename/E2-F5-TTS\"},{\"description\":\"An + application that synthesizes emotional speech for diverse speaker prompts.\",\"id\":\"parler-tts/parler-tts-expresso\"}],\"summary\":\"Text-to-Speech + (TTS) is the task of generating natural sounding speech given text input. + TTS models can be extended to have a single model that generates speech for + multiple speakers and multiple languages.\",\"widgetModels\":[\"suno/bark\"],\"youtubeId\":\"NW62DpzJ274\",\"id\":\"text-to-speech\",\"label\":\"Text-to-Speech\",\"libraries\":[\"espnet\",\"tensorflowtts\",\"transformers\",\"transformers.js\"]},\"text-to-video\":{\"datasets\":[{\"description\":\"Microsoft + Research Video to Text is a large-scale dataset for open domain video captioning\",\"id\":\"iejMac/CLIP-MSR-VTT\"},{\"description\":\"UCF101 + Human Actions dataset consists of 13,320 video clips from YouTube, with 101 + classes.\",\"id\":\"quchenyuan/UCF101-ZIP\"},{\"description\":\"A high-quality + dataset for human action recognition in YouTube videos.\",\"id\":\"nateraw/kinetics\"},{\"description\":\"A + dataset of video clips of humans performing pre-defined basic actions with + everyday objects.\",\"id\":\"HuggingFaceM4/something_something_v2\"},{\"description\":\"This + dataset consists of text-video pairs and contains noisy samples with irrelevant + video descriptions\",\"id\":\"HuggingFaceM4/webvid\"},{\"description\":\"A + dataset of short Flickr videos for the temporal localization of events with + descriptions.\",\"id\":\"iejMac/CLIP-DiDeMo\"}],\"demo\":{\"inputs\":[{\"label\":\"Input\",\"content\":\"Darth + Vader is surfing on the waves.\",\"type\":\"text\"}],\"outputs\":[{\"filename\":\"text-to-video-output.gif\",\"type\":\"img\"}]},\"metrics\":[{\"description\":\"Inception + Score uses an image classification model that predicts class labels and evaluates + how distinct and diverse the images are. A higher score indicates better video + generation.\",\"id\":\"is\"},{\"description\":\"Frechet Inception Distance + uses an image classification model to obtain image embeddings. The metric + compares mean and standard deviation of the embeddings of real and generated + images. A smaller score indicates better video generation.\",\"id\":\"fid\"},{\"description\":\"Frechet + Video Distance uses a model that captures coherence for changes in frames + and the quality of each frame. A smaller score indicates better video generation.\",\"id\":\"fvd\"},{\"description\":\"CLIPSIM + measures similarity between video frames and text using an image-text similarity + model. A higher score indicates better video generation.\",\"id\":\"clipsim\"}],\"models\":[{\"description\":\"A + strong model for consistent video generation.\",\"id\":\"rain1011/pyramid-flow-sd3\"},{\"description\":\"A + robust model for text-to-video generation.\",\"id\":\"VideoCrafter/VideoCrafter2\"},{\"description\":\"A + cutting-edge text-to-video generation model.\",\"id\":\"TIGER-Lab/T2V-Turbo-V2\"}],\"spaces\":[{\"description\":\"An + application that generates video from text.\",\"id\":\"VideoCrafter/VideoCrafter\"},{\"description\":\"Consistent + video generation application.\",\"id\":\"TIGER-Lab/T2V-Turbo-V2\"},{\"description\":\"A + cutting edge video generation application.\",\"id\":\"Pyramid-Flow/pyramid-flow\"}],\"summary\":\"Text-to-video + models can be used in any application that requires generating consistent + sequence of images from text. \",\"widgetModels\":[],\"id\":\"text-to-video\",\"label\":\"Text-to-Video\",\"libraries\":[\"diffusers\"]},\"token-classification\":{\"datasets\":[{\"description\":\"A + widely used dataset useful to benchmark named entity recognition models.\",\"id\":\"eriktks/conll2003\"},{\"description\":\"A + multilingual dataset of Wikipedia articles annotated for named entity recognition + in over 150 different languages.\",\"id\":\"unimelb-nlp/wikiann\"}],\"demo\":{\"inputs\":[{\"label\":\"Input\",\"content\":\"My + name is Omar and I live in Z\xFCrich.\",\"type\":\"text\"}],\"outputs\":[{\"text\":\"My + name is Omar and I live in Z\xFCrich.\",\"tokens\":[{\"type\":\"PERSON\",\"start\":11,\"end\":15},{\"type\":\"GPE\",\"start\":30,\"end\":36}],\"type\":\"text-with-tokens\"}]},\"metrics\":[{\"description\":\"\",\"id\":\"accuracy\"},{\"description\":\"\",\"id\":\"recall\"},{\"description\":\"\",\"id\":\"precision\"},{\"description\":\"\",\"id\":\"f1\"}],\"models\":[{\"description\":\"A + robust performance model to identify people, locations, organizations and + names of miscellaneous entities.\",\"id\":\"dslim/bert-base-NER\"},{\"description\":\"A + strong model to identify people, locations, organizations and names in multiple + languages.\",\"id\":\"FacebookAI/xlm-roberta-large-finetuned-conll03-english\"},{\"description\":\"A + token classification model specialized on medical entity recognition.\",\"id\":\"blaze999/Medical-NER\"},{\"description\":\"Flair + models are typically the state of the art in named entity recognition tasks.\",\"id\":\"flair/ner-english\"}],\"spaces\":[{\"description\":\"An + application that can recognizes entities, extracts noun chunks and recognizes + various linguistic features of each token.\",\"id\":\"spacy/gradio_pipeline_visualizer\"}],\"summary\":\"Token + classification is a natural language understanding task in which a label is + assigned to some tokens in a text. Some popular token classification subtasks + are Named Entity Recognition (NER) and Part-of-Speech (PoS) tagging. NER models + could be trained to identify specific entities in a text, such as dates, individuals + and places; and PoS tagging would identify, for example, which words in a + text are verbs, nouns, and punctuation marks.\",\"widgetModels\":[\"FacebookAI/xlm-roberta-large-finetuned-conll03-english\"],\"youtubeId\":\"wVHdVlPScxA\",\"id\":\"token-classification\",\"label\":\"Token + Classification\",\"libraries\":[\"adapter-transformers\",\"flair\",\"spacy\",\"span-marker\",\"stanza\",\"transformers\",\"transformers.js\"]},\"translation\":{\"canonicalId\":\"text2text-generation\",\"datasets\":[{\"description\":\"A + dataset of copyright-free books translated into 16 different languages.\",\"id\":\"Helsinki-NLP/opus_books\"},{\"description\":\"An + example of translation between programming languages. This dataset consists + of functions in Java and C#.\",\"id\":\"google/code_x_glue_cc_code_to_code_trans\"}],\"demo\":{\"inputs\":[{\"label\":\"Input\",\"content\":\"My + name is Omar and I live in Z\xFCrich.\",\"type\":\"text\"}],\"outputs\":[{\"label\":\"Output\",\"content\":\"Mein + Name ist Omar und ich wohne in Z\xFCrich.\",\"type\":\"text\"}]},\"metrics\":[{\"description\":\"BLEU + score is calculated by counting the number of shared single or subsequent + tokens between the generated sequence and the reference. Subsequent n tokens + are called \u201Cn-grams\u201D. Unigram refers to a single token while bi-gram + refers to token pairs and n-grams refer to n subsequent tokens. The score + ranges from 0 to 1, where 1 means the translation perfectly matched and 0 + did not match at all\",\"id\":\"bleu\"},{\"description\":\"\",\"id\":\"sacrebleu\"}],\"models\":[{\"description\":\"Very + powerful model that can translate many languages between each other, especially + low-resource languages.\",\"id\":\"facebook/nllb-200-1.3B\"},{\"description\":\"A + general-purpose Transformer that can be used to translate from English to + German, French, or Romanian.\",\"id\":\"google-t5/t5-base\"}],\"spaces\":[{\"description\":\"An + application that can translate between 100 languages.\",\"id\":\"Iker/Translate-100-languages\"},{\"description\":\"An + application that can translate between many languages.\",\"id\":\"Geonmo/nllb-translation-demo\"}],\"summary\":\"Translation + is the task of converting text from one language to another.\",\"widgetModels\":[\"facebook/mbart-large-50-many-to-many-mmt\"],\"youtubeId\":\"1JvfrvZgi6c\",\"id\":\"translation\",\"label\":\"Translation\",\"libraries\":[\"transformers\",\"transformers.js\"]},\"unconditional-image-generation\":{\"datasets\":[{\"description\":\"The + CIFAR-100 dataset consists of 60000 32x32 colour images in 100 classes, with + 600 images per class.\",\"id\":\"cifar100\"},{\"description\":\"Multiple images + of celebrities, used for facial expression translation.\",\"id\":\"CelebA\"}],\"demo\":{\"inputs\":[{\"label\":\"Seed\",\"content\":\"42\",\"type\":\"text\"},{\"label\":\"Number + of images to generate:\",\"content\":\"4\",\"type\":\"text\"}],\"outputs\":[{\"filename\":\"unconditional-image-generation-output.jpeg\",\"type\":\"img\"}]},\"metrics\":[{\"description\":\"The + inception score (IS) evaluates the quality of generated images. It measures + the diversity of the generated images (the model predictions are evenly distributed + across all possible labels) and their 'distinction' or 'sharpness' (the model + confidently predicts a single label for each image).\",\"id\":\"Inception + score (IS)\"},{\"description\":\"The Fr\xE9chet Inception Distance (FID) evaluates + the quality of images created by a generative model by calculating the distance + between feature vectors for real and generated images.\",\"id\":\"Fre\u0107het + Inception Distance (FID)\"}],\"models\":[{\"description\":\"High-quality image + generation model trained on the CIFAR-10 dataset. It synthesizes images of + the ten classes presented in the dataset using diffusion probabilistic models, + a class of latent variable models inspired by considerations from nonequilibrium + thermodynamics.\",\"id\":\"google/ddpm-cifar10-32\"},{\"description\":\"High-quality + image generation model trained on the 256x256 CelebA-HQ dataset. It synthesizes + images of faces using diffusion probabilistic models, a class of latent variable + models inspired by considerations from nonequilibrium thermodynamics.\",\"id\":\"google/ddpm-celebahq-256\"}],\"spaces\":[{\"description\":\"An + application that can generate realistic faces.\",\"id\":\"CompVis/celeba-latent-diffusion\"}],\"summary\":\"Unconditional + image generation is the task of generating images with no condition in any + context (like a prompt text or another image). Once trained, the model will + create images that resemble its training data distribution.\",\"widgetModels\":[\"\"],\"youtubeId\":\"\",\"id\":\"unconditional-image-generation\",\"label\":\"Unconditional + Image Generation\",\"libraries\":[\"diffusers\"]},\"video-text-to-text\":{\"datasets\":[{\"description\":\"Multiple-choice + questions and answers about videos.\",\"id\":\"lmms-lab/Video-MME\"},{\"description\":\"A + dataset of instructions and question-answer pairs about videos.\",\"id\":\"lmms-lab/VideoChatGPT\"},{\"description\":\"Large + video understanding dataset.\",\"id\":\"HuggingFaceFV/finevideo\"}],\"demo\":{\"inputs\":[{\"filename\":\"video-text-to-text-input.gif\",\"type\":\"img\"},{\"label\":\"Text + Prompt\",\"content\":\"What is happening in this video?\",\"type\":\"text\"}],\"outputs\":[{\"label\":\"Answer\",\"content\":\"The + video shows a series of images showing a fountain with water jets and a variety + of colorful flowers and butterflies in the background.\",\"type\":\"text\"}]},\"metrics\":[],\"models\":[{\"description\":\"A + robust video-text-to-text model that can take in image and video inputs.\",\"id\":\"llava-hf/llava-onevision-qwen2-72b-ov-hf\"},{\"description\":\"Large + and powerful video-text-to-text model that can take in image and video inputs.\",\"id\":\"llava-hf/LLaVA-NeXT-Video-34B-hf\"}],\"spaces\":[{\"description\":\"An + application to chat with a video-text-to-text model.\",\"id\":\"llava-hf/video-llava\"},{\"description\":\"A + leaderboard for various video-text-to-text models.\",\"id\":\"opencompass/openvlm_video_leaderboard\"}],\"summary\":\"Video-text-to-text + models take in a video and a text prompt and output text. These models are + also called video-language models.\",\"widgetModels\":[\"\"],\"youtubeId\":\"\",\"id\":\"video-text-to-text\",\"label\":\"Video-Text-to-Text\",\"libraries\":[\"transformers\"]},\"visual-question-answering\":{\"datasets\":[{\"description\":\"A + widely used dataset containing questions (with answers) about images.\",\"id\":\"Graphcore/vqa\"},{\"description\":\"A + dataset to benchmark visual reasoning based on text in images.\",\"id\":\"facebook/textvqa\"}],\"demo\":{\"inputs\":[{\"filename\":\"elephant.jpeg\",\"type\":\"img\"},{\"label\":\"Question\",\"content\":\"What + is in this image?\",\"type\":\"text\"}],\"outputs\":[{\"type\":\"chart\",\"data\":[{\"label\":\"elephant\",\"score\":0.97},{\"label\":\"elephants\",\"score\":0.06},{\"label\":\"animal\",\"score\":0.003}]}]},\"isPlaceholder\":false,\"metrics\":[{\"description\":\"\",\"id\":\"accuracy\"},{\"description\":\"Measures + how much a predicted answer differs from the ground truth based on the difference + in their semantic meaning.\",\"id\":\"wu-palmer similarity\"}],\"models\":[{\"description\":\"A + visual question answering model trained to convert charts and plots to text.\",\"id\":\"google/deplot\"},{\"description\":\"A + visual question answering model trained for mathematical reasoning and chart + derendering from images.\",\"id\":\"google/matcha-base\"},{\"description\":\"A + strong visual question answering that answers questions from book covers.\",\"id\":\"google/pix2struct-ocrvqa-large\"}],\"spaces\":[{\"description\":\"An + application that compares visual question answering models across different + tasks.\",\"id\":\"merve/pix2struct\"},{\"description\":\"An application that + can answer questions based on images.\",\"id\":\"nielsr/vilt-vqa\"},{\"description\":\"An + application that can caption images and answer questions about a given image. + \",\"id\":\"Salesforce/BLIP\"},{\"description\":\"An application that can + caption images and answer questions about a given image. \",\"id\":\"vumichien/Img2Prompt\"}],\"summary\":\"Visual + Question Answering is the task of answering open-ended questions based on + an image. They output natural language responses to natural language questions.\",\"widgetModels\":[\"dandelin/vilt-b32-finetuned-vqa\"],\"youtubeId\":\"\",\"id\":\"visual-question-answering\",\"label\":\"Visual + Question Answering\",\"libraries\":[\"transformers\",\"transformers.js\"]},\"zero-shot-classification\":{\"datasets\":[{\"description\":\"A + widely used dataset used to benchmark multiple variants of text classification.\",\"id\":\"nyu-mll/glue\"},{\"description\":\"The + Multi-Genre Natural Language Inference (MultiNLI) corpus is a crowd-sourced + collection of 433k sentence pairs annotated with textual entailment information.\",\"id\":\"nyu-mll/multi_nli\"},{\"description\":\"FEVER + is a publicly available dataset for fact extraction and verification against + textual sources.\",\"id\":\"fever/fever\"}],\"demo\":{\"inputs\":[{\"label\":\"Text + Input\",\"content\":\"Dune is the best movie ever.\",\"type\":\"text\"},{\"label\":\"Candidate + Labels\",\"content\":\"CINEMA, ART, MUSIC\",\"type\":\"text\"}],\"outputs\":[{\"type\":\"chart\",\"data\":[{\"label\":\"CINEMA\",\"score\":0.9},{\"label\":\"ART\",\"score\":0.1},{\"label\":\"MUSIC\",\"score\":0}]}]},\"metrics\":[],\"models\":[{\"description\":\"Powerful + zero-shot text classification model.\",\"id\":\"facebook/bart-large-mnli\"},{\"description\":\"Powerful + zero-shot multilingual text classification model that can accomplish multiple + tasks.\",\"id\":\"MoritzLaurer/mDeBERTa-v3-base-xnli-multilingual-nli-2mil7\"}],\"spaces\":[],\"summary\":\"Zero-shot + text classification is a task in natural language processing where a model + is trained on a set of labeled examples but is then able to classify new examples + from previously unseen classes.\",\"widgetModels\":[\"facebook/bart-large-mnli\"],\"id\":\"zero-shot-classification\",\"label\":\"Zero-Shot + Classification\",\"libraries\":[\"transformers\",\"transformers.js\"]},\"zero-shot-image-classification\":{\"datasets\":[{\"description\":\"\",\"id\":\"\"}],\"demo\":{\"inputs\":[{\"filename\":\"image-classification-input.jpeg\",\"type\":\"img\"},{\"label\":\"Classes\",\"content\":\"cat, + dog, bird\",\"type\":\"text\"}],\"outputs\":[{\"type\":\"chart\",\"data\":[{\"label\":\"Cat\",\"score\":0.664},{\"label\":\"Dog\",\"score\":0.329},{\"label\":\"Bird\",\"score\":0.008}]}]},\"metrics\":[{\"description\":\"Computes + the number of times the correct label appears in top K labels predicted\",\"id\":\"top-K + accuracy\"}],\"models\":[{\"description\":\"Robust image classification model + trained on publicly available image-caption data.\",\"id\":\"openai/clip-vit-base-patch16\"},{\"description\":\"Strong + zero-shot image classification model.\",\"id\":\"google/siglip-so400m-patch14-224\"},{\"description\":\"Small + yet powerful zero-shot image classification model that can run on edge devices.\",\"id\":\"apple/MobileCLIP-S1-OpenCLIP\"},{\"description\":\"Strong + image classification model for biomedical domain.\",\"id\":\"microsoft/BiomedCLIP-PubMedBERT_256-vit_base_patch16_224\"}],\"spaces\":[{\"description\":\"An + application that leverages zero-shot image classification to find best captions + to generate an image. \",\"id\":\"pharma/CLIP-Interrogator\"},{\"description\":\"An + application to compare different zero-shot image classification models. \",\"id\":\"merve/compare_clip_siglip\"}],\"summary\":\"Zero-shot + image classification is the task of classifying previously unseen classes + during training of a model.\",\"widgetModels\":[\"google/siglip-so400m-patch14-224\"],\"youtubeId\":\"\",\"id\":\"zero-shot-image-classification\",\"label\":\"Zero-Shot + Image Classification\",\"libraries\":[\"transformers\",\"transformers.js\"]},\"zero-shot-object-detection\":{\"datasets\":[],\"demo\":{\"inputs\":[{\"filename\":\"zero-shot-object-detection-input.jpg\",\"type\":\"img\"},{\"label\":\"Classes\",\"content\":\"cat, + dog, bird\",\"type\":\"text\"}],\"outputs\":[{\"filename\":\"zero-shot-object-detection-output.jpg\",\"type\":\"img\"}]},\"metrics\":[{\"description\":\"The + Average Precision (AP) metric is the Area Under the PR Curve (AUC-PR). It + is calculated for each class separately\",\"id\":\"Average Precision\"},{\"description\":\"The + Mean Average Precision (mAP) metric is the overall average of the AP values\",\"id\":\"Mean + Average Precision\"},{\"description\":\"The AP\u03B1 metric is the Average + Precision at the IoU threshold of a \u03B1 value, for example, AP50 and AP75\",\"id\":\"AP\u03B1\"}],\"models\":[{\"description\":\"Solid + zero-shot object detection model.\",\"id\":\"IDEA-Research/grounding-dino-base\"},{\"description\":\"Cutting-edge + zero-shot object detection model.\",\"id\":\"google/owlv2-base-patch16-ensemble\"}],\"spaces\":[{\"description\":\"A + demo to try the state-of-the-art zero-shot object detection model, OWLv2.\",\"id\":\"merve/owlv2\"},{\"description\":\"A + demo that combines a zero-shot object detection and mask generation model + for zero-shot segmentation.\",\"id\":\"merve/OWLSAM\"}],\"summary\":\"Zero-shot + object detection is a computer vision task to detect objects and their classes + in images, without any prior training or knowledge of the classes. Zero-shot + object detection models receive an image as input, as well as a list of candidate + classes, and output the bounding boxes and labels where the objects have been + detected.\",\"widgetModels\":[],\"youtubeId\":\"\",\"id\":\"zero-shot-object-detection\",\"label\":\"Zero-Shot + Object Detection\",\"libraries\":[\"transformers\",\"transformers.js\"]},\"text-to-3d\":{\"datasets\":[{\"description\":\"A + large dataset of over 10 million 3D objects.\",\"id\":\"allenai/objaverse-xl\"},{\"description\":\"Descriptive + captions for 3D objects in Objaverse.\",\"id\":\"tiange/Cap3D\"}],\"demo\":{\"inputs\":[{\"label\":\"Prompt\",\"content\":\"a + cat statue\",\"type\":\"text\"}],\"outputs\":[{\"label\":\"Result\",\"content\":\"text-to-3d-3d-output-filename.glb\",\"type\":\"text\"}]},\"metrics\":[],\"models\":[{\"description\":\"Text-to-3D + mesh model by OpenAI\",\"id\":\"openai/shap-e\"},{\"description\":\"Generative + 3D gaussian splatting model.\",\"id\":\"ashawkey/LGM\"}],\"spaces\":[{\"description\":\"Text-to-3D + demo with mesh outputs.\",\"id\":\"hysts/Shap-E\"},{\"description\":\"Text/image-to-3D + demo with splat outputs.\",\"id\":\"ashawkey/LGM\"}],\"summary\":\"Text-to-3D + models take in text input and produce 3D output.\",\"widgetModels\":[],\"youtubeId\":\"\",\"id\":\"text-to-3d\",\"label\":\"Text-to-3D\",\"libraries\":[\"diffusers\"]},\"image-to-3d\":{\"datasets\":[{\"description\":\"A + large dataset of over 10 million 3D objects.\",\"id\":\"allenai/objaverse-xl\"},{\"description\":\"A + dataset of isolated object images for evaluating image-to-3D models.\",\"id\":\"dylanebert/iso3d\"}],\"demo\":{\"inputs\":[{\"filename\":\"image-to-3d-image-input.png\",\"type\":\"img\"}],\"outputs\":[{\"label\":\"Result\",\"content\":\"image-to-3d-3d-output-filename.glb\",\"type\":\"text\"}]},\"metrics\":[],\"models\":[{\"description\":\"Fast + image-to-3D mesh model by Tencent.\",\"id\":\"TencentARC/InstantMesh\"},{\"description\":\"Fast + image-to-3D mesh model by StabilityAI\",\"id\":\"stabilityai/TripoSR\"},{\"description\":\"A + scaled up image-to-3D mesh model derived from TripoSR.\",\"id\":\"hwjiang/Real3D\"},{\"description\":\"Generative + 3D gaussian splatting model.\",\"id\":\"ashawkey/LGM\"}],\"spaces\":[{\"description\":\"Leaderboard + to evaluate image-to-3D models.\",\"id\":\"dylanebert/3d-arena\"},{\"description\":\"Image-to-3D + demo with mesh outputs.\",\"id\":\"TencentARC/InstantMesh\"},{\"description\":\"Image-to-3D + demo with mesh outputs.\",\"id\":\"stabilityai/TripoSR\"},{\"description\":\"Image-to-3D + demo with mesh outputs.\",\"id\":\"hwjiang/Real3D\"},{\"description\":\"Image-to-3D + demo with splat outputs.\",\"id\":\"dylanebert/LGM-mini\"}],\"summary\":\"Image-to-3D + models take in image input and produce 3D output.\",\"widgetModels\":[],\"youtubeId\":\"\",\"id\":\"image-to-3d\",\"label\":\"Image-to-3D\",\"libraries\":[\"diffusers\"]}}" + headers: + Access-Control-Allow-Origin: + - https://huggingface.co + Access-Control-Expose-Headers: + - X-Repo-Commit,X-Request-Id,X-Error-Code,X-Error-Message,X-Total-Count,ETag,Link,Accept-Ranges,Content-Range,X-Xet-Access-Token,X-Xet-Token-Expiration,X-Xet-Refresh-Route,X-Xet-Cas-Url,X-Xet-Hash + Connection: + - keep-alive + Content-Length: + - '74829' + Content-Type: + - application/json; charset=utf-8 + Date: + - Tue, 14 Jan 2025 20:13:50 GMT + ETag: + - W/"1244d-rY02FKAQRZwcoD2xI/AqH93OPBg" + Referrer-Policy: + - strict-origin-when-cross-origin + Vary: + - Origin + Via: + - 1.1 35355924f46c950b55083d4e005a04dc.cloudfront.net (CloudFront) + X-Amz-Cf-Id: + - HYZ6V8aU_NDXPoCnKN-ysY4-QGY_LR6v-nwHr6E81xgTrEfk1fFeug== + X-Amz-Cf-Pop: + - BOG50-C1 + X-Cache: + - Miss from cloudfront + X-Powered-By: + - huggingface-moon + X-Request-Id: + - Root=1-6786c57e-257921ef2336c25b1f5c5f8e;964b3b38-f229-4b27-8441-35ae7f273c74 + cross-origin-opener-policy: + - same-origin + status: + code: 200 + message: OK - request: body: !!python/object/new:_io.BytesIO state: !!python/tuple @@ -778,7 +1525,7 @@ interactions: Content-Length: - '43467' X-Amzn-Trace-Id: - - 860551b8-e9aa-43d0-a5d4-632ecfb829e1 + - 85e10bbf-e1e4-4b9e-bbb6-023715775eb0 authorization: - DUMMY user-agent: @@ -791,31 +1538,25 @@ interactions: headers: Connection: - keep-alive + Content-Length: + - '24' Content-Type: - application/json Date: - - Wed, 18 Dec 2024 20:50:26 GMT - Transfer-Encoding: - - chunked + - Tue, 14 Jan 2025 20:13:50 GMT access-control-allow-credentials: - 'true' - access-control-expose-headers: - - x-compute-type, x-compute-time - server: - - uvicorn vary: - Origin, Access-Control-Request-Method, Access-Control-Request-Headers - x-compute-audio-length: - - '1.358375' x-compute-time: - - '0.382' + - '0.385' x-compute-type: - - gpu + - cache x-request-id: - - gMcwkFbYz7T1nKvF2p6Or + - iRquVbkGRI2f-fQlS9qIs x-sha: - 06f233fe06e710322aca913c1bc4249a0d71fce1 status: code: 200 message: OK -version: 1 \ No newline at end of file +version: 1 diff --git a/tests/cassettes/test_huggingface_hub_speech_to_text_async.yaml b/tests/cassettes/test_huggingface_hub_speech_to_text_async.yaml new file mode 100644 index 0000000..39d3852 --- /dev/null +++ b/tests/cassettes/test_huggingface_hub_speech_to_text_async.yaml @@ -0,0 +1,801 @@ +interactions: +- request: + body: !!binary | + //vQZAAP8AAAaQAAAAgAAA0gAAABAAAAAAAAACAAAAAAAAAETEFNRTMuMTAwVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTMuMTAwVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVRwSADK8zMwwLUZYQFZYXzG6/WquJ8wZXHKpUgG9VR6Pw+hmEYeB+cRxRuo4zA7WJ0Ja + Ow2Ig7nC9gr/DAdKF6SlguJQ6yZkywqmSGqSRMCPFhxhMWEZBGo+EDuBpcWgJlxrEbOCZgH4dpZw + QGLKIyggFi2NKzglBICiqiZZxyBj84PYAcA1uHcE1wsqDoh7EO2A6gLIB14KkV+9YyIYhYHCDYDm + AOMMaIS2CypqoHMiL7H8MC+D1LNRAzz0EAXHKpAUDTGQWGhAiAwcGBUFHABGUSBigZHiRLpBUmCi + IBEgoDCpj4ALNIRClZ+ZwBGSg4YKBAEJGoYtDzwDrkOzzUgw0MnMoKDCxkwIgHQ1SinFAAkAQEDC + Q6LDYOAEAwCCQhBHlcaNTHwUwYAR/DAAIE0HFIGHiJhQ0FzsAnBjyGaueG8FIaZi6edMUAYbAwAj + 2AA5LgZ3zr42vpSjZmKh8WQmYlpzMewJkds7Ld2HJluzh2InZf/70mS6DMAIAIABIAAIASAQACQA + ASmxqEBGZ3zlFCoFzM53kBOZpDAwu6T19qlSJYYcruVzarb754Vye80TmocwcunGDmSHAzgdTOp0 + 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 + CHCBuMMoDcQcP/H8fyEIUfx+kJx+H8fiFFyi5h/ISQouUXMP4uQhRco/SFVMQU1FMy4xMDBVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+9JkAA/wDQCAAeAACAGgEAA8AAEA + IAIAAwAAIAQAQABgAAQJIDMBgZMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVf/70mQAD/AAAGkAAAAIAAANIAAAAQAAAaQAAAAgAAA0gAAABExBTUUz + LjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVM + QU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//vS + ZAAP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAETEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUxBTUUzLjEwMFVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+9BkAA/wAABpAAAACAAADSAAAAEA + AAGkAAAAIAAANIAAAARMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVV//vSZAAP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAETEFNRTMu + MTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUxB + TUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+9Jk + AA/wAABpAAAACAAADSAAAAEAAAGkAAAAIAAANIAAAARMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTMuMTAwVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/70mQAD/AAAGkAAAAIAAANIAAAAQAA + AaQAAAAgAAA0gAAABExBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVV//vSZAAP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAETEFNRTMu + MTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUxB + TUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+9Jk + AA/wAABpAAAACAAADSAAAAEAAAGkAAAAIAAANIAAAARMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTMuMTAwVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/70mQAD/AAAGkAAAAIAAANIAAAAQAA + AaQAAAAgAAA0gAAABExBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVV//vSZAAP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAETEFNRTMu + MTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUxB + TUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+9Jk + AA/wAABpAAAACAAADSAAAAEAAAGkAAAAIAAANIAAAARMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTMuMTAwVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/70mQAD/AAAGkAAAAIAAANIAAAAQAA + AaQAAAAgAAA0gAAABExBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVV//vSZAAP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAETEFNRTMu + MTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUxB + TUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+9Jk + AA/wAABpAAAACAAADSAAAAEAAAGkAAAAIAAANIAAAARMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTMuMTAwVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/70GQAD/AAAGkAAAAIAAANIAAAAQAA + AaQAAAAgAAA0gAAABExBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVUxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVX/+9JkAA/wAABpAAAACAAADSAAAAEAAAGkAAAAIAAANIAAAARMQU1FMy4x + MDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFN + RTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/70mQA + D/AAAGkAAAAIAAANIAAAAQAAAaQAAAAgAAA0gAAABExBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV + headers: + authorization: + - DUMMY + user-agent: + - unknown/None; hf_hub/0.26.5; python/3.12.8 + method: POST + uri: https://api-inference.huggingface.co/models/openai/whisper-large-v3 + response: + body: + string: '{"text":" Hello there!"}' + headers: + Access-Control-Allow-Credentials: + - 'true' + Connection: + - keep-alive + Content-Length: + - '24' + Content-Type: + - application/json + Date: + - Tue, 14 Jan 2025 20:13:51 GMT + Vary: + - Origin, Access-Control-Request-Method, Access-Control-Request-Headers + x-compute-time: + - '0.385' + x-compute-type: + - cache + x-request-id: + - CZudiRccGGZDZYMgR9S4S + x-sha: + - 06f233fe06e710322aca913c1bc4249a0d71fce1 + status: + code: 200 + message: OK +version: 1 diff --git a/tests/test_huggingface_tracer.py b/tests/test_huggingface_tracer.py index 6684851..efdc8ab 100644 --- a/tests/test_huggingface_tracer.py +++ b/tests/test_huggingface_tracer.py @@ -105,18 +105,25 @@ def test_huggingface_hub_speech_to_text(tracer_init): audio=(datadir / "hello_there.mp3").as_posix() ) assert getattr(response, "scope3ai") is not None + assert response.scope3ai.impact is None + assert response.scope3ai.request.request_duration_ms == 385.0 + assert response.scope3ai.request.input_audio_seconds == 0 -# TODO: Find a way to make it works with vcr -# @pytest.mark.vcr -# @pytest.mark.asyncio -# async def test_huggingface_hub_speech_to_text_async(tracer_init): -# datadir = Path(__file__).parent / "data" -# client = AsyncInferenceClient() -# response = await client.automatic_speech_recognition( -# audio=(datadir / "hello_there.mp3").as_posix(), -# model="jonatasgrosman/wav2vec2-large-xlsr-53-english" -# ) +@pytest.mark.vcr +@pytest.mark.asyncio +async def test_huggingface_hub_speech_to_text_async(tracer_init): + client = AsyncInferenceClient() + datadir = Path(__file__).parent / "data" + hello_there_audio = open((datadir / "hello_there.mp3").as_posix(), "rb") + hello_there_audio_bytes = hello_there_audio.read() + response = await client.automatic_speech_recognition( + audio=hello_there_audio_bytes, + ) + assert getattr(response, "scope3ai") is not None + assert response.scope3ai.impact is None + assert response.scope3ai.request.request_duration_ms == 385.0 + assert response.scope3ai.request.input_audio_seconds == 0 @pytest.mark.vcr