#
了解接口类

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

##
如何创建接口

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

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

这些参数是：

- `fn`: 由 Gradio 接口包装的预测函数。 该函数可以接受一个或多个参数并返回一个或多个值
- `inputs`: 输入组件类型。 Gradio 提供了许多预构建的组件，例如`"image"` 或`"mic"`。
- `outputs`: 输出组件类型。 同样，Gradio 提供了许多预构建的组件，例如 `“图像”`或“标签”`。

有关组件的完整列表，请参阅 Gradio 文档。 每个预构建的组件都可以通过实例化该组件对应的类来定制。

例如，正如我们在 上一节 中看到的，您可以传入一个 `Textbox(lines=7, label="Prompt")` 组件来创建一个包含 7 行和一个标签的文本框，而不是将 `"textbox"` 传递给 `inputs` 参数。 让我们看另一个例子，这次是一个 `Audio` 组件。

##
一个带音频的简单示例

如前所述，Gradio 提供了许多不同的输入和输出。 因此，让我们构建一个适用于音频的“接口”。

在这个例子中，我们将构建一个音频到音频的函数，它需要一个音频文件并简单地反转它。

我们将使用 `Audio` 组件作为输入。 使用 `Audio` 组件时，您可以指定希望音频的 `source` 是用户上传的文件还是用户录制声音的麦克风。 在这种情况下，让我们将其设置为“麦克风”。 只是为了好玩，我们会在我们的“音频”中添加一个标签，上面写着“在这里说话……”。

此外，我们希望将音频作为 numpy 数组接收，以便我们可以轻松地“反转”它。 所以我们将 `"type"` 设置为 `"numpy"`，它会传递输入data 作为 (`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()

上面的代码会产生一个类似下面的界面（如果你的浏览器没有 询问您的麦克风权限， open the demo in a separate tab.)

您现在应该能够录制自己的声音并听到自己在反向说话 - 怪异 👻!

##
处理多个输入和输出

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

看看我们如何传递输入和输出组件列表，看看你能不能跟上正在发生的事情。

这里的关键是当你通过时：

- 输入组件列表，每个组件依次对应一个参数。
- 输出组件列表，每个组件对应一个返回值。

下面的代码片段显示了三个输入组件如何与 `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` - whether to display the interface inline on Python notebooks.
- `inbrowser` - whether to automatically launch the interface in a new tab on the default browser.
- `share` - whether to create a publicly shareable link from your computer for the interface. Kind of like a Google Drive link!

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

##
✏️ 让我们应用它！

让我们构建一个界面，让您演示 speech-recognition 模型。 为了让它变得有趣，我们将接受 or 麦克风输入或上传的文件。

像往常一样，我们将使用 🤗 Transformers 中的 `pipeline()` 函数加载我们的语音识别模型。如果您需要快速复习，您可以返回 第 1 章中的那个部分。 接下来，我们将实现一个 `transcribe_audio()` 函数来处理音频并返回转录。 最后，我们将把这个函数包装在一个 `Interface` 中，其中 `Audio` 组件用于输入，只有文本用于输出。 总而言之，此应用程序的代码如下：

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

如果您的浏览器没有要求您提供麦克风权限，open the demo in a separate tab.

就是这样！ 您现在可以使用此界面来转录音频。 注意这里 通过将 `optional` 参数作为 `True` 传递，我们允许用户 提供麦克风或音频文件（或两者都不提供，但这会返回错误消息）。

继续看看如何与他人分享您的界面！