Microsoft Azure 文件

在 Azure AI 上部署用於自動語音識別 (ASR) 的 NVIDIA Parakeet

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

在 Azure AI 上部署用於自動語音識別 (ASR) 的 NVIDIA Parakeet

本示例展示瞭如何將 Hugging Face Collection 中的 NVIDIA Parakeet 用於自動語音識別 (ASR) 部署為 Azure AI Foundry Hub 中的 Azure ML 託管線上終結點,該終結點由基於 NVIDIA NeMo 的 Hugging Face 推理容器提供支援。它還涵蓋了如何使用 cURL、requests、OpenAI Python SDK 執行推理,以及如何本地執行 Gradio 應用程式以進行錄音和檔案轉錄。

總結:NVIDIA NeMo 是一個可擴充套件的生成式 AI 框架,專為從事大型語言模型、多模態和語音 AI(自動語音識別和文字到語音)的研究人員和開發人員而構建。NVIDIA NeMo Parakeet ASR 模型在推理方面效率高,同時實現了強大的語音識別準確性。Azure AI Foundry 為企業 AI 操作、模型構建器和應用程式開發提供了一個統一平臺。Azure Machine Learning 是一種雲服務,用於加速和管理機器學習 (ML) 專案生命週期。


本示例將專門從 Hugging Face Hub 部署 nvidia/parakeet-tdt-0.6b-v2(或在 AzureMLAzure AI Foundry 上檢視)作為 Azure AI Foundry Hub 上的 Azure ML 託管線上終結點。

nvidia/parakeet-tdt-0.6b-v2 是一個擁有 6 億引數的自動語音識別 (ASR) 模型,旨在實現高質量的英語轉錄,支援標點符號、大小寫和準確的時間戳預測。

FastConformer 架構的此 XL 變體集成了 TDT 解碼器,並使用完全注意力進行訓練,從而能夠高效地單次轉錄長達 24 分鐘的音訊片段。該模型在 HF-Open-ASR 排行榜上以 128 的批處理大小實現了 3380 的 RTFx。注意:RTFx 效能可能因資料集音訊持續時間和批處理大小而異。

  • 準確的詞級時間戳預測
  • 自動標點符號和大小寫
  • 在口語數字和歌曲歌詞轉錄方面表現出色

NVIDIA Parakeet on the Hugging Face Hub

NVIDIA Parakeet on Azure AI Foundry

有關更多資訊,請務必檢視 Hugging Face Hub 上的模型卡NVIDIA NeMo 文件

請注意,您可以選擇 Hugging Face Hub 上任何帶有 NeMo 標籤且啟用了“部署到 AzureML”選項的自動語音識別 (ASR) 模型,或者直接選擇 Azure ML 或 Azure AI Foundry Hub 模型目錄中“HuggingFace”集合下的任何 ASR 模型(請注意,對於 Azure AI Foundry,Hugging Face Collection 僅適用於基於 Hub 的專案),但只有 NVIDIA Parakeet 模型由 NVIDIA NeMo 提供支援,其餘模型則依賴於 Hugging Face 推理工具包。

先決條件

要執行以下示例,您需要滿足以下先決條件,或者,您也可以在 Azure Machine Learning 教程:建立入門所需資源中閱讀更多相關資訊。

  • 具有活動訂閱的 Azure 帳戶。
  • 已安裝並登入 Azure CLI。
  • 適用於 Azure CLI 的 Azure 機器學習擴充套件。
  • 一個 Azure 資源組。
  • 基於 Azure AI Foundry Hub 的專案。

有關更多資訊,請按照 為 Azure AI 配置 Microsoft Azure 中的步驟操作。

設定和安裝

在本示例中,將使用 適用於 Python 的 Azure 機器學習 SDK 來建立終結點和部署,以及呼叫已部署的 API。同時,您還需要安裝 azure-identity,透過 Python 對 Azure 憑據進行身份驗證。

%pip install azure-ai-ml azure-identity --upgrade --quiet

更多資訊請參見 適用於 Python 的 Azure 機器學習 SDK

然後,為了方便起見,建議設定以下環境變數,因為它們將在示例中用於 Azure ML 客戶端,因此請務必根據您的 Microsoft Azure 帳戶和資源更新並設定這些值。

%env LOCATION eastus
%env SUBSCRIPTION_ID <YOUR_SUBSCRIPTION_ID>
%env RESOURCE_GROUP <YOUR_RESOURCE_GROUP>
%env AI_FOUNDRY_HUB_PROJECT <YOUR_AI_FOUNDRY_HUB_PROJECT>

最後,您還需要定義終結點和部署名稱,因為它們也將在整個示例中使用。

請注意,終結點名稱在每個區域內必須是全域性唯一的,即即使您的訂閱下沒有以該方式命名的終結點,如果該名稱已被其他 Azure 客戶保留,則您將無法使用相同的名稱。建議新增時間戳或自定義識別符號,以防止在嘗試部署具有已鎖定/保留名稱的終結點時遇到 HTTP 400 驗證問題。此外,終結點名稱的長度必須在 3 到 32 個字元之間。

import os
from uuid import uuid4

os.environ["ENDPOINT_NAME"] = f"nvidia-parakeet-{str(uuid4())[:8]}"
os.environ["DEPLOYMENT_NAME"] = f"nvidia-parakeet-{str(uuid4())[:8]}"

對 Azure ML 進行身份驗證

首先,您需要使用 Azure ML Python SDK 對 Azure AI Foundry Hub 進行身份驗證,該 SDK 將在稍後用於將 nvidia/parakeet-tdt-0.6b-v2 部署為您的 Azure AI Foundry Hub 中的 Azure ML 託管線上終結點。

在標準 Azure ML 部署中,您需要使用 Azure ML 工作區作為 workspace_name 來建立 MLClient,而在 Azure AI Foundry 中,您需要提供 Azure AI Foundry Hub 名稱作為 workspace_name,這將把終結點也部署到 Azure AI Foundry 中。

import os
from azure.ai.ml import MLClient
from azure.identity import DefaultAzureCredential

client = MLClient(
    credential=DefaultAzureCredential(),
    subscription_id=os.getenv("SUBSCRIPTION_ID"),
    resource_group_name=os.getenv("RESOURCE_GROUP"),
    workspace_name=os.getenv("AI_FOUNDRY_HUB_PROJECT"),
)

建立和部署 Azure AI 終結點

在建立託管線上終結點之前,您需要構建模型 URI,其格式如下:azureml://registries/HuggingFace/models/<MODEL_ID>/labels/latest,其中 MODEL_ID 不是 Hugging Face Hub ID,而是其在 Azure 上的名稱,如下所示:

model_id = "nvidia/parakeet-tdt-0.6b-v2"

model_uri = (
    f"azureml://registries/HuggingFace/models/{model_id.replace('/', '-').replace('_', '-').lower()}/labels/latest"
)
model_uri

要檢查 Hugging Face Hub 中的模型是否在 Azure 中可用,您應該閱讀 支援的模型。如果不可用,您始終可以 請求在 Azure 上的 Hugging Face 集合中新增模型)。

然後,您需要透過 Azure ML Python SDK 建立 ManagedOnlineEndpoint,如下所示。

Hugging Face Collection 中的每個模型都由高效的推理後端提供支援,並且每個模型都可以在各種例項型別上執行(如 支援的硬體 中所列)。由於模型和推理引擎需要 GPU 加速例項,您可能需要根據 管理和增加 Azure 機器學習資源的配額和限制 請求增加配額。

from azure.ai.ml.entities import ManagedOnlineEndpoint, ManagedOnlineDeployment

endpoint = ManagedOnlineEndpoint(name=os.getenv("ENDPOINT_NAME"))

deployment = ManagedOnlineDeployment(
    name=os.getenv("DEPLOYMENT_NAME"),
    endpoint_name=os.getenv("ENDPOINT_NAME"),
    model=model_uri,
    instance_type="Standard_NC40ads_H100_v5",
    instance_count=1,
)
client.begin_create_or_update(endpoint).wait()

Azure AI Endpoint from Azure AI Foundry

在 Azure AI Foundry 中,終結點只有在部署建立後才會在“我的資產 -> 模型 + 終結點”選項卡中列出,不像 Azure ML 那樣,即使終結點不包含任何活動或正在進行的部署也會顯示。

client.online_deployments.begin_create_or_update(deployment).wait()

Azure AI Deployment from Azure AI Foundry

請注意,雖然 Azure AI 終結點建立相對較快,但部署將花費更長時間,因為它需要分配 Azure 上的資源,因此預計需要 10-15 分鐘,但也可能根據例項配置和可用性而更長。

部署後,您可以透過 Azure AI Foundry 或 Azure ML Studio 檢查終結點詳細資訊、即時日誌、如何使用終結點,甚至使用仍在預覽中的監視功能。有關更多資訊,請參閱Azure ML 託管線上終結點

向 Azure AI 終結點發送請求

最後,現在 Azure AI 終結點已部署,您可以向其傳送請求。在這種情況下,由於模型的任務是 automatic-speech-recognition,並且由於它期望隨音訊檔案傳送多部分請求,因此不能使用 invoke 方法,因為它只支援 JSON 有效負載。

話雖如此,您仍然可以透過 requests、OpenAI Python SDK 或 cURL 以程式設計方式向其傳送請求,路由到 /api/v1/audio/transcriptions 路徑,這是轉錄 API 的 OpenAI 相容路徑。

要傳送請求,我們需要 primary_keyscoring_uri,它們可以透過 Azure ML Python SDK 檢索,如下所示:

api_key = client.online_endpoints.get_keys(os.getenv("ENDPOINT_NAME")).primary_key
api_url = client.online_endpoints.get(os.getenv("ENDPOINT_NAME")).scoring_uri

此外,由於您需要一個示例音訊檔案來執行推理,您將需要下載一個音訊檔案,例如以下檔案,它是 nvidia/parakeet-tdt-0.6b-v2 模型卡中展示的音訊檔案:

!wget https://dldata-public.s3.us-east-2.amazonaws.com/2086-149220-0033.wav

Python 請求

由於已部署的 Azure AI ASR 終結點需要多部分請求,您需要分別傳送檔案(在本例中為音訊檔案)和資料(請求引數,例如模型名稱或溫度等)。為此,您首先需要將音訊檔案讀取到 io.BytesIO 物件中,然後使用必要的身份驗證和 azureml-model-deployment 標頭準備請求,以指向實際的 Azure AI 部署,並使用檔案和資料傳送 HTTP POST,如下所示:

from io import BytesIO
import requests

audio_file = BytesIO(open("2086-149220-0033.wav", "rb").read())
audio_file.name = "2086-149220-0033.wav"

response = requests.post(
    api_url,
    headers={
        "Authorization": f"Bearer {api_key}",
        "azureml-model-deployment": os.getenv("DEPLOYMENT_NAME"),
    },
    files={"file": (audio_file.name, audio_file, "audio/wav")},
    data={"model": model_id},
)
print(response.json())
# {'text': "Well, I don't wish to see it any more, observed Phebe, turning away her eyes. It is certainly very like the old portrait."}

OpenAI Python SDK

由於暴露的評分 URI 是 OpenAI 相容路由,即 /api/v1/audio/transcriptions,因此您可以利用 OpenAI Python SDK 向已部署的 Azure AI 終結點發送請求。

%pip install openai --upgrade --quiet

要將 OpenAI Python SDK 與 Azure ML 託管線上終結點一起使用,您需要更新上面定義的 api_url 值,因為預設的 scoring_uri 包含完整路由,而 OpenAI SDK 期望路由到 v1(包括 v1),這意味著在例項化客戶端之前應刪除 /audio/transcriptions

api_url = client.online_endpoints.get(os.getenv("ENDPOINT_NAME")).scoring_uri.replace("/audio/transcriptions", "")

或者,您也可以手動構建 API URL,如下所示,因為 URI 在每個區域中都是全域性唯一的,這意味著在同一區域中只會有一個同名終結點。

api_url = f"https://{os.getenv('ENDPOINT_NAME')}.{os.getenv('LOCATION')}.inference.ml.azure.com/api/v1"

或者直接從 Azure AI Foundry 或 Azure ML Studio 中檢索。

然後,您可以正常使用 OpenAI Python SDK,確保包含包含 Azure AI / ML 部署名稱的額外標頭 azureml-model-deployment

透過 OpenAI Python SDK,可以在每次呼叫 chat.completions.create 時透過 extra_headers 引數進行設定(如下方註釋所示),或者在例項化 OpenAI 客戶端時透過 default_headers 引數進行設定(這是推薦的方法,因為每個請求都需要存在該標頭,因此只設置一次更可取)。

import os
from openai import OpenAI

openai_client = OpenAI(
    base_url=api_url,
    api_key=api_key,
    default_headers={"azureml-model-deployment": os.getenv("DEPLOYMENT_NAME")},
)

transcription = openai_client.audio.transcriptions.create(
    model=model_id,
    file=open("2086-149220-0033.wav", "rb"),
    response_format="json",
)
print(transcription.text)
# Well, I don't wish to see it any more, observed Phebe, turning away her eyes. It is certainly very like the old portrait.

cURL

或者,您也可以使用 cURL 向已部署的終結點發送請求,將 OpenAI 片段中以程式設計方式檢索到的 api_urlapi_key 值設定為環境變數,以便 cURL 可以使用它們,如下所示:

os.environ["API_URL"] = api_url
os.environ["API_KEY"] = api_key
!curl -sS $API_URL/audio/transcriptions \
    -H "Authorization: Bearer $API_KEY" \
    -H "azureml-model-deployment: $DEPLOYMENT_NAME" \
    -H "Content-Type: multipart/form-data" \
    -F file=@2086-149220-0033.wav \
    -F model=nvidia/parakeet-tdt-0.6b-v2

或者,您可以直接前往 Azure AI Foundry 中“我的資產 -> 模型 + 終結點”下的 Azure AI 終結點,或透過 Azure ML Studio 中的“終結點”獲取評分 URI 和 API 金鑰值,以及給定模型的 Azure AI / ML 部署名稱。

Gradio

Gradio 是用友好的 Web 介面演示您的機器學習模型的最快方式,以便任何人都可以使用它。您還可以利用 OpenAI Python SDK 構建一個簡單的自動語音識別(即語音轉文字)演示,您可以在執行它的 Jupyter Notebook 單元格中使用它。

或者,也可以將 Gradio 演示連線到您的 Azure ML 託管線上終結點作為 Azure 容器應用,如教程:從原始碼構建並部署到 Azure 容器應用中所述。如果您希望我們專門為您演示 Gradio 的操作方法,請隨時提出問題請求

%pip install gradio --upgrade --quiet
import os
from pathlib import Path

import gradio as gr
from openai import OpenAI

openai_client = OpenAI(
    base_url=os.getenv("API_URL"),
    api_key=os.getenv("API_KEY"),
    default_headers={"azureml-model-deployment": os.getenv("DEPLOYMENT_NAME")},
)


def transcribe(audio: Path, temperature: float = 1.0) -> str:
    return openai_client.audio.transcriptions.create(
        model=model_id,
        file=open(audio, "rb"),
        temperature=temperature,
        response_format="text",
    )


demo = gr.Interface(
    fn=transcribe,
    inputs=[
        # https://www.gradio.app/docs/gradio/audio
        gr.Audio(type="filepath", streaming=False, label="Upload or Record Audio"),
        gr.Slider(0, 1, value=0.0, step=0.1, label="Temperature"),
    ],
    outputs=gr.Textbox(label="Transcribed Text"),
    title="NVIDIA Parakeet on Azure AI",
    description="Upload or record audio and get the transcribed text using NVIDIA Parakeet on Azure AI via the OpenAI's Transcription API.",
)

demo.launch()

Gradio Chat Interface with Azure ML Endpoint

釋放資源

完成 Azure AI 終結點/部署的使用後,您可以按如下方式刪除資源,這意味著您將停止支付模型執行所在的例項費用,並且所有相關費用都將停止。

client.online_endpoints.begin_delete(name=os.getenv("ENDPOINT_NAME")).result()

總結

透過本示例,您學習瞭如何建立和配置 Azure 帳戶以用於 Azure ML 和 Azure AI Foundry,然後如何在 Azure AI Foundry Hub / Azure ML 模型目錄中建立執行 Hugging Face Collection 中的自動語音識別 (ASR) 開放模型的託管線上終結點,以及之後如何使用不同的替代方案向其傳送推理請求,如何圍繞它構建一個簡單的 Gradio 聊天介面,最後,如何停止和釋放資源。

如果您對此示例有任何疑問、問題或疑問,請隨時提出問題,我們將盡力提供幫助!


📍 在 GitHub 上檢視完整示例 此處

< > 在 GitHub 上更新

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