Gradio 用户月活突破百万!

阅读更多
Gradio logo
  1. 附加功能
  2. 流式输出

流式输出

在某些情况下,您可能希望流式传输一系列输出,而不是一次显示单个输出。例如,您可能有一个图像生成模型,并且希望显示在每个步骤生成的图像,直到最终图像。或者您可能有一个聊天机器人,它一次流式传输一个 token 的响应,而不是一次返回所有响应。

在这种情况下,您可以将生成器函数提供给 Gradio,而不是常规函数。在 Python 中创建生成器非常简单:函数应该 `yield` 一系列值,而不是单个 `return` 值。通常,`yield` 语句放在某种循环中。这是一个简单的生成器示例,它只是向上计数到给定的数字

def my_generator(x):
    for i in range(x):
        yield i

您将生成器提供给 Gradio 的方式与提供常规函数的方式相同。例如,这是一个(假的)图像生成模型,它在输出使用 `gr.Interface` 类的图像之前生成几个步骤的噪声

import gradio as gr
import numpy as np
import time

def fake_diffusion(steps):
    rng = np.random.default_rng()
    for i in range(steps):
        time.sleep(1)
        image = rng.random(size=(600, 600, 3))
        yield image
    image = np.ones((1000,1000,3), np.uint8)
    image[:] = [255, 124, 0]
    yield image

demo = gr.Interface(fake_diffusion,
                    inputs=gr.Slider(1, 10, 3, step=1),
                    outputs="image")

demo.launch()

请注意,我们在迭代器中添加了 `time.sleep(1)` 以在步骤之间创建人为的暂停,以便您能够观察迭代器的步骤(在真实的图像生成模型中,这可能不是必需的)。

同样,Gradio 可以处理流式输入,例如,一个图像生成模型,每当用户在文本框中键入字母时,它都会重新运行。这在我们关于构建响应式界面的指南中进行了更详细的介绍。

流媒体

Gradio 可以直接从您的生成器函数流式传输音频和视频。这让您的用户几乎可以在您的函数 `yield` 音频或视频后立即听到或看到它们。您只需

  1. 在您的 `gr.Audio` 或 `gr.Video` 输出组件中设置 `streaming=True`。
  2. 编写一个 python 生成器,它 yield 音频或视频的下一个“chunk”。
  3. 设置 `autoplay=True`,以便媒体自动开始播放。

对于音频,下一个“chunk”可以是 `.mp3` 或 `.wav` 文件,也可以是音频的 `bytes` 序列。对于视频,下一个“chunk”必须是 `.mp4` 文件或带有 `h.264` 编解码器的 `.ts` 扩展名的文件。为了流畅播放,请确保 chunk 长度一致且大于 1 秒。

我们将用一些简单的例子来结束,这些例子说明了这些要点。

流式音频

import gradio as gr
from time import sleep

def keep_repeating(audio_file):
    for _ in range(10):
        sleep(0.5)
        yield audio_file

gr.Interface(keep_repeating,
             gr.Audio(sources=["microphone"], type="filepath"),
             gr.Audio(streaming=True, autoplay=True)
).launch()

流式视频

import gradio as gr
from time import sleep

def keep_repeating(video_file):
    for _ in range(10):
        sleep(0.5)
        yield video_file

gr.Interface(keep_repeating,
             gr.Video(sources=["webcam"], format="mp4"),
             gr.Video(streaming=True, autoplay=True)
).launch()

端到端示例

有关流媒体的端到端示例,请参阅视频对象检测指南或使用 transformers 的流式 AI 生成音频指南