Buckets:

rtrm's picture
|
download
raw
13.6 kB
# Понимание класса Interface[[understanding-the-interface-class]]
<CourseFloatingBanner chapter={9}
classNames="absolute z-10 right-0 top-0"
notebooks={[
{label: "Google Colab", value: "https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/en/chapter9/section3.ipynb"},
{label: "Aws Studio", value: "https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/en/chapter9/section3.ipynb"},
]} />
В этом разделе мы подробно рассмотрим класс `Interface` и разберем
основные параметры, используемые для его создания.
## Как создать Interface[[how-to-create-an-interface]]
Вы заметите, что класс `Interface` имеет 3 обязательных параметра:
`Interface(fn, inputs, outputs, ...)`
Это параметры:
- `fn`: функция прогнозирования, обернутая интерфейсом Gradio. Эта функция может принимать один или несколько параметров и возвращать одно или несколько значений
- `inputs`: тип(ы) компонента(ов) ввода. Gradio предоставляет множество готовых компонентов, таких как `"image"` или `"mic"`.
- `outputs`: тип(ы) компонента(ов) вывода. Опять же, Gradio предоставляет множество предварительно созданных компонентов, например, `" image"` или `"label"`.
Полный список компонентов [смотрите в документации Gradio](https://gradio.app/docs). Каждый предварительно созданный компонент можно настроить, инстанцировав соответствующий ему класс.
Например, как мы видели в [предыдущем разделе](../chapter9/2),
вместо передачи `"textbox"` в параметр `inputs`, вы можете передать компонент `Textbox(lines=7, label="Prompt")` для создания текстового поля с 7 строками и меткой.
Давайте рассмотрим еще один пример, на этот раз с компонентом `Audio`.
## Простой пример со звуком[[a-simple-example-with-audio]]
Как уже говорилось, Gradio предоставляет множество различных входов и выходов.
Поэтому давайте создадим `Interface`, работающий с аудио.
В этом примере мы создадим функцию audio-to-audio, которая принимает
аудиофайл и просто переворачивает его.
Для ввода мы будем использовать компонент `Audio`. При использовании компонента `Audio`,
вы можете указать, будет ли источником звука файл, который загружает пользователь
или микрофон, с помощью которого пользователь записывает свой голос. В данном случае давайте
зададим `"microphone"`. Просто ради интереса добавим к `Audio` метку, которая будет гласить
"Speak here...".
Кроме того, мы хотели бы получать аудио в виде массива numpy, чтобы можно было легко
"перевернуть" его. Поэтому мы зададим `"type"` в значение `"numpy"`, которое передаст входные
данные в виде кортежа (`sample_rate`, `data`) в нашу функцию.
Мы также будем использовать компонент вывода `Audio`, который может автоматически
рендерить кортеж с частотой дискретизации и массивом данных numpy в воспроизводимый аудиофайл.
В этом случае нам не нужно делать никаких настроек, поэтому мы будем использовать строку
ярлык `"audio"`.
```py
import numpy as np
import gradio as gr
def reverse_audio(audio):
sr, data = audio
reversed_audio = (sr, np.flipud(data))
return reversed_audio
mic = gr.Audio(source="microphone", type="numpy", label="Speak here...")
gr.Interface(reverse_audio, mic, "audio").launch()
```
Код, приведенный выше, создаст интерфейс, подобный приведенному ниже (если ваш браузер не
не запрашивает разрешения на использование микрофона, <a href="https://huggingface.co/spaces/course-demos/audio-reverse" target="_blank">откройте демо в отдельной вкладке</a>.)
<iframe src="https://course-demos-audio-reverse.hf.space" frameBorder="0" height="250" title="Gradio app" class="container p-0 flex-grow space-iframe" allow="accelerometer; ambient-light-sensor; autoplay; battery; camera; document-domain; encrypted-media; fullscreen; geolocation; gyroscope; layout-animations; legacy-image-formats; magnetometer; microphone; midi; oversized-images; payment; picture-in-picture; publickey-credentials-get; sync-xhr; usb; vr ; wake-lock; xr-spatial-tracking" sandbox="allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads"></iframe>
Теперь вы сможете записать свой голос и услышать, как вы говорите в обратную сторону - жутковато 👻!
## Обработка нескольких входов и выходов[[handling-multiple-inputs-and-outputs]]
Допустим, у нас есть более сложная функция, с несколькими входами и выходами.
В примере ниже у нас есть функция, которая принимает индекс выпадающего списка, значение слайдера и число,
и возвращает пример музыкального тона.
Посмотрите, как мы передаем список входных и выходных компонентов,
и посмотрите, сможете ли вы проследить за тем, что происходит.
Ключевым моментом здесь является то, что когда вы передаете:
* список входных компонентов, каждый компонент соответствует параметру по порядку.
* список выходных компонентов, каждый компонент соответствует возвращаемому значению.
В приведенном ниже фрагменте кода показано, как три компонента ввода соответствуют трем аргументам функции `generate_tone()`:
```py
import numpy as np
import gradio as gr
notes = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"]
def generate_tone(note, octave, duration):
sr = 48000
a4_freq, tones_from_a4 = 440, 12 * (octave - 4) + (note - 9)
frequency = a4_freq * 2 ** (tones_from_a4 / 12)
duration = int(duration)
audio = np.linspace(0, duration, duration * sr)
audio = (20000 * np.sin(audio * (2 * np.pi * frequency))).astype(np.int16)
return (sr, audio)
gr.Interface(
generate_tone,
[
gr.Dropdown(notes, type="index"),
gr.Slider(minimum=4, maximum=6, step=1),
gr.Textbox(type="number", value=1, label="Duration in seconds"),
],
"audio",
).launch()
```
<iframe src="https://course-demos-generate-tone.hf.space" frameBorder="0" height="450" title="Gradio app" class="container p-0 flex-grow space-iframe" allow="accelerometer; ambient-light-sensor; autoplay; battery; camera; document-domain; encrypted-media; fullscreen; geolocation; gyroscope; layout-animations; legacy-image-formats; magnetometer; microphone; midi; oversized-images; payment; picture-in-picture; publickey-credentials-get; sync-xhr; usb; vr ; wake-lock; xr-spatial-tracking" sandbox="allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads"></iframe>
### Метод `launch()`[[the-launch-method]]
До сих пор мы использовали метод `launch()` для запуска интерфейса, но мы
не обсуждали, что он делает.
По умолчанию метод `launch()` запускает демо на веб-сервере, который
работает локально. Если вы выполняете свой код в блокноте Jupyter или Colab, то
Gradio встроит демо GUI в блокнот, чтобы вы могли легко им пользоваться.
Вы можете настроить поведение `launch()` с помощью различных параметров:
- `inline` - отображать ли интерфейс в виде строки в блокнотах Python.
- `inbrowser` - автоматически ли запускать интерфейс в новой вкладке браузера по умолчанию.
- `share` - создавать ли для интерфейса общедоступную ссылку с вашего компьютера. Что-то вроде ссылки на Google Drive!
Мы рассмотрим параметр `share` более подробно в следующем разделе!
## ✏️ Давайте применим это![[lets-apply-it]]
Давайте создадим интерфейс, который позволит вам продемонстрировать демо модели **распознавания речи**.
Чтобы было интереснее, мы будем принимать *либо* микрофонный вход, либо загруженный файл.
Как обычно, мы загрузим нашу модель распознавания речи с помощью функции `pipeline()` из 🤗 Transformers.
Если вам нужно быстро вспомнить, вы можете вернуться к [этому разделу в Главе 1](../chapter1/3). Далее мы реализуем функцию `transcribe_audio()`, которая обрабатывает аудио и возвращает транскрипцию. Наконец, мы обернем эту функцию в `Interface` с компонентами `Audio` на входе и просто текстом на выходе. В целом, код этого приложения выглядит следующим образом:
```py
from transformers import pipeline
import gradio as gr
model = pipeline("automatic-speech-recognition")
def transcribe_audio(mic=None, file=None):
if mic is not None:
audio = mic
elif file is not None:
audio = file
else:
return "You must either provide a mic recording or a file"
transcription = model(audio)["text"]
return transcription
gr.Interface(
fn=transcribe_audio,
inputs=[
gr.Audio(source="microphone", type="filepath", optional=True),
gr.Audio(source="upload", type="filepath", optional=True),
],
outputs="text",
).launch()
```
Если ваш браузер не запрашивает разрешения на использование микрофона, <a href="https://huggingface.co/spaces/course-demos/audio-reverse" target="_blank">откройте демо в отдельной вкладке</a>.
<iframe src="https://course-demos-asr.hf.space" frameBorder="0" height="550" title="Gradio app" class="container p-0 flex-grow space-iframe" allow="accelerometer; ambient-light-sensor; autoplay; battery; camera; document-domain; encrypted-media; fullscreen; geolocation; gyroscope; layout-animations; legacy-image-formats; magnetometer; microphone; midi; oversized-images; payment; picture-in-picture; publickey-credentials-get; sync-xhr; usb; vr ; wake-lock; xr-spatial-tracking" sandbox="allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads"></iframe>
Вот и все! Теперь вы можете использовать этот интерфейс для транскрибирования аудио. Обратите внимание, что
передавая параметр `optional` как `True`, мы позволяем пользователю предоставить
либо микрофон, либо аудиофайл (либо ни то, ни другое, но в этом случае будет выдано сообщение об ошибке).
Продолжайте, чтобы узнать, как поделиться своим интерфейсом с другими!
<EditOnGithub source="https://github.com/huggingface/course/blob/main/chapters/ru/chapter9/3.mdx" />

Xet Storage Details

Size:
13.6 kB
·
Xet hash:
58ad1ea4f718719a00ecf2007639f9d759943b6d5590674f42644d9c8a76255f

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.