NLP 课程文档

理解 Interface 类

Hugging Face's logo
加入 Hugging Face 社区

并获得增强型文档体验

开始使用

理解 Interface 类

Ask a Question Open In Colab Open In Studio Lab

在本节中,我们将仔细研究 Interface 类,并了解用于创建它的主要参数。

如何创建 Interface

您会注意到 Interface 类有 3 个必需参数

Interface(fn, inputs, outputs, ...)

这些参数是

  • fn: 由 Gradio 接口封装的预测函数。此函数可以接受一个或多个参数并返回一个或多个值。
  • inputs: 输入组件类型。Gradio 提供了许多预建组件,例如 "image""mic"
  • outputs: 输出组件类型。同样,Gradio 提供了许多预建组件,例如 "image""label"

有关组件的完整列表,请查看 Gradio 文档 。每个预建组件都可以通过实例化与该组件对应的类来进行自定义。

例如,正如我们在上一节中看到的,您可以通过传入 Textbox(lines=7, label="Prompt") 组件来创建具有 7 行和标签的文本框,而不是将 "textbox" 传递给 inputs 参数。

让我们来看另一个例子,这次使用的是 Audio 组件。

一个简单的音频示例

如前所述,Gradio 提供了许多不同的输入和输出。因此,让我们构建一个使用音频的 Interface

在本例中,我们将构建一个音频到音频函数,该函数接受一个音频文件并简单地将其反转。

我们将使用 Audio 组件作为输入。使用 Audio 组件时,您可以指定是否希望音频的 source 是用户上传的文件,还是用户用麦克风录制的声音。在本例中,让我们将其设置为 "microphone"。为了有趣,我们将向我们的 Audio 添加一个标签,上面写着“在这里说话…”。

此外,我们希望将音频作为 numpy 数组接收,以便我们可以轻松地将其“反转”。因此,我们将 "type" 设置为 "numpy",这会将输入数据作为 (sample_rate, data) 的元组传递到我们的函数中。

我们还将使用 Audio 输出组件,它可以自动将带有采样率和 numpy 数据数组的元组渲染为可播放的音频文件。在本例中,我们无需进行任何自定义,因此我们将使用字符串快捷方式 "audio"

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()

上面的代码将生成一个类似于下面的界面(如果您的浏览器没有要求您麦克风权限,请在单独的标签页中打开演示)。

您现在应该能够录制自己的声音并听到自己反向说话 - 令人毛骨悚然 👻!

处理多个输入和输出

假设我们有一个更复杂的函数,它具有多个输入和输出。在下面的示例中,我们有一个函数,它接受一个下拉列表索引、一个滑块值和一个数字,并返回一个音乐音调的音频样本。

看看我们如何传递输入和输出组件列表,并尝试理解发生了什么。

这里的关键是,当您传递

  • 一个输入组件列表时,每个组件按顺序对应一个参数。
  • 一个输出组件列表时,每个组件对应一个返回值。

下面的代码片段显示了三个输入组件如何与 generate_tone() 函数的三个参数相对应。

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()

launch() 方法

到目前为止,我们一直在使用 launch() 方法启动界面,但我们还没有真正讨论它做了什么。

默认情况下,launch() 方法将在本地运行的 Web 服务器中启动演示。如果您在 Jupyter 或 Colab 笔记本中运行代码,那么 Gradio 将在笔记本中嵌入演示 GUI,以便您能够轻松地使用它。

您可以通过不同的参数自定义 launch() 的行为。

  • inline - 是否在 Python 笔记本中内联显示界面。
  • inbrowser - 是否在默认浏览器的新标签页中自动启动界面。
  • share - 是否从您的计算机为界面创建一个可公开共享的链接。就像 Google Drive 链接一样!

我们将在下一节中更详细地介绍 share 参数!

✏️ 让我们实践一下!

让我们构建一个界面,允许您演示一个 **语音识别** 模型。为了更有趣,我们将接受 *麦克风输入* 或 *上传文件*。

像往常一样,我们将使用 🤗 Transformers 中的 pipeline() 函数加载我们的语音识别模型。如果您需要快速回顾,可以返回到 第 1 章的这一节。接下来,我们将实现一个 transcribe_audio() 函数来处理音频并返回转录结果。最后,我们将使用 Audio 组件为输入和输出文本包装这个函数,并创建一个 Interface。 整个应用程序代码如下:

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()

如果您的浏览器没有请求麦克风权限,请 在另一个标签页中打开演示

就是这样!现在您可以使用此界面来转录音频。请注意,通过将 optional 参数设置为 True,我们允许用户提供麦克风或音频文件(或两者都不提供,但这将返回错误消息)。

继续查看如何与其他人分享您的界面!