Speech SDKからAzure Cognitive ServicesのSpeech Serviceを使って自分の英語の発音を評価する

[追記]執筆中に気づかず投稿してしてしまいましたが、同じネタでもっと詳しい記事を一週間前に書いている方がいらっしゃったので、そちらの記事を御覧ください（しかも同じOrganizationの方でした）。

https://qiita.com/sugulu_Ogawa_ISID/items/1d96546b74a739b3d44f



英語の自分の発音を客観的に評価するって難しいですよね？

日本語の発音なら「この人は訛ってるなー・・」とか、「この人は綺麗だなー・・・」とかわかりますが英語だと区別がつかなくなります。逆に、他人の発音が評価できるようになれば、自分の発音も改善されるのでないでしょうか？

ということで、2021年のigniteで発表されていたSpeech Serviceの発音評価機能を使って自分の発音がどれだけイケてないのか数値化したいと思います。

ぶっちゃけ、公式のドキュメント以上の情報は記載してないです。Azur初心者の方に向けてAzure Cognitive ServicesのSpeech Serviceを利用してPythonで発音評価機を行う方法を説明しています。

最後まで実施していただくと、発音を記録した音声ファイルから単語別に発音正しさをスコア化できます（音素レベルでも確認可能）。「2022年はきれいな英語で会話したい!」という方はぜひ試してください！！



# Azure PortalからSpeech Serviceを作成する

この手の文章ってどこから説明するか悩むんですが、[Azure Portal](https://portal.azure.com/)を開くところから始めます。

https://portal.azure.com/

Azureのアカウント持ってないよという方は[こちら](https://azure.microsoft.com/ja-jp/free/)からAzureのアカウントを作成してください。初めて登録した方は、200USD分のお試し用のクレジットがもらえます。

https://azure.microsoft.com/ja-jp/free/

### 最初の画面でリソースの作成を選択

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412418/a5b46872-9296-2354-738a-63472a9382cd.png)

### リソースの作成で「音声」と検索し、音声を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412418/fcc2bd56-3a60-ed5b-93b5-0a6a3f9b6356.png)

### 作成を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412418/554b023e-2e27-4df9-977b-b5050f25c677.png)

### サブスクリプション、リソースグループ、名前、価格レベルを記入後、確認と作成を選択
|項目|入力内容|
|---|---|
|サブスクリプション|選択できるものから適当に選択|
|リソースグループ|こちらも適当に選択、ない場合は下の新規作成から適当に作成|
|リージョン|特にこだわりが無いなら初期値のまま|
|名前|適当に作成|
|価格レベル|Standard S0|

![２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412418/9344378e-2d04-394b-6422-1d69e59c03c5.png)

### 検証に成功しましたと表示されたら作成を選択

スクショは省略します。

リソースをデプロイしています。作成には数十秒かかるので少し休憩。

###デプロイに成功しましたと表示されたら、リソースに移動を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412418/8c3e9718-52b6-ee85-449c-172877710069.png)

###キーを管理するにはここをクリックを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412418/532f8adc-69fe-3722-c6a9-7ad683618b20.png)


### キーを表示させる

２つのキーの内1つ使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412418/50f3c24c-816c-94e2-a339-c579026073af.png)

# ローカルからSpeech SDKを利用して音声を保存したwavファイルをSpeech Serviceにアップロード

ここからは先程作成したSpeech Serviceに音声ファイルをPythonでSpeech SDKを操作することでアップロードし、発音の評価を行います。

### その前に、アップロードする音声ファイルを作成する

まずは、評価してもらいたい文章を決めてください。早口言葉のようなフレームでもいいですし、長文でもOKです。

「tongue twister」で検索すれば色々出てきます。

[espressoenglish.net](https://www.espressoenglish.net/can-you-say-these-10-tongue-twisters-in-english/)

そしたら、その英文を音声に保存しておきます。Speach SDKからSpeech Serviceを利用する場合は保存形式がWAVである必要があるため、適当に変換しておいてください。

### 続いて、コードを実行

やっと本題に入ります。

まずは、Speech SDKをインポートして、```speech_config```を作成します。

```python
# Speech SDKをインポート
import azure.cognitiveservices.speech as speechsdk

# 作成したSpeech　Serviceのキーとリージョンからspeech_config作成
speech_config = speechsdk.SpeechConfig(subscription="<Speech　Serviceのキー>", region="<Speech　Serviceのリージョン>")
```
azure.cognitiveservices.speechがないと怒られた方は、pipで入れてください。

```shell
pip install azure-cognitiveservices-speech
```

キーとリージョンは先程作成したSpeech Serviceのものを使います。キーは１つ目のものだけでOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1412418/50f3c24c-816c-94e2-a339-c579026073af.png)

続いて、アップロードする音声ファイルの`audio_config`を作成します。

```python
audio_filename = "<音声ファイル(WAV)のローカル上のパス>"    
audio_config = speechsdk.AudioConfig(filename=audio_filename)
```

`speech_config`と`audio_config`を作ったら２つをまとめて、`speech_recognizer`を作成します。ここまでは、Speech Serviceを利用する際のお決まりの手順というところでしょうか？

```python
speech_recognizer = speechsdk.SpeechRecognizer(
        speech_config=speech_config, \
        audio_config=audio_config)
```

実行前に発音評価のための設定である`pronunciation_assessment_config`を作成します。

```python
pronunciation_assessment_config = \
        speechsdk.PronunciationAssessmentConfig(reference_text='<発音したフレーズ>',
                grading_system=speechsdk.PronunciationAssessmentGradingSystem.HundredMark,
                granularity=speechsdk.PronunciationAssessmentGranularity.Phoneme)
```
`reference_text`発音したフレーズ、`grading_system`で満点の設定（`HundredMark`は100点満点、`FivePoint`は5点満点）、`granularity`は評価の最小単位（`Phoneme`は音素レベル　、`word`は単語レベル、全文は`FullText`）

最後に音声評価を実行します

```python
# 発音評価を実行
pronunciation_assessment_config.apply_to(speech_recognizer)
result = speech_recognizer.recognize_once()
pronunciation_assessment_result = speechsdk.PronunciationAssessmentResult(result)
pronunciation_score = pronunciation_assessment_result.pronunciation_score]
print(f'点数：{pronunciation_score}')
```

何点だったでしょうか？

自分は意外と高かったので、結構評価は甘めなのかもしれません。

「え、私の発音の点数低すぎ・・・」と思ったあなた、安心してください。どの単語の発音が悪かったのかも表示できます。

```python
 for word in pronunciation_assessment_result.words:
        print("*"*10)
        print(f'単語： {word.word} \t点数： {word.accuracy_score}')
```

さらに`granularity`で`phoneme`を設定した方は音素レベルで評価を見れてしまいます。

```python
 for word in pronunciation_assessment_result.words:
        print("*"*10)
        print(f'単語： {word.word} \t点数： {word.accuracy_score}')
        for phoneme in word.phonemes:
            print(f'\t音素： {phoneme.phoneme} \t点数： {phoneme.accuracy_score}')
```
```shell
**********
単語： They 	点数： 100.0
	音素： dh 	点数： 100.0
	音素： ey 	点数： 100.0
**********
単語： are 	点数： 100.0
	音素： aa 	点数： 100.0
	音素： r 	点数： 100.0
**********
単語： numberless 	点数： 83.0
	音素： n 	点数： 100.0
	音素： ah 	点数： 100.0
	音素： m 	点数： 100.0
	音素： b 	点数： 100.0
	音素： ax 	点数： 100.0
	音素： r 	点数： 98.0
	音素： l 	点数： 95.0
	音素： ax 	点数： 53.0
	音素： s 	点数： 59.0
**********
単語： as 	点数： 84.0
	音素： ae 	点数： 100.0
	音素： z 	点数： 40.0
**********
単語： the 	点数： 100.0
	音素： dh 	点数： 100.0
	音素： ax 	点数： 90.0
**********
単語： sands 	点数： 79.0
	音素： s 	点数： 83.0
	音素： ae 	点数： 55.0
	音素： n 	点数： 5.0
	音素： d 	点数： 98.0
	音素： z 	点数： 100.0
**********
単語： on 	点数： 100.0
	音素： aa 	点数： 5.0
	音素： n 	点数： 100.0
**********
単語： the 	点数： 100.0
	音素： dh 	点数： 100.0
	音素： ax 	点数： 100.0
**********
単語： seashore 	点数： 85.0
	音素： s 	点数： 100.0
	音素： iy 	点数： 100.0
	音素： sh 	点数： 100.0
	音素： ao 	点数： 78.0
	音素： r 	点数： 59.0
```

あなたの発音はどうだったでしょうか。

以外にこの発音がだめかもしれない的なことがわかればそこを重点的に練習できますし、前から苦手な発音がある方は日々の練習の成果を確認できますね。


それでは。