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

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

https://aws.amazon.com/jp/blogs/news/amazon-bedrock-marketplace-access-over-100-foundation-models-in-one-place/

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

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

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/65ab5bd8-311b-7744-2996-d3497bc14278.png)

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

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/a79cfabc-2384-cac4-2a04-2062fbdd1a32.png)

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

## デプロイしてみた

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

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/4e70b1c4-2e10-3486-ee76-ab84be7aab5d.png)

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

:::note
Bedrockではありますが、インスタンスを立ち上げる必要があります。（＝毎月固定費がかかるイメージです）
:::

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/3ba39b5d-e028-804c-54e2-b3f1fcc4b59c.png)

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

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/dac169b7-064d-d9b4-a075-58f2024f4029.png)

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

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/0a440b24-22cf-012f-0f4a-3d66d5f1548f.png)

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

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/574d6053-7314-8a29-8d2d-3317f691c43d.png)

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

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

## 呼び出し方を調べる


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


とりあえず呼んでみる

```python
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."
> }

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

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

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

https://aws.amazon.com/jp/blogs/machine-learning/whisper-models-for-automatic-speech-recognition-now-available-in-amazon-sagemaker-jumpstart/

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

```python
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"
```

真似てみます。

```python
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)
```

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

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のレスポンスをいつもの方法で取得します。

```python
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に持ってくることができる（[ドキュメント](https://docs.aws.amazon.com/sagemaker/latest/dg/jumpstart-foundation-models-use-studio-updated-register-bedrock.html)）

## エンドポイントの削除


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/cc8ac58a-8971-7606-8a42-f437766aa4c8.png)