Azure OpenAI Text to speech で今日の天気予報を読み上げる

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/concepts/models?tabs=global-standard%2Cstandard-chat-completions#text-to-speech-preview

> テキスト読み上げ (プレビュー)
現在プレビュー段階にある OpenAI テキスト読み上げモデルを使って、テキストを音声に合成できます。

> Azure AI 音声経由で OpenAI テキスト読み上げの音声を使うこともできます。 詳細については、Azure OpenAI Service または Azure AI 音声経由の OpenAI テキスト読み上げ音声のガイドを参照してください。

こちらを遊んでみたメモです。

## 材料
- Azure OpenAI
- Azure Logic Apps
- SharePoint (ストレージなど *.mp3 を格納する場所)

## 詳細

### Azure OpenAI
自分用のデプロイをひとつ用意しております。tts-hd を選びました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/44ae0228-5b94-275b-8da9-d4163b393801.png)

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/reference-preview#speech---create

`POST https://{endpoint}/openai/deployments/{deployment-id}/audio/speech?api-version=2024-12-01-preview` 

ここでは以下を用いています。

`https://nobuk-m6ftfebf-swedencentral.cognitiveservices.azure.com/openai/deployments/noytts-hd/audio/speech?api-version=2024-05-01-preview`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/6e1528a5-9584-a134-7ebd-633e15b6f2c7.png)



### Azure Logic Apps


#### マネージド ID
先に、当該 Logic Apps のシステム割り当てマネージド ID を有効にしておきます。Azure ロールの割り当てには Cognitive Services OpenAI User を指定しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/092f21e0-4500-54d8-426c-bd50da589874.png)


#### トリガー

ワークフローを作成していきます。日次実行としています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/d7ed3a33-c2d3-d3da-ffe1-4e1b34731280.png)


#### 今日の予報を取得する

場所は東京。ほか特に何もしていません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/f3414fad-fa58-64ef-15a3-2b71e4bcc480.png)

#### テキストの翻訳

今日の予報の概要を翻訳元テキストとして設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/bb1e896b-8197-5dba-d6e1-22783927ab25.png)


#### HTTP リクエスト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/65641568-4884-4a6a-cc47-4f0f76043432.png)

先ほど確認したエンドポイントへ POST を送ります。

本文は以下。

```json:JSON
{
  "model": "tts-hd",
  "input": "@{body('テキストの翻訳')}",
  "voice": "alloy"
}
```

Rest API で以下と同様になります。
```
POST https://nobuk-m6ftfebf-swedencentral.cognitiveservices.azure.com/openai/deployments/noytts-hd/audio/speech?api-version=2024-05-01-preview
Content-Type: application/json
api-key: <api-key>

{
    "model": "tts-hd",
    "input": "<音声にしたいテキスト>",
    "voice": "alloy"
}
```


#### ファイルの作成

SharePoint (またはストレージなど *.mp3 を格納する場所) を用意しておきます。Response の Body をそのままコンテンツとして保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/01e774b0-bc8f-f3c7-9bb2-b0e67de60158.png)


例:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/f5e8d6c4-4e56-54d5-74ae-fab9f7abb4a1.png)

## 完成


[speech.mp3](https://drive.google.com/file/d/1cVrHXMH92LnY7oSFMBCCughgisk2GgHN/view?usp=sharing)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/ced7cf8c-92aa-3b55-dbae-5bcb7af4eda2.png)
出力:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/67666b8c-849a-0c8e-b373-ec8f6fbd4265.png)



## 参考

[OpenAI テキスト読み上げ音声とは - Azure AI services | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/ai-services/speech-service/openai-voices)
[テキスト読み上げについてのよくあるご質問 (FAQ) - Azure AI services | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/ai-services/speech-service/faq-tts)