Azure OpenAI Whisper の申請から利用までの手順をまとめた

# はじめに
`Azure OpenAI`と聞くと、`GPT`モデルを想定する人が多いと思いますが、`Whisper`という音声ファイルから文字起こしをしてくれるモデルがあります。`Whisper`を使うことで、ボイスユーザーインターフェース(`Voice User Interface`: `VUI`)を開発することができるため、音声コマンドを受け入れたり、ユーザーとの対話を可能にするアプリケーションを構築できるなど、開発の幅が広がります。`Whisper`はまだ発展途中のモデルではありますが、今後さらに利用されるようになることを期待して、`Whisper`モデルの申請手順と利用方法を本記事にまとめます。

# Azure OpenAI Whisperとは
`Whisper`モデルは、音声ファイルの文字起こしに使用できる`OpenAI`の音声テキスト変換モデルです。 このモデルは、英語の音声を含む音声ファイルの文字起こしに最適化されていますが、他の言語の音声を含む音声ファイルを文字起こしにも使用できます。

https://learn.microsoft.com/ja-jp/azure/ai-services/speech-service/whisper-overview

:::note warn
2023年11月現在、`Azure OpenAI Whisper`が利用できるのは、`North Central US`と`West Europe`の2つのリージョンに限ります。
また、`Azure AI Speech`を介した`Whisper`モデルは、`East US`と`Southeast Asia`と`West Europe`の3つのリージョンのみで利用可能です。
:::

## Azure AI Speech
`Azure`では文字起こしをができるモデルとして、`Whisper`モデルの他に、`Azure AI Speech`モデルが用意されています。ユースケースによって、`Azure AI Apeech`モデルの方が適している場合があるので、`Azure AI Speech`の利用を一度検討してみるとよいです。以下に、主なシナリオに対してのそれぞれのモデルの比較表をまとめます。

|項目|Azure OpenAI Whisper|Azure AI Speech|
|---|---|---|
|音声ファイルの高速処理|〇|△|
|音声ファイルの英語翻訳|〇|△|
|サポートされているファイル形式|mp3、mp4、mpweg、mpga、m4a、wav、webm|mp3、wav、ogg|
|音声ファイルの最大サイズ|25 MB|1 GB|
|リアルタイム文字起こし|×|〇|
|通話の概要|×|〇|
|話者の区別|×|〇|

(〇：奨励、△：利用可能、×：利用不可)

https://learn.microsoft.com/ja-jp/azure/ai-services/speech-service/whisper-overview#whisper-model-via-azure-ai-speech-models

# 申請方法
`Azure OpenAI Whisper`を利用するには2023年11月現在、`Azure OpenAI Service`の利用申請が必要になります。以下の申請フォームから必要項目を入力していただき、提出してください。

https://customervoice.microsoft.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR7en2Ais5pxKtso_Pz4b1_xUNTZBNzRKNlVQSFhZMU9aV09EVzYxWFdORCQlQCN0PWcu

:::note info
登録プロセスについては、Microsoftの公式ドキュメントにまとめられています。
https://learn.microsoft.com/en-us/legal/cognitive-services/openai/limited-access#registration-process
:::

## 申請フォームの回答に関する注意事項
2023年11月現在の主な注意事項は以下になります。
-  `Azure OpenAI`サービスは登録が必要で、現在は承認された企業顧客およびパートナーのみが利用できます。
-  医療のような高いリスクの分野での利用は承認可能性が低く、内部の向けの利用は承認可能性が高いです。
-  個人メールでの申請や、承認された企業顧客ではない場合、拒否される可能性があります。

以下が注意事項に関する文書になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/f2282cc8-934b-64f5-a216-9e23276de2a2.png)

## 申請フォームの回答項目
2023年11月現在の回答項目は以下の通りです。
- 氏名(First Name, Last Name)
- `Azure OpenAI Service`を利用申請するサブスクリプション数
- 利用申請するサブスクリプションID
- 申請者の会社メールアドレス(※1)
- 会社名情報(会社名、住所、都市名、都道府県、郵便番号、国、会社HPのURL、電話番号、業態(※2))
- `Microsoft`社員の連絡先(氏名、メールアドレス)(※3)
- 顧客の代わりの申請ではないことの確認
- 利用申請するモデルの選択(※4)
- (`Text and code`モデルの利用用途の回答)(※5)
- `Azure OpenAI Service`規約への同意
- `Azure OpenAI Service`のデータ処理への同意(※6)
- サービス改善へのアンケート

### (※1) 申請者の会社メールアドレス
必ず会社のメールアドレスを入力してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/7d892ca2-dac0-cc0a-546a-0020613734d3.png)

### (※2) 企業の業態
所属企業の業態を選択してください。

:::note info
`ISV`: 独自の製品やサービスを開発/提供する企業
`SI`: システムインテグレーター
`MSP`: `Microsoft`製品を提供する企業
`Internal`: `Microsoft`社員
`MVP`: `Microsoft`に認定された人
`Other`： 顧客、など
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/8ca2d8b4-b866-e1e4-4b30-8c5c18fa05ef.png)

### (※3) Microsoft社員の連絡先
`Microsoft`社員の連絡先を持つ場合は入力してください。任意の回答項目です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/3c299d97-2281-6664-36bf-3ca5165ac304.png)

### (※4) 利用申請するモデルの選択

必要なモデルを選択してください。

:::note info
`Text and code models`: テキストやコードを生成するモデル(`GPT-3.5`、`GPT-4`、等)
`DALL-E 2 models`: 文字から画像を生成するモデル
`OpenAI Whisper model`: 音声から文字起こしをするモデル
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/127b1ce8-4d89-77f9-7204-daf29f41e090.png)

### (※5) Text and codeモデルの利用用途の回答
利用申請で`Text and code model`を選択した場合のみ回答が必要になります。`Text and code model`の利用用途を回答してください。利用用途として挙げられているのは以下の項目になります。
- 会話エージェントとの対話
- 会話エージェントの作成
- コード生成、変換シナリオ向けの利用
- 報道・解説向けの利用
- `MVP`、`RD`によるデモへの使用
- 質問応答のための利用
- データの分類、分析、抽出
- ソース文書の検索
- コンテンツの要約
- 特定トピックの執筆支援
- `Azure OpenAI`カスタムモデルの作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/8c721044-d305-5a09-613c-039a8ae1195d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/b39cce10-b07a-a50d-b0d9-877de81cbfe0.png)

### (※6) Azure OpenAI Serviceのデータ処理への同意
同意をする場合は「Yes, I attest」のチェックボタンを押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/6927b1af-ecc3-7674-0a09-b6991d2dbb81.png)

#### Azure OpenAIサービスに提供されたデータの処理、使用、保存方法
`Azure OpenAI Service`に関するデータとプライバシーに関する内容は、以下の公式ドキュメントでまとめられています。

https://learn.microsoft.com/en-us/legal/cognitive-services/openai/data-privacy

詳しくは公式ドキュメントをあたってもらえればと思いますが、要旨は以下になります。(わかりやすいために表現を一部変えている部分がございます。詳細はドキュメントをご確認ください。)

【データ利用規則】
- `OpenAI`、マイクロソフト、第三者、のモデル・製品・サービスの改善には使用されません。
- モデルはステートレスであり、モデルにプロンプトは格納されません。また、プロンプトと生成コンテンツは、モデルのトレーニング、再トレーニング、改善、には使用されません。(ただし、学習データを利用してファインチューニングを行う場合は、ユーザー専用の`Azure OpenAI`モデルを利用することができます。)
- `Azure OpenAI`では、プロンプト、生成されたコンテンツ、プロンプトに含まれる拡張データ、トレーニングデータ、検証データ、が処理されます。
- 顧客のプロンプトと生成コンテンツは、顧客の`Azure OpenAI`リソースがデプロイされている`Azure`リージョンに格納されます。
- `on your data`を使ったグラウンディングでも、データは保存元から`Azure OpenAI`にコピーされずに、接続されたデータソースから関連データを取得することで、プロンプトを拡張します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/454d3e9c-8f0a-90f3-6e92-4527ddbc8ac4.png)

:::note info
`on your data`の裏側では`Azure Cognitive Search`が利用されてグラウンディングされています。
:::

【コンテンツフィルターと不正使用の監視】
- `Azure OpenAI Service`の有害な使用のリスクを軽減するために、`Azure OpenAI Service`にはコンテンツフィルタリングと不正使用監視機能の両方が含まれています。
- コンテンツフィルタリングは、プロンプトと生成データをリアルタイムで評価し、有害なコンテンツの種類をチェックして、設定されたしきい値を超えるコンテンツの生成を停止するように構成しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/0902fc15-124b-d85e-92f8-c1c43fdd71b6.png)
- 不正使用を検出・軽減するために、`Azure OpenAI`はすべてのプロンプトと生成されたコンテンツを最大で30日間安全に保存しています。
- 機密性が高かったり法的に規制されている入力データの処理を含む場合で、有害な出力や誤用の可能性が低い場合では、不正使用の監視をオフにしてプロンプトや回答を保存させないことが可能です。
- 不正使用の可能性を評価する人間のレビュー担当者は承認された`Microsoft`の従業員であり、不正使用監視システムによってフラグが立てられた場合にのみ、プロンプトや生成データにアクセス可能です。

:::note info
コンテンツフィルターについては以下の公式ドキュメントでまとめられています。
https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/content-filter?tabs=python
コンテンツフィルターには、4つの重要度レベルと4つのカテゴリ(憎悪、性的、暴力、自傷行為)があります。2023年11月現在でプレビューにはなりますが、各カテゴリに対して重大度レベルでフィルター処理の設定が可能です。
:::

## 申請フォームの回答完了画面
送信ボタンを押すと、以下のようなサンクスページが表示されます。`Text and code models`を利用申請した場合は10日以内での審査が行われるそうです。`DALL-E 2 models`を利用申請した場合は明確な審査期間が書かれていないため、必要でなければ`DALL-E 2 models`の利用申請をしないほうが、早く`Azure OpenAI Service`を利用できるようになるかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/6212179d-bc26-d700-682d-1c953ea0a8fe.png)

登録した会社のメールアドレス宛にも、サンクスメールが届いていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/785bed22-8ae2-e98e-345b-4aff86938925.png)

私は`Microsoft`の社員であることが関係しているとは思いますが、当日の18:00に承認された旨のメールを受け取りました。(申請から承認まで1時間以内で完了。)

# モデルのデプロイ方法
`Microsoft`から`Azure OpenAI Serivce`の承認メールを受け取ったら、`Azure`ポータルでモデルをデプロイしていきます。`Azure`ポータルで`Azure OpenAI`リソースを作成後、「Azure OpenAI Studioに移動する」を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/ff30182d-5aa1-f315-502b-da7eba72b77f.png)

`Azure OpenAI Studio`に移動後、「デプロイ」＞「＋新しいデプロイの作成」を選択します。するとモデルのデプロイをするモーダルが表示されるため、モデルを「whisper」にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/ea8420c4-d38f-9acd-7120-f46296092bd9.png)

モデルバージョンやデプロイ名を入力した後、「作成」を押すとモデルのデプロイ完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/242eaa4a-0788-f18f-6364-77bf4fcc18c1.png)

# Whisperモデルの利用
2023年11月現在、`Whisper`モデルを利用するための`SDK`は用意されていないため、`REST API`を利用するしかありません。本記事では、`REST API`を使って、コマンドラインと`Python`のそれぞれで`Whisper`モデルを利用してみます。

## 事前準備
`Whisper`モデルを利用するために、事前準備をします。

### キーとエンドポイントを取得
`Azure`ポータルで、「キーとエンドポイント」を選択し、「キー１」と「エンドポイント」をコピーしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/4c79bb34-1285-1bc2-4a7f-f842cf67b7ba.png)

### サンプルオーディオファイルを入手
以下のリポジトリから、サンプルの音声ファイルを取得してください。(私は`wikipediaOcelot`をダウンロードしました。)

https://github.com/Azure-Samples/cognitive-services-speech-sdk/tree/master/sampledata/audiofiles

## コマンドラインでの利用
コマンドラインを開き、以下のコマンドを実行します。`<AZURE_OPENAI_ENDPOINT>`と`<AZURE_OPENAI_KEY>`は、先ほどコピーしたキーとエンドポイントを設定してください。`<YOUR_DEPLOYMENT_NAME>`は、`Azure`ポータルで入力したモデルのデプロイ名を設定してください。

```bash:bash
curl <AZURE_OPENAI_ENDPOINT>/openai/deployments/<YOUR_DEPLOYMENT_NAME>/audio/transcriptions?api-version=2023-09-01-preview \
 -H "api-key: <AZURE_OPENAI_KEY>" \
 -H "Content-Type: multipart/form-data" \
 -F file="@./wikipediaOcelot.wav"
```

実行結果は以下のようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/79c81918-9b17-8249-2cd2-c67427eab5b2.png)

コマンドラインでの利用は以下の`Microsoft`公式ドキュメントを参考にしました。

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/whisper-quickstart?tabs=command-line

## Pythonでの利用
まず、必要なライブラリをインストールします。
```bash:bash
pip install requests
```
Pythonのソースコードは以下になります。
```python:main.py
import requests

azure_openai_endpoint = "<AZURE_OPENAI_ENDPOINT>"
deployment_name = "<YOUR_DEPLOYMENT_NAME>"
api_version = "2023-09-01-preview"
azure_openai_key = "<AZURE_OPENAI_KEY>"
file_path = "./wikipediaOcelot.wav"

url = f"{azure_openai_endpoint}/openai/deployments/{deployment_name}/audio/transcriptions?api-version={api_version}"

headers = {
    "api-key": azure_openai_key,
}

files = {
    "file": (file_path, open(file_path, "rb")),
}

response = requests.post(url, headers=headers, files=files)

if response.status_code == 200:
    print("API call successful. Response:")
    print(response.json())
else:
    print(f"API call failed with status code {response.status_code}. Response:")
    print(response.text)
```
コマンドラインで、`main.py`を実行します。
```bash
python main.py
```

実行結果は以下のようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/4ee029f7-b2bf-6b0c-a0ed-a1d9510685fc.png)

ソースコードを以下の`GitHub`リポジトリに保存しましたので、必要であればクローンして使ってみてください。

https://github.com/yus04/whisper-demo

# おわりに
本記事では、`Azure OpenAI Whisper`の利用申請から`REST API`を使った`Whisper`の利用方法を、コマンドラインと`Python`の2通りで紹介しました。`Azure AI Speech`と比較してできることが少ない`Whisper`ですが、今後はリアルタイムな文字起こしなど、できることが増えていってほしいと思います。