6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Qiita100万記事感謝祭!記事投稿キャンペーン開催のお知らせ

知ってた?Amazon BedrockでWhisper large-v3-turboが使えるんだよ!

Last updated at Posted at 2025-01-17

いきなりですが、少し前にAmazon Bedrock Marketplaceが登場しました!!

Bedrockでは、厳選されたモデルだけが利用できましたが、マーケットプレースではそれ以外のモデルが提供されています。その数はなんと 122!! (2024/1/17時点)

マネージメントコンソール上では、「Model Catalog」で表示されるモデルのうち、「Model collection」が「Bedrock Marketplace」のものが該当します。

この中に、テキストや画像を生成するモデルに混じって、音声からテキストを生成するWhisperが使用できるのを発見しました。

見つけたらやるしかない。

デプロイしてみた

モデルカタログでWhisper Large V3 Turboをクリックし、モデルの詳細画面を表示します。
「Deploy」ボタンをクリックします。

エンドポイント名、インスタンス数、インスタンスタイプを入力します。

Bedrockではありますが、インスタンスを立ち上げる必要があります。(=毎月固定費がかかるイメージです)

詳細設定としてはVPCやIAM、KMSの設定があります。

「Deploy」ボタンをクリックすると、デプロイが始まります。

Endpointが「In Service」になったらデプロイ完了です。

Endpoint ARNは、invokeModel呼び出しの際のmodelIdパラメーターで指定するのでコピーしておきます。

難しい設定はなく、デプロイは超簡単です。

呼び出し方を調べる

さて、呼び出してみようと思うのですが、呼び出し方がわからない!!

とりあえず呼んでみる

import boto3
import json

client = boto3.client("bedrock-runtime")
client.invoke_model(
    modelId="arn:aws:sagemaker:us-east-1:123456789012:endpoint/endpoint-quick-start-abcde",
    body=json.dumps({}),
)

ValidationException: An error occurred (ValidationException) when calling the InvokeModel operation: {
"code": 400,
"type": "InternalServerException",
"message": "Input payload must contain audio_input key."
}

当然エラーになったのですが、audio_inputというキーが必要というヒントを得ましたw

「whisper audio_input aws」でGoogle検索すると、以下のブログがヒットしました。

SageMaker JumpStartでWhisperを使う方法を紹介したもののようです。

SageMaker JumpStartでは以下のように呼び出すとのことです。

with open(input_audio_file_name, "rb") as file:
    wav_file_read = file.read()

payload = {"audio_input": wav_file_read.hex(), "language": "french", "task": "translate"}

predictor.serializer = JSONSerializer()
predictor.content_type = "application/json"

真似てみます。

import boto3
import json

client = boto3.client("bedrock-runtime")

with open("./jfk.flac", mode="rb") as f:
    input_audio = f.read()

response = client.invoke_model(
    modelId="arn:aws:sagemaker:us-east-1:123456789012:endpoint/endpoint-quick-start-abcde",
    body=json.dumps(
        {"audio_input": input_audio.hex(), "language": "french", "task": "translate"}
    ),
)

print(response)

以下で公開されているサンプルファイルを使用しました。

https://github.com/openai/whisper/blob/main/tests/jfk.flac

すると、、、

{'ResponseMetadata': {'RequestId': '2d0115d4-c378-43fa-b4a0-fc59903de7b6',
  'HTTPStatusCode': 200,
  'HTTPHeaders': {'date': 'Fri, 17 Jan 2025 11:22:52 GMT',
   'content-type': 'application/json',
   'content-length': '143',
   'connection': 'keep-alive',
   'x-amzn-requestid': '2d0115d4-c378-43fa-b4a0-fc59903de7b6',
   'x-amzn-bedrock-invocation-latency': '632'},
  'RetryAttempts': 0},
 'contentType': 'application/json',
 'body': <botocore.response.StreamingBody at 0x7f632d9ab670>}

なんかいい感じの返事がありました!!!!!!!!!!!!!!!!!!!!!!!

invokeModelのレスポンスをいつもの方法で取得します。

response_body = json.loads(response.get("body").read())

print(json.dumps(response_body, indent=2, ensure_ascii=False))
{
  "text": [
    " Et donc, mes amis, ne me demandez pas ce que votre pays peut faire pour vous, demandez ce que vous pouvez faire pour votre pays."
  ]
}

やりました~~!!

感動

AWSさん、使い方はドキュメントに記載してください(泣)

その他、気付いた点

  • Bedrockのモデル呼び出しログにログ記録される
  • 実態はSageMaker 推論エンドポイントのようです(SageMaker Studioのエンドポイント一覧に表示あり)
  • SageMakerとしてもログが出る
  • SageMaker JumpStartでデプロイしたものを、Bedrockに持ってくることができる(ドキュメント

エンドポイントの削除

検証が終わったら不要なコストが掛からないように削除しましょう。

image.png

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?