Azure AI SpeechでのIP制限設定

Azure AIではAI音声解析サービスの[「AI Speech」](https://learn.microsoft.com/ja-jp/azure/ai-services/speech-service/overview)が提供されています。

例えば、音声の文字起こしやリアルタイム翻訳、話者認識など音声を解析する様々な機能が提供されており、Azure Portal上のGUI上で簡単にサービスを構築することができます。

しかしAI Speechをデフォルトで作成した場合はパブリックアクセスが許可されており、セキュアに利用できる環境（IPアドレス制限やプライベートエンドポイントなど）を準備する場合、いくつか手順が必要となりますのでその方法をご紹介します。

参考：https://learn.microsoft.com/ja-jp/azure/ai-services/speech-service/speech-services-private-link?tabs=portal

## カスタムドメインの作成
AI SpeechはAzure OpenAIやDocument IntelligenceなどのAzure AIサービスとは異なり、アクセス制限をする際は**まず最初にカスタムドメインを作成する必要があります**。

ただカスタムドメインとはいえ証明書やDNS等の設定のようなものは不要で、Azure PortalのGUI上で簡単に設定できます。

Azure Speechリソースの「ネットワーク」からカスタムドメインを作成します

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398865/40301aa7-cf45-1e55-c66f-0aa19dce59b1.png)

カスタムドメイン作成後は、下記のようにネットワーク設定が可能となります

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398865/08a146d1-e10d-0a1c-8916-df0b2c68cf82.png)

## パブリックアクセス制限（IP制限）
ネットワーク設定から許可するアクセス先を「選択したネットワークとプライベートエンドポイント」に指定し、アクセス許可したいIPアドレスを追加します。

現在アクセス中のIPアドレスを許可する場合は「クライアントIPアドレス」の追加にチェックを入れます。

IPアドレスの設定が完了したら保存します。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398865/d55d93fa-67e4-215e-480c-8dacb4ec5979.png)

## AI Speechの利用方法（Node.jsコンソールアプリ）
次に、アプリからアクセス制限したAI Speechへのアクセスする方法をご紹介します。

ソースコードは下記Microsoft公式のクイックスタートをベースに説明します。音声ファイルの内容を文字起こしする簡単なNode.jsのコンソールアプリです。

https://learn.microsoft.com/ja-jp/azure/ai-services/speech-service/get-started-speech-to-text?tabs=windows%2Cterminal&pivots=programming-language-javascript#recognize-speech-from-a-file

### 1.SDKのインストール
まずは、AI SpeechのSDKをインストールします
```
npm install --save microsoft-cognitiveservices-speech-sdk
```

### 2. speechConfigの変更
次に`SpeechRecognition.js`ソースコード内の`speechConfig`の設定を下記の通り変更します
* `SPEECH_ENDPOINT`を下記の内容に設定します
   * `wss://<カスタムドメイン>.cognitiveservices.azure.com/stt/speech/recognition/conversation/cognitiveservices/v1?language=<言語>`
* `speechConfig`の取得箇所を`fromSubscription`から`fromEndpoint`に変更し、上記カスタムドメインを元にAI Speechのインスタンスを作成できるよう変更します

```js
const speechsdk = require("microsoft-cognitiveservices-speech-sdk");

const SPEECH_ENDPOINT = "wss://<カスタムドメイン>/stt/speech/recognition/conversation/cognitiveservices/v1?language=en-US";
const SPEECH_KEY = "<Speech APIキー>";
const speechConfig = sdk.SpeechConfig.fromEndpoint(new URL(SPEECH_ENDPOINT), SPEECH_KEY);
```

カスタムドメインは、AI Speechの「エンドポイント」から確認できます。ここから`https://`を除いた文字を<カスタムドメイン>に設定します
（`<ドメイン名>.cognitiveservices.azure.com`の形式です）

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398865/fed80e11-bca8-fcc5-b964-5d697ca03fa3.png)


### 3.アプリの実行
音声ファイル（サンプルの場合`YourAudioFile.wav`）を上記jsファイルと同じ階層に配置し、下記コマンドから実行します

```
node.exe SpeechRecognition.js
```

実行後、下記のように音声の文字起こし結果が取得できます。
（下記内容はMicrosoft公式サンプル内の[こちら](https://github.com/Azure-Samples/cognitive-services-speech-sdk/blob/master/sampledata/audiofiles/TalkForAFewSeconds16.wav)の音声ファイルを文字起こしした結果となります）

```
RECOGNIZED: Text=I'll talk for a few seconds so you can recognize my voice in the future.
```

許可したIP以外で同じコマンドを実行すると、401が返りアクセスがブロックされていることが確認できます。

```
CANCELED: Reason=0
CANCELED: ErrorCode=4
CANCELED: ErrorDetails=Unable to contact server. StatusCode: 1006, wss://<カスタムドメイン>/stt/speech/recognition/conversation/cognitiveservices/v1?language=en-US Reason:  Unexpected server response: 401
```


## まとめ
今回は、Azure AI Speechのアクセス制限についてご紹介しました。