使用-Gradio-构建交互式机器学习应用

使用 Gradio 构建交互式机器学习应用

原文:towardsdatascience.com/build-interactive-machine-learning-apps-with-gradio/

作为与机器学习模型一起工作的开发者,你可能花费数小时编写脚本和调整超参数。但当涉及到分享你的工作或让其他人与你交互模型时,Python 脚本和可用 Web 应用之间的差距可能感觉巨大。Gradio是一个开源 Python 库,它允许你将 Python 脚本转换为交互式 Web 应用,而无需前端专业知识。

在这篇博客中,我们将通过构建一个可以在AI PCIntel® Tiber™ AI Cloud上运行并与他人分享的文本到语音(TTS)Web 应用来有趣地、动手地学习 Gradio 的关键组件。(完全披露:作者与 Intel 有合作关系。)

我们项目的概述:一个 TTS Python 脚本

我们将开发一个基本的 Python 脚本,利用 Coqui TTS 库及其xtts_v2多语言模型。要继续这个项目,创建一个包含以下内容的requirements.txt文件:

gradio
coqui-tts
torch

然后创建一个虚拟环境并使用以下命令安装这些库:

pip install -r requirements.txt

或者,如果你正在使用 Intel Tiber AI Cloud,或者你的系统上已安装了uv 包管理器,创建一个虚拟环境并使用以下命令安装库:

uv init --bare
uv add -r requirements.txt

然后,你可以使用以下命令运行脚本:

uv run <filename.py>

注意:为了与最近的依赖版本兼容,我们正在使用[coqui-tts](https://pypi.org/project/coqui-tts/),它是原始 Coqui [TTS](https://pypi.org/project/TTS/)的分支。因此,不要尝试使用pip install TTS安装原始包。

接下来,我们可以为我们的脚本进行必要的导入:

import torch
from TTS.api import TTS

目前,TTS为你提供了 94 个模型,你可以通过运行以下命令来列出:

print(TTS().list_models())

对于这篇博客,我们将使用XTTS-v2模型,它支持 17 种语言和 58 种说话者声音。你可以通过以下方式加载模型并查看说话者:

tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2")

print(tts.speakers)

这里是一个生成语音并保存到文件的最小 Python 脚本:

import torch
from TTS.api import TTS

tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2")

tts.tts_to_file(
    text="Every bug was once a brilliant idea--until reality kicked in.",
    speaker="Craig Gutsy",
    language="en",
    file_path="bug.wav",
)

这个脚本可以工作,但它不是交互式的。如果你想让用户输入自己的文本,选择一个说话者,并立即获得音频输出呢?这正是 Gradio 的亮点所在。

Gradio 应用的解剖结构

一个典型的 Gradio 应用由以下组件组成:

  • 接口用于定义输入和输出

  • 组件TextboxDropdownAudio

  • 函数用于链接后端逻辑

  • .launch()启动应用,并可选择使用share=True选项共享应用。

**Interface** 类有三个核心参数:fninputsoutputs。将 fn 参数分配(或设置)为任何您想要用用户界面(UI)包装的 Python 函数。输入和输出接受一个或多个 Gradio 组件。您可以将这些组件的名称作为字符串传入,例如 "textbox""text",或者为了更高的可定制性,传入一个类实例,如 [Textbox()](https://www.gradio.app/main/docs/gradio/textbox)

import gradio as gr

# A simple Gradio app that multiplies two numbers using sliders
def multiply(x, y):
    return f"{x} x {y} = {x * y}"

demo = gr.Interface(
    fn=multiply,
    inputs=[
        gr.Slider(1, 20, step=1, label="Number 1"),
        gr.Slider(1, 20, step=1, label="Number 2"),
    ],
    outputs="textbox",  # Or outputs=gr.Textbox()
)

demo.launch()

图片由作者提供

默认情况下,**Flag** 按钮出现在 Interface 中,以便用户可以标记任何“有趣”的组合。在我们的示例中,如果我们按下标记按钮,Gradio 将在 .gradio\flagged 下生成一个包含以下内容的 CSV 日志文件:

Number 1,Number 2,output,timestamp

12,9,12 x 9 = 108,2025-06-02 00:47:33.864511

您可以通过在 Interface 中设置 flagging_mode="never" 来关闭此标记选项。

还请注意,我们可以通过在 Interface 中设置 live=True 来移除提交按钮并自动触发 multiply 函数。

将我们的 TTS 脚本转换为 Gradio 应用

如所示,Gradio 的核心概念很简单:您可以使用 Interface 类将您的 Python 函数包装在一个 UI 中。以下是您如何将 TTS 脚本转换为 Web 应用的方法:

import gradio as gr
from TTS.api import TTS

tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2")

def tts_fn(text, speaker):
    wav_path = "output.wav"
    tts.tts_to_file(text=text, speaker=speaker, language="en", file_path=wav_path)
    return wav_path

demo = gr.Interface(
    fn=tts_fn,
    inputs=[
        gr.Textbox(label="Text"),
        gr.Dropdown(choices=tts.speakers, label="Speaker"),
    ],
    outputs=gr.Audio(label="Generated Audio"),
    title="Text-to-Speech Demo",
    description="Enter text and select a speaker to generate speech.",
)
demo.launch()

图片由作者提供

https://contributor.insightmediagroup.io/wp-content/uploads/2025/07/bug.wav?_=1

contributor.insightmediagroup.io/wp-content/uploads/2025/07/bug.wav

只需几行代码,您就可以拥有一个 Web 应用,用户可以在其中输入文本、选择说话者并收听生成的音频——所有操作都在本地进行。分享此应用只需将最后一行替换为 demo.launch(share=True),这会立即为您提供公共 URL。对于生产或持久托管,您可以在 Hugging Face Spaces 上免费部署 Gradio 应用,或者在自己的服务器上运行它们。

除此之外:为高级用户提供的块

虽然 Interface 适用于大多数用例,但 Gradio 还提供了 [**Blocks**](https://www.gradio.app/main/docs/gradio/blocks),这是一个更底层的 API,用于构建具有自定义布局、多个函数和动态交互的复杂、多步骤应用。使用 Blocks,您可以:

  • 以行、列或选项卡的形式排列组件

  • 将输出作为其他函数的输入链式连接

  • 动态更新组件属性(例如,隐藏/显示、启用/禁用)

  • 构建仪表板、多模态应用或甚至全功能的 Web UI

这只是一个简单的应用的示例,该应用在用户完成输入后立即计算单词数量,并允许用户通过单个按钮清除输入和输出。示例展示了如何使用 [**Row**](https://www.gradio.app/main/docs/gradio/row) 控制应用的布局,并展示了两个关键事件类型:.change().click()

import gradio as gr

def word_count(text):
    return f"{len(text.split())} word(s)" if text.strip() else ""

def clear_text():
    return "", ""

with gr.Blocks() as demo:
    gr.Markdown("## Word Counter")

    with gr.Row():
        input_box = gr.Textbox(placeholder="Type something...", label="Input")
        count_box = gr.Textbox(label="Word Count", interactive=False)

    with gr.Row():
        clear_btn = gr.Button("Clear")

    input_box.change(fn=word_count, inputs=input_box, outputs=count_box)
    clear_btn.click(
        fn=clear_text, outputs=[input_box, count_box]
    )  # No inputs needed for clear_text

demo.launch()

图片

图片由作者提供

如果你对此类组件的类型感到好奇,可以尝试

print(type(input_box))  # <class 'gradio.components.textbox.Textbox'>

注意,在运行时,你不能像变量一样直接“读取”Textbox的值。Gradio 组件不是与 Python 变量实时绑定——它们只是定义 UI 和行为。Textbox的实际值存在于客户端(浏览器中),并且只有在用户交互发生时(如.click().change())才会传递到你的 Python 函数中。如果你正在探索高级流程(如维护或同步状态),Gradio 的状态可能会有所帮助。

更新 Gradio 组件

在更新组件方面,Gradio 给你提供了一些灵活性。考虑以下两个代码片段——尽管它们看起来有些不同,但它们做的是同一件事:在按钮点击时更新Textbox内的文本。

选项 1:直接返回新值

import gradio as gr

def update_text():
    return "Text successfully launched!"

with gr.Blocks() as demo:
    textbox = gr.Textbox(value="Awaiting launch sequence", label="Mission Log")
    button = gr.Button("Initiate Launch")

    button.click(fn=update_text, inputs=[], outputs=textbox)

demo.launch()

选项 2:使用 gr.update()

import gradio as gr

def update_text():
    return gr.update(value="Text successfully launched!")

with gr.Blocks() as demo:
    textbox = gr.Textbox(value="Awaiting launch sequence", label="Mission Log")
    button = gr.Button("Initiate Launch")

    button.click(fn=update_text, inputs=[], outputs=textbox)

demo.launch()

图片

图片由作者提供

那么,你应该使用哪一个呢?如果你只是更新组件的value,返回一个纯字符串(或数字,或组件期望的任何内容)是完全可以的。然而,如果你想更新其他属性——比如隐藏组件、更改其标签或禁用它——那么gr.update()就是你的选择。

理解 gr.update() 返回的对象类型也有帮助,以消除一些围绕它的神秘感。例如,在底层,gr.update(visible=False) 只是一个字典:

{'__type__': 'update', 'visible': False}

这只是一个小的细节,但知道何时以及如何使用 gr.update() 可以让你的 Gradio 应用程序更加动态和响应。

如果你觉得这篇文章很有价值,请考虑与你的网络分享。有关更多 AI 开发教程内容,请访问 Intel® AI 开发资源

请务必查看 Hugging Face Spaces,那里有各种各样的机器学习应用,你可以通过查看他人的代码来学习,并与社区分享你的工作。

致谢

作者感谢杰克·埃里克森对这篇文章早期草稿的反馈。

资源

posted @ 2026-03-28 09:50  布客飞龙II  阅读(14)  评论(0)    收藏  举报