理解 Interface 类
在本节中,我们将仔细研究 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()
函数加载我们的语音识别模型。如果你需要快速复习,你可以回到第一章的该部分。接下来,我们将实现一个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
,我们允许用户提供麦克风或音频文件(或者都不提供,但这将返回错误消息)。
继续学习如何与他人分享你的界面!