生成的データ インテリジェンス

Hugging Face (PyAnnote) 話者ダイアライゼーション モデルを Amazon SageMaker に非同期エンドポイントとしてデプロイする |アマゾン ウェブ サービス

日付:

話者のダイアライゼーションは、音声分析に不可欠なプロセスであり、話者のアイデンティティに基づいて音声ファイルをセグメント化します。この投稿では、話者ダイアライゼーションのために Hugging Face の PyAnnote を統合する方法について詳しく説明します。 アマゾンセージメーカー 非同期エンドポイント。

AWS クラウド上で SageMaker を使用して話者のセグメンテーションとクラスタリングのソリューションをデプロイする方法に関する包括的なガイドを提供します。このソリューションは、マルチスピーカー (100 を超える) オーディオ録音を処理するアプリケーションに使用できます。

ソリューションの概要

Amazon Transcribe は、AW​​S の話者ダイアライゼーションの頼りになるサービスです。ただし、サポートされていない言語の場合は、推論のために SageMaker にデプロイされる他のモデル (この場合は PyAnnote) を使用できます。推論に最大 60 秒かかる短い音声ファイルの場合は、次のように使用できます。 リアルタイム推論。 60秒を超えると、 非同期 推論を使用する必要があります。非同期推論の追加の利点は、処理するリクエストがないときにインスタンス数をゼロに自動スケーリングすることでコストを節約できることです。

ハグ顔 は、機械学習 (ML) モデルの人気のあるオープンソース ハブです。 AWS とハグフェイスには、 パートナーシップ これにより、SageMaker を介して、PyTorch または TensorFlow でのトレーニングと推論のための AWS Deep Learning Containers (DLC) のセットと、SageMaker Python SDK の Hugging Face 推定器および予測器とのシームレスな統合が可能になります。 SageMaker の機能は、開発者やデータ サイエンティストが AWS で自然言語処理 (NLP) を簡単に開始できるように支援します。

このソリューションの統合には、Hugging Face の事前トレーニング済み話者ダイアライゼーション モデルの使用が含まれます。 PyAnnote ライブラリ。 PyAnnote は、Python で書かれた話者ダイアライゼーション用のオープンソース ツールキットです。このモデルはサンプル オーディオ データセットでトレーニングされており、オーディオ ファイル内で効果的な話者分割を可能にします。モデルは非同期エンドポイント設定として SageMaker にデプロイされ、日記タスクの効率的かつスケーラブルな処理を提供します。

次の図は、ソリューションのアーキテクチャを示しています。ソリューションのアーキテクチャ

この記事では、次の音声ファイルを使用します。

ステレオまたはマルチチャンネルのオーディオ ファイルは、チャンネルを平均化することによって自動的にモノラルにダウンミックスされます。異なるレートでサンプリングされたオーディオ ファイルは、ロード時に自動的に 16kHz にリサンプリングされます。

前提条件

次の前提条件を完了します。

  1. SageMaker ドメインを作成する.
  2. あなたのことを確認してください AWS IDおよびアクセス管理 (IAM) ユーザーには、 SageMaker の役割.
  3. AWS アカウントに、ml.g5.2xlarge インスタンスの SageMaker エンドポイントをホストするためのサービス クォータがあることを確認してください。

Hugging Face から PyAnnote 話者ダイアライゼーションにアクセスするためのモデル関数を作成する

Hugging Face Hub を使用して、必要な事前トレーニングされたものにアクセスできます。 PyAnnote 話者ダイアライゼーション モデル。 SageMaker エンドポイントを作成するときに、モデル ファイルをダウンロードするために同じスクリプトを使用します。

抱きしめる顔

次のコードを参照してください。

from PyAnnote.audio import Pipeline

def model_fn(model_dir):
# Load the model from the specified model directory
model = Pipeline.from_pretrained(
"PyAnnote/speaker-diarization-3.1",
use_auth_token="Replace-with-the-Hugging-face-auth-token")
return model

モデルコードをパッケージ化する

推論コードを含む inference.py などの重要なファイルを準備します。

%%writefile model/code/inference.py
from PyAnnote.audio import Pipeline
import subprocess
import boto3
from urllib.parse import urlparse
import pandas as pd
from io import StringIO
import os
import torch

def model_fn(model_dir):
    # Load the model from the specified model directory
    model = Pipeline.from_pretrained(
        "PyAnnote/speaker-diarization-3.1",
        use_auth_token="hf_oBxxxxxxxxxxxx)
    return model 


def diarization_from_s3(model, s3_file, language=None):
    s3 = boto3.client("s3")
    o = urlparse(s3_file, allow_fragments=False)
    bucket = o.netloc
    key = o.path.lstrip("/")
    s3.download_file(bucket, key, "tmp.wav")
    result = model("tmp.wav")
    data = {} 
    for turn, _, speaker in result.itertracks(yield_label=True):
        data[turn] = (turn.start, turn.end, speaker)
    data_df = pd.DataFrame(data.values(), columns=["start", "end", "speaker"])
    print(data_df.shape)
    result = data_df.to_json(orient="split")
    return result


def predict_fn(data, model):
    s3_file = data.pop("s3_file")
    language = data.pop("language", None)
    result = diarization_from_s3(model, s3_file, language)
    return {
        "diarization_from_s3": result
    }

シミュレーションの準備 requirements.txt ファイルには、推論を実行するために必要な Python ライブラリが含まれています。

with open("model/code/requirements.txt", "w") as f:
    f.write("transformers==4.25.1n")
    f.write("boto3n")
    f.write("PyAnnote.audion")
    f.write("soundfilen")
    f.write("librosan")
    f.write("onnxruntimen")
    f.write("wgetn")
    f.write("pandas")

最後に圧縮します inference.py およびrequirements.txtファイルを作成し、次のように保存します。 model.tar.gz:

!tar zcvf model.tar.gz *

SageMaker モデルを構成する

画像 URI、モデル データの場所を指定して SageMaker モデル リソースを定義します。 Amazon シンプル ストレージ サービス (S3)、および SageMaker ロール:

import sagemaker
import boto3

sess = sagemaker.Session()

sagemaker_session_bucket = None
if sagemaker_session_bucket is None and sess is not None:
    sagemaker_session_bucket = sess.default_bucket()

try:
    role = sagemaker.get_execution_role()
except ValueError:
    iam = boto3.client("iam")
    role = iam.get_role(RoleName="sagemaker_execution_role")["Role"]["Arn"]

sess = sagemaker.Session(default_bucket=sagemaker_session_bucket)

print(f"sagemaker role arn: {role}")
print(f"sagemaker bucket: {sess.default_bucket()}")
print(f"sagemaker session region: {sess.boto_region_name}")

モデルを Amazon S3 にアップロードする

zip 圧縮された PyAnnote Hugging Face モデル ファイルを S3 バケットにアップロードします。

s3_location = f"s3://{sagemaker_session_bucket}/whisper/model/model.tar.gz"
!aws s3 cp model.tar.gz $s3_location

SageMaker 非同期エンドポイントを作成する

提供された非同期推論構成を使用して、SageMaker にモデルをデプロイするための非同期エンドポイントを構成します。

from sagemaker.huggingface.model import HuggingFaceModel
from sagemaker.async_inference.async_inference_config import AsyncInferenceConfig
from sagemaker.s3 import s3_path_join
from sagemaker.utils import name_from_base

async_endpoint_name = name_from_base("custom-asyc")

# create Hugging Face Model Class
huggingface_model = HuggingFaceModel(
    model_data=s3_location,  # path to your model and script
    role=role,  # iam role with permissions to create an Endpoint
    transformers_version="4.17",  # transformers version used
    pytorch_version="1.10",  # pytorch version used
    py_version="py38",  # python version used
)

# create async endpoint configuration
async_config = AsyncInferenceConfig(
    output_path=s3_path_join(
        "s3://", sagemaker_session_bucket, "async_inference/output"
    ),  # Where our results will be stored
    # Add nofitication SNS if needed
    notification_config={
        # "SuccessTopic": "PUT YOUR SUCCESS SNS TOPIC ARN",
        # "ErrorTopic": "PUT YOUR ERROR SNS TOPIC ARN",
    },  #  Notification configuration
)

env = {"MODEL_SERVER_WORKERS": "2"}

# deploy the endpoint endpoint
async_predictor = huggingface_model.deploy(
    initial_instance_count=1,
    instance_type="ml.xx",
    async_inference_config=async_config,
    endpoint_name=async_endpoint_name,
    env=env,
)

エンドポイントをテストする

ダイアライゼーション用の音声ファイルを送信し、指定された S3 出力パスに保存されている JSON 出力を取得することで、エンドポイントの機能を評価します。

# Replace with a path to audio object in S3
from sagemaker.async_inference import WaiterConfig
res = async_predictor.predict_async(data=data)
print(f"Response output path: {res.output_path}")
print("Start Polling to get response:")

config = WaiterConfig(
  max_attempts=10, #  number of attempts
  delay=10#  time in seconds to wait between attempts
  )
res.get_result(config)
#import waiterconfig

このソリューションを大規模に展開するには、次を使用することをお勧めします。 AWSラムダ, Amazon シンプル通知サービス (Amazon SNS)、または Amazon シンプル キュー サービス (Amazon SQS)。これらのサービスは、スケーラビリティ、イベント駆動型アーキテクチャ、および効率的なリソース利用を目的として設計されています。これらは、非同期推論プロセスを結果処理から切り離すのに役立ち、各コンポーネントを個別にスケールし、推論リクエストのバーストをより効果的に処理できるようになります。

結果

モデル出力は次の場所に保存されます。 s3://sagemaker-xxxx /async_inference/output/. 出力には、オーディオ録音が 3 つの列に分割されていることが示されています。

  • 開始 (開始時間 (秒))
  • 終了 (秒単位の終了時間)
  • スピーカー(スピーカーラベル)

次のコードは、結果の例を示しています。

[0.9762308998, 8.9049235993, "SPEAKER_01"]

[9.533106961, 12.1646859083, "SPEAKER_01"]

[13.1324278438, 13.9303904924, "SPEAKER_00"]

[14.3548387097, 26.1884550085, "SPEAKER_00"]

[27.2410865874, 28.2258064516, "SPEAKER_01"]

[28.3446519525, 31.298811545, "SPEAKER_01"]

クリーンアップ

MinCapacity を 0 に設定すると、スケーリング ポリシーをゼロに設定できます。 非同期推論 リクエストなしでゼロに自動スケールできます。エンドポイントを削除する必要はありません。 再び必要になったときにゼロから再構築し、使用していないときのコストを削減します。次のコードを参照してください。

# Common class representing application autoscaling for SageMaker 
client = boto3.client('application-autoscaling') 

# This is the format in which application autoscaling references the endpoint
resource_id='endpoint/' + <endpoint_name> + '/variant/' + <'variant1'> 

# Define and register your endpoint variant
response = client.register_scalable_target(
    ServiceNamespace='sagemaker', 
    ResourceId=resource_id,
    ScalableDimension='sagemaker:variant:DesiredInstanceCount', # The number of EC2 instances for your Amazon SageMaker model endpoint variant.
    MinCapacity=0,
    MaxCapacity=5
)

エンドポイントを削除する場合は、次のコードを使用します。

async_predictor.delete_endpoint(async_endpoint_name)

非同期エンドポイント導入の利点

このソリューションには、次の利点があります。

  • このソリューションは、複数または大きなオーディオ ファイルを効率的に処理できます。
  • この例では、デモンストレーションのために単一のインスタンスを使用します。このソリューションを数百または数千のビデオに使用し、非同期エンドポイントを使用して複数のインスタンス間で処理する場合は、 自動スケーリング ポリシー、多数のソースドキュメント用に設計されています。自動スケーリングは、ワークロードの変化に応じて、モデルにプロビジョニングされるインスタンスの数を動的に調整します。
  • このソリューションは、長時間実行されるタスクをリアルタイム推論から分離することで、リソースを最適化し、システム負荷を軽減します。

まとめ

この投稿では、Python スクリプトを使用して Hugging Face の話者ダイアライゼーション モデルを SageMaker にデプロイする簡単なアプローチを提供しました。非同期エンドポイントを使用すると、ダイアライゼーション予測をサービスとして提供し、同時リクエストにシームレスに対応するための効率的かつスケーラブルな手段が提供されます。

オーディオ プロジェクトの非同期スピーカー ダイアライゼーションを今すぐ始めましょう。独自の非同期ダイアライゼーション エンドポイントを立ち上げて実行することについて質問がある場合は、コメントにお問い合わせください。


著者について

サンジェイティワリー AI/ML のスペシャリスト ソリューション アーキテクトは、戦略的な顧客と協力してビジネス要件を定義し、特定のユースケースに関する L300​​XNUMX セッションを提供し、スケーラブルで信頼性が高く、パフォーマンスの高い AI/ML アプリケーションとサービスを設計することに時間を費やしています。彼は、AI/ML を活用した Amazon SageMaker サービスの立ち上げと拡張を支援し、Amazon AI サービスを使用していくつかの概念実証を実装しました。また、デジタル変革の一環として高度な分析プラットフォームも開発しました。

キラン・チャラパリ は、AW​​S 公共部門のディープ テクノロジー ビジネス開発者です。彼は AI/ML で 8 年以上の経験があり、ソフトウェア開発と販売全般で 23 年の経験があります。 Kiran は、インド全土の公共部門の企業が、AI、ML、および大規模言語モデルを含む生成 AI テクノロジーを使用するクラウドベースのソリューションを探索し、共同作成するのを支援します。

スポット画像

最新のインテリジェンス

スポット画像

私たちとチャット

やあ! どんな御用でしょうか?