在 Hugging Face 上部署語音到語音模型

釋出於 2024 年 10 月 22 日
在 GitHub 上更新

引言

語音到語音 (S2S) 是 Hugging Face 的一個令人興奮的新專案,它結合了多種先進模型,創造出一種無縫、近乎神奇的體驗:您說話,系統便以合成語音回應。

該專案實現了一個級聯管道,利用 Hugging Face Hub 上 Transformers 庫中可用的模型。該管道包含以下元件:

  1. 語音活動檢測 (VAD)
  2. 語音到文字 (STT)
  3. 語言模型 (LM)
  4. 文字到語音 (TTS)

更重要的是,S2S 支援多語言!它目前支援英語、法語、西班牙語、中文、日語和韓語。您可以在單語言模式下執行管道,或使用 `auto` 標誌進行自動語言檢測。更多詳情請檢視此處的倉庫。

> 👩🏽‍💻: That's all amazing, but how do I run S2S?
> 🤗: Great question!

執行語音到語音模型需要大量的計算資源。即使在高階筆記型電腦上,您也可能會遇到延遲問題,尤其是在使用最先進的模型時。雖然強大的 GPU 可以緩解這些問題,但並非所有人都有能力(或願意!)設定自己的硬體。

Hugging Face 的推理端點 (IE) 在這裡發揮了作用。推理端點允許您租用配備 GPU(或您可能需要的其他硬體)的虛擬機器,並且只需支付系統執行時間費用,為部署像語音到語音這樣高效能的應用程式提供了理想的解決方案。

在這篇博文中,我們將引導您一步一步地將語音到語音模型部署到 Hugging Face 推理端點。我們將涵蓋以下內容:

  • 瞭解推理端點以及設定 IE 的不同方式的快速概覽,包括自定義容器映象(S2S 所需的)
  • 為 S2S 構建自定義 Docker 映象
  • 將自定義映象部署到 IE 並享受 S2S 的樂趣!

推理端點

推理端點提供了一種可擴充套件且高效的部署機器學習模型的方式。這些端點允許您以最少的設定來提供模型,並利用各種強大的硬體。推理端點非常適合部署需要高效能和可靠性的應用程式,而無需管理底層基礎設施。

以下是幾個主要功能,請務必查閱文件以獲取更多資訊:

  • 簡單性 - 得益於 IE 對 Hugging Face Hub 中模型的直接支援,您可以在幾分鐘內啟動並執行。
  • 可伸縮性 - 您無需擔心伸縮問題,因為 IE 會自動伸縮(包括縮減到零),以處理不同的負載並節省成本。
  • 定製化:您可以定製 IE 的設定以處理新任務。更多內容請見下文。

推理端點支援所有 Transformers 和 Sentence-Transformers 任務,但也可以支援自定義任務。以下是 IE 設定選項:

  1. 預構建模型:直接從 Hugging Face Hub 快速部署模型。
  2. 自定義處理程式:為更復雜的管道定義自定義推理邏輯。
  3. 自定義 Docker 映象:使用您自己的 Docker 映象來封裝所有依賴項和自定義程式碼。

對於較簡單的模型,選項 1 和 2 是理想之選,使推理端點部署變得非常簡單。然而,對於像 S2S 這樣複雜的管道,您需要選項 3 的靈活性:使用自定義 Docker 映象部署我們的 IE。

這種方法不僅提供了更大的靈活性,還透過最佳化構建過程和收集必要資料來提高效能。如果您正在處理複雜的模型管道或希望最佳化應用程式部署,本指南將提供寶貴的見解。

在推理端點上部署語音到語音模型

我們開始吧!

構建自定義 Docker 映象

為了開始建立自定義 Docker 映象,我們首先克隆了 Hugging Face 的預設 Docker 映象倉庫。這為在推理任務中部署機器學習模型提供了一個很好的起點。

git clone https://github.com/huggingface/huggingface-inference-toolkit

為什麼要克隆預設倉庫?

  • 堅實的基礎:該倉庫提供了一個預最佳化的基礎映象,專為推理工作負載設計,提供了一個可靠的起點。
  • 相容性:由於映象構建時與 Hugging Face 的部署環境對齊,這確保了您部署自己的自定義映象時能夠順利整合。
  • 易於定製:該倉庫提供了一個清晰且結構化的環境,方便根據您應用程式的特定需求定製映象。

您可以在此處檢視我們所有的更改。

為語音到語音應用程式定製 Docker 映象

克隆倉庫後,下一步是調整映象以支援我們的語音到語音管道。

  1. 新增語音到語音專案

為了順利整合專案,我們將語音到語音程式碼庫和任何所需的資料集作為子模組新增。這種方法提供了更好的版本控制,確保在構建 Docker 映象時始終提供確切版本的程式碼和資料。

透過將資料直接包含在 Docker 容器中,我們避免了每次例項化端點時都必須下載資料,這顯著縮短了啟動時間並確保了系統的可重現性。資料儲存在 Hugging Face 倉庫中,這提供了方便的跟蹤和版本控制。

git submodule add https://github.com/huggingface/speech-to-speech.git
git submodule add https://huggingface.co/andito/fast-unidic
  1. 最佳化 Docker 映象

接下來,我們修改了 Dockerfile 以滿足我們的需求:

  • 精簡映象:我們刪除了與我們用例無關的包和依賴項。這減少了映象大小,並減少了推理過程中不必要的開銷。
  • 安裝依賴項:我們將 `requirements.txt` 的安裝從入口點移到了 Dockerfile 本身。這樣,依賴項在構建 Docker 映象時安裝,從而加快了部署速度,因為這些包無需在執行時安裝。
  1. 部署自定義映象

修改完成後,我們構建並將自定義映象推送到 Docker Hub

DOCKER_DEFAULT_PLATFORM="linux/amd64" docker build -t speech-to-speech -f dockerfiles/pytorch/Dockerfile . 
docker tag speech-to-speech andito/speech-to-speech:latest 
docker push andito/speech-to-speech:latest

Docker 映象構建並推送後,即可在 Hugging Face 推理端點中使用。透過使用此預構建映象,端點可以更快地啟動和更高效地執行,因為所有依賴項和資料都已預打包在映象中。

設定推理端點

使用自定義 Docker 映象只需要稍微不同的配置,您可以檢視文件。我們將透過 GUI 和 API 兩種方法來完成此操作。

預備步驟

  1. 登入:https://huggingface.co/login
  2. 請求訪問 meta-llama/Meta-Llama-3.1-8B-Instruct
  3. 建立細粒度令牌:https://huggingface.co/settings/tokens/new?tokenType=fineGrained 細粒度令牌
    • 選擇訪問門控倉庫
    • 如果您正在使用 API,請確保選擇管理推理端點的許可權

推理端點 GUI

  1. 導航至 https://ui.endpoints.huggingface.co/new
  2. 填寫相關資訊
    • 模型倉庫 - andito/s2s
    • 模型名稱 - 如果您不喜歡生成的名稱,可以隨意重新命名
      • 例如 speech-to-speech-demo
      • 保持小寫和簡短
    • 選擇您偏好的雲和硬體 - 我們使用了 AWS GPU L4
      • 每小時只需 $0.80,足以處理這些模型
    • 高階配置(點選展開箭頭 ➤)
      • 容器型別 - Custom
      • 容器埠 - 80
      • 容器 URL - andito/speech-to-speech:latest
      • Secrets - HF_TOKEN|<您的令牌在此>
點選顯示影像

New Inference Endpoint

Advanced Configuration

3. 點選“建立端點”

模型倉庫實際上並不重要,因為模型是在容器建立階段指定和下載的,但推理端點需要一個模型,所以您可以隨意選擇一個輕量級的模型。

您需要指定 HF_TOKEN,因為我們需要在容器建立階段下載受限模型。如果您使用不受限或非私有模型,則無需此操作。

當前的 huggingface-inference-toolkit entrypoint 預設使用埠 5000,但推理端點期望埠 80。您應該在 Container Port 中匹配此設定。我們已經在 Dockerfile 中設定了它,但如果您從頭開始建立自己的,請注意!

推理端點 API

在這裡,我們將逐步介紹使用 API 建立端點的步驟。只需在您選擇的 Python 環境中執行此程式碼即可。

確保使用 0.25.1 或更高版本

pip install huggingface_hub>=0.25.1

使用可以寫入端點的令牌(寫入或細粒度)

from huggingface_hub import login
login()
from huggingface_hub import create_inference_endpoint, get_token
endpoint = create_inference_endpoint(
    # Model Configuration
    "speech-to-speech-demo",
    repository="andito/s2s",
    framework="custom",
    task="custom",
    # Security
    type="protected",
    # Hardware
    vendor="aws",
    accelerator="gpu",
    region="us-east-1",
    instance_size="x1",
    instance_type="nvidia-l4",
    # Image Configuration
    custom_image={
        "health_route": "/health",
        "url": "andito/speech-to-speech:latest", # Pulls from DockerHub
        "port": 80
    },
    secrets={'HF_TOKEN': get_token()}
)

# Optional
endpoint.wait()

概述

Overview

主要元件

  • 語音到語音
    • 這是一個 Hugging Face 庫,我們將一些特定於推理端點的檔案放在 inference-endpoint 分支中,該分支將很快合併到主分支。
  • andito/s2s 或任何其他倉庫。我們不需要這個,因為我們已經在容器建立階段有了模型,但推理端點需要一個模型,所以我們傳遞了一個輕量級的倉庫。
  • andimarafioti/speech-to-speech-toolkit.

構建 Web 伺服器

為了使用該端點,我們需要構建一個小型 Web 服務。它的程式碼在 speech_to_speech 庫中的 s2s_handler.py 中完成,我們將其用於客戶端,並在 speech_to_speech_inference_toolkit 中的 webservice_starlette.py 中完成,我們使用它來構建 docker 映象。通常,您只為端點設定一個自定義處理程式,但由於我們想要實現極低的延遲,我們還構建了 Web 服務來支援 WebSocket 連線而不是普通的請求。這聽起來一開始令人望而生畏,但 Web 服務只有 32 行程式碼!

Webservice code

此程式碼將在啟動時執行 prepare_handler,它將初始化所有模型並預熱它們。然後,每條訊息將由 inference_handler.process_streaming_data 處理。

Process streaming code

此方法簡單地從客戶端接收音訊資料,將其分塊為 VAD 的小部分,並將其提交到佇列進行處理。然後,它檢查輸出處理佇列(來自模型的語音響應!)並在有內容時返回。所有內部處理都由 Hugging Face 的 speech_to_speech 庫處理。

自定義處理程式自定義客戶端

Web 服務接收並返回音訊。但仍有一個重要缺失部分,我們如何錄製和播放音訊?為此,我們建立了一個客戶端來連線到服務。最簡單的方法是將分析分為 Web 服務連線和音訊錄製/播放。

Audio client code

初始化 Web 服務客戶端需要為所有訊息設定一個包含我們的 Hugging Face 令牌的頭。在初始化客戶端時,我們設定了在常見訊息(開啟、關閉、錯誤、訊息)上執行的操作。這將決定當伺服器向客戶端傳送訊息時,客戶端會做什麼。

Audio client messages code

我們可以看到,對訊息的反應是直截了當的,其中 on_message 是唯一一個更復雜的方法。此方法瞭解伺服器何時完成響應並開始“回聽”使用者。否則,它會將伺服器的資料放入播放佇列。

Client's audio record and playback

客戶端的音訊部分有 4 個任務

  1. 錄製音訊
  2. 提交音訊錄音
  3. 接收來自伺服器的音訊響應
  4. 播放音訊響應

音訊在 audio_input_callback 方法中錄製,它只是將所有塊提交到一個佇列。然後,透過 send_audio 方法將其傳送到伺服器。在這裡,如果沒有音訊要傳送,我們仍然提交一個空陣列,以便從伺服器接收響應。來自伺服器的響應由我們在部落格前面看到的 on_message 方法處理。然後,音訊響應的播放由 audio_output_callback 方法處理。在這裡,我們只需要確保音訊在預期的範圍內(我們不希望因為一個有缺陷的包而損害某人的耳膜!),並確保輸出陣列的大小是播放庫所期望的。

結論

在這篇文章中,我們逐步介紹瞭如何在 Hugging Face 推理端點上使用自定義 Docker 映象部署語音到語音 (S2S) 管道。我們構建了一個自定義容器來處理 S2S 管道的複雜性,並演示瞭如何將其配置為可擴充套件、高效的部署。Hugging Face 推理端點讓部署像語音到語音這樣高效能的應用程式變得更容易,而無需管理硬體或基礎設施的麻煩。

如果您有興趣嘗試或有任何問題,請隨意探索以下資源:

有問題或疑問?請在相關 GitHub 倉庫中發起討論,我們樂意提供幫助!

社群

註冊登入 發表評論

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