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,我們允許使用者提供麥克風或音訊檔案(或兩者都不提供,但這將返回錯誤訊息)。

繼續檢視如何與其他人分享您的介面!

© . This site is unofficial and not affiliated with Hugging Face, Inc.