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://gradio.org.cn/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 上更新