Speech to Text REST API を使ってみる

「[Speech to Text REST API](https://docs.microsoft.com/ja-jp/azure/cognitive-services/speech-service/rest-speech-to-text)」を使う機会があったので軽くまとめます。

## Speech to Text REST APIとは？
Auzreの音声サービスで提供されている機能の一つで、音声情報をテキストに変換してくれます。

https://azure.microsoft.com/ja-jp/services/cognitive-services/speech-services/

## Cognitive Servicesの音声サービスを作成する
Speech to Text REST APIを使うには、音声サービスを作成する必要があります。

まずは、Azure Portalから「音声サービス」を検索し、表示します。
![サービス検索](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/d0a11af1-34a0-1927-0687-819852c6a529.png)

音声サービス画面が表示されたら、サービスを作成します。
まずは、［＋作成］をクリックします。
![サービス作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/3c2f667e-afc0-d5ce-a418-3381a4b154ca.png)

サービス名や、リージョンなどを設定します。
価格レベル、以下の画像では`Standard S0`を設定していますが、フリーで使いたい場合は、`F0`を選択ください（すでに作成済みのため選べませんでした）
[料金はこちら](https://azure.microsoft.com/ja-jp/pricing/details/cognitive-services/speech-services/)
５音声時間は無料とありますので、たぶんトータル５時間分んの音声のテキスト化が無料かと思います。。
![サービス設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/f220901d-ea9d-354e-51ca-216057065ddf.png)

作成できたら、`キーとエンドポイント`を選択し、`キー１`をコピーしておきます。
![キーの取得](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/4d8b3d9b-e7b0-f758-9843-9f60ec5b7426.png)


## Speech to Text REST APIを使ってみる
REST を介してオンライン文字起こしと通信する必要は、「[REST API for short Audio](https://docs.microsoft.com/ja-jp/azure/cognitive-services/speech-service/rest-speech-to-text#speech-to-text-rest-api-for-short-audio)」を使います。
Shortとある通り、最大60秒までの音声が対象となっていますのでご注意ください。

### エンドポイント準備する
```html:エンドポイント
https://<REGION_IDENTIFIER>.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1
```

#### リージョン名を設定する
`<REGION_IDENTIFIER>`は、サービスを作成したリージョン名が入ります。
今回作成した西日本だと`japanwest`となります。
他のリージョンの場合は、[こちらの識別子を参照](https://docs.microsoft.com/ja-jp/azure/cognitive-services/speech-service/rest-speech-to-text#regions-and-endpoints)ください。

#### 言語パラメータを付与する
エンドポイント最後に、言語パラメータを付与する必要があります。

```html:言語パラメータ
language=<LANGUAGE>
```
`<LANGUAGE>`は、変換したい言語パラメータが入ります。このパラメータが付与されていない場合は、4xx HTTPエラーが返されます。
たとえば日本語の場合は、`ja-JP`となります。
他の言語パラメータは、[こちらを参照](https://docs.microsoft.com/ja-jp/azure/cognitive-services/speech-service/language-support#speech-to-text)してください

#### 今回のエンドポイント
西日本リージョンで、日本語の場合は、以下のURLがエンドポイントとなります

```html:エンドポイント
https://japanwest.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1?language=ja-JP
```

#### その他のパラメータ
不適切表現をどうするか？を設定する`profanity`パラメータなどもあります。
詳しくは、[クエリパラメータ](https://docs.microsoft.com/ja-jp/azure/cognitive-services/speech-service/rest-speech-to-text#query-parameters)をご覧ください

##　APIを呼び出してみる

#### リクエストメッセージの作成
リクエスト用の`HttpRequestMessage`を作成します。
`<<　エンドポイント >>` には、先ほど作成したURL
`<< キー１ >>` には、Azureで登録した音声サービスからの情報を設定します。
そのほかのヘッダにつきましては[要求ヘッダ](https://docs.microsoft.com/ja-jp/azure/cognitive-services/speech-service/rest-speech-to-text#request-headers)をご覧下さい

```csharp
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, << エンドポイント >>);
request.Headers.Add("Ocp-Apim-Subscription-Key", << キー１ >>);
equest.Headers.Add("Accept", "application/json");
```

#### 音声データを設定
次に変換を行う音声データを設定します。
`<<　音声データ>>` には、変換を行う音声のバイナリデータを設定します。

`httpContent.Headers.ContentType`に指定している内容は、音声データのフォーマットに依存します。
現在使用できるフォーマットは、`WAV`と、`OGG`です。詳しくは、[オーディオの形式](https://docs.microsoft.com/ja-jp/azure/cognitive-services/speech-service/rest-speech-to-text#audio-formats)をご覧ください。
また、`MediaTypeHeaderValue`の設定内容は、[要求ヘッダの`Content-type`](https://docs.microsoft.com/ja-jp/azure/cognitive-services/speech-service/rest-speech-to-text#request-headers)をご覧ください

```csharp
var httpContent = new ByteArrayContent( << 音声データのバイナリデータ >> );

httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(@"audio/wav");
request.Content = httpContent;
```

#### リクエストを送信する
作成した`HttpRequestMessage`を`HttpClient`で送信することで、変換結果を取得することができます。

送信後に取得できる[HTTP 状態コード](https://docs.microsoft.com/ja-jp/azure/cognitive-services/speech-service/rest-speech-to-text#http-status-codes)です。
400番が返ってくる場合は、言語コードの設定ミスや、無効な音声データの可能性がありますのでご確認ください。

```csharp
using (var client = new HttpClient()){

    var response = await httpClient.SendAsync(request);
    if(response.IsSuccessStatusCode){
      //~受信後の処理~
    }
}

```


#### 変換結果を確認する
変換結果は、[クエリパラメータ](https://docs.microsoft.com/ja-jp/azure/cognitive-services/speech-service/rest-speech-to-text#query-parameters)の`format`で２種類の変換結果を取得することができます。
変換後のテキストは、`DisplayText`に登録されます。

##### simpleが指定されている場合（初期値）
```json
{
  "RecognitionStatus": "Success",
  "DisplayText": "Remind me to buy 5 pencils.",
  "Offset": "1236645672289",
  "Duration": "1236645672289"
}
```


## まとめ
以前記述した以下のサービスと繋げると、名探偵コナンのように喋った声を別の人の声に変えることができて楽しいですよ。

https://qiita.com/masaya3/items/2391c012d9c87c53680a