例の経営統合のニュースをAmazon Transcribeに文字起こしさせてみた

## はじめに

AWSの自動音声認識サービス[Amazon Transcribe](https://aws.amazon.com/jp/transcribe/)が日本語に対応したとのことで、日本語音声を入力して文字起こしを試してみました。

## 題材

以下のニュース動画を利用しました。

- [YahooとLINE 統合を発表 - テレ東NEWS](https://www.youtube.com/watch?v=ndMhJZF6mjM)

1人のアナウンサーが1分間ほどニュースを読み上げる内容となっていて、複数人による会話などはありません。

## 文字起こし方法

Transcribeは、

- マネジメントコンソール
- AWS CLI
- AWS SDK for Python (Boto)

にて利用できますが、今回はAWS CLIを使ってみます。

### 1. 変換をリクエストする

あらかじめ以下のJSONを用意しておいた上で、`aws transcribe start-transcription-job`を実行します。

```json:request.json
{
  "TranscriptionJobName": "yl",
  "LanguageCode": "ja-JP",
  "MediaFormat": "mp3",
  "Media": {
    "MediaFileUri": "https://foobar.s3-ap-northeast-1.amazonaws.com/yl.mp3"
  }
}
```

```console
$ aws transcribe start-transcription-job --cli-input-json file://request.json
```

リクエストが受け付けられると、以下のようなレスポンスが返ってきます。

```json
{
    "TranscriptionJob": {
        "TranscriptionJobName": "yl",
        "TranscriptionJobStatus": "IN_PROGRESS",
        "LanguageCode": "ja-JP",
        "MediaSampleRateHertz": 48000,
        "MediaFormat": "mp3",
        "Media": {
            "MediaFileUri": "https://foobar.s3-ap-northeast-1.amazonaws.com/yl.mp3"
        },
        "CreationTime": 1574510851.993
    }
}
```

### 2. 変換ジョブのステータスを確認する

サブコマンド`list-transcription-jobs`で変換ジョブのステータスを確認します。

```console
$ aws transcribe list-transcription-jobs --job-name-contains "yl"
```

もし変換が完了していればステータスは`COMPLETED`で返ってきます。

```json
{
    "TranscriptionJobSummaries": [
        {
            "TranscriptionJobName": "yl",
            "CreationTime": 1574510995.946,
            "CompletionTime": 1574511071.683,
            "LanguageCode": "ja-JP",
            "TranscriptionJobStatus": "COMPLETED",
            "OutputLocationType": "SERVICE_BUCKET"
        }
    ]
}
```

なお、今回の1分間の音声の変換ジョブの完了には、約1分15秒の処理時間がかかっていました。

### 3. 変換結果を取得する

サブコマンド`get-transcription-job`で変換結果ファイルのURIを取得します。

```console
$ aws transcribe get-transcription-job --transcription-job-name "yl"
```

```json
{
    "TranscriptionJob": {
        "TranscriptionJobName": "yl",
        "TranscriptionJobStatus": "COMPLETED",
        "LanguageCode": "ja-JP",
        "MediaSampleRateHertz": 44100,
        "MediaFormat": "mp3",
        "Media": {
            "MediaFileUri": "https://foobar.s3-ap-northeast-1.amazonaws.com/yl.mp3"
        },
        "Transcript": {
            "TranscriptFileUri": "https://s3.ap-northeast-1.amazonaws.com/aws-transcribe-ap-northeast-1-prod/(略)/asrOutput.json?X-Amz-Security-Token=xxxxxxxx&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20191123T122051Z&X-Amz-SignedHeaders=host&X-Amz-Expires=900&X-Amz-Credential=xxxxxxxx&X-Amz-Signature=xxxxxxxx"
        },
        "CreationTime": 1574510995.946,
        "CompletionTime": 1574511071.683,
        "Settings": {
            "ChannelIdentification": false
        }
    }
}
```

`TranscriptFileUri`が変換結果ファイルのURIなので、ここからファイルを取得します。

取得したファイルは以下のようになっていました(一部を抜粋)。

結果は`transcripts`と`items`に分かれています。

```json
{
  "jobName": "yl",
  "accountId": "xxxxxxxxxxxx",
  "results": {
    "transcripts": [
      {
        "transcript": "検索 サービス ヤフー ジャパン の (略) 発表 し 、 ます"
      }
    ],
    "items": [
      {
        "start_time": "0.04",
        "end_time": "0.54",
        "alternatives": [
          {
            "confidence": "1.0",
            "content": "検索"
          }
        ],
        "type": "pronunciation"
      },
      {
        "start_time": "0.54",
        "end_time": "1.18",
        "alternatives": [
          {
            "confidence": "1.0",
            "content": "サービス"
          }
        ],
        "type": "pronunciation"
      },
      {
        "start_time": "1.25",
        "end_time": "1.73",
        "alternatives": [
          {
            "confidence": "0.5202",
            "content": "ヤフー"
          }
        ],
        "type": "pronunciation"
      },
      {
        "start_time": "1.73",
        "end_time": "2.1",
        "alternatives": [
          {
            "confidence": "0.5202",
            "content": "ジャパン"
          }
        ],
        "type": "pronunciation"
      },
      {
        "start_time": "2.1",
        "end_time": "2.23",
        "alternatives": [
          {
            "confidence": "1.0",
            "content": "の"
          }
        ],
      },
// 略
      {
        "start_time": "59.13",
        "end_time": "59.48",
        "alternatives": [
          {
            "confidence": "1.0",
            "content": "発表"
          }
        ],
        "type": "pronunciation"
      },
      {
        "start_time": "59.48",
        "end_time": "59.63",
        "alternatives": [
          {
            "confidence": "1.0",
            "content": "し"
          }
        ],
        "type": "pronunciation"
      },
      {
        "start_time": "59.63",
        "end_time": "60.05",
        "alternatives": [
          {
            "confidence": "1.0",
            "content": "ます"
          }
        ],
        "type": "pronunciation"
      }
    ]
  },
  "status": "COMPLETED"
}
```


## 文字起こし結果

前述のJSONの`transcript`の値が文字起こし結果全体となります。

>**検索 サービス ヤフー ジャパン の 親会社 セット ホールディングス と 通信 アプリ 大手 の ライン は 今日 経営 統合 する こと で 合意 し た と 発表 し、 まし た 利用 者 数 億 人 規模 の 巨大 相手 企業 が 誕生 し ます 両社 が 発表 し た。 合意 案 で は 最終 的 に セット ホールディングス の 親会社 の ソフトバンク と ライン の 親会社 の 韓国 ネバー が 磯 パーセント ずつ 出資 する、 新 会社 を 作り ます その 傘下 に ホールディングス を 置い て ヤフー や ライン を 子会社 に し、 ます ライン と ヤフー の 親会社 と なる セット ホールディングス の 代表 に は 今 の セット ホールディングス の 川辺 健太郎 社長 が 代表 取締役 社長 県 娘 を ライン の 入れ ザワ 剛 社長 が 代表 取締役 権 更新 よう と し て 共同 で、 着き ます 両社 は 今日 の 午後 五 時 から 改憲 を 開い て 統合 の 狙い など を 発表 し、 ます**

固有名詞や同音異義語などを除くと、目立った誤変換として挙げられるのは以下でしょうか。

- 数億人規模 : 1億人規模 (注:ニュースでは1億人と言っています)
- 巨大相手企業 : 巨大IT企業
- 磯パーセント : 50パーセント
- 代表取締役社長県娘を : 代表取締役社長兼Co-CEO
- 代表取締役兼更新よう : 代表取締役兼Co-CEO

Co-CEO(こ・しーいーおー)は難しかったようです。

磯パーセントは、よくわかりません:thinking:

## 解説

### items

さきほどの`transcript`には、ところどころに半角スペースが見受けられますが、Amazon Transcribeでは

- 全体的な文字起こし結果を`transcript`に

- 品詞単位の文字起こし結果を`items`に

返すようになっていて、`transcript`には、これら品詞単位の区切りに半角スペースが入っています。

```json
{
  "jobName": "yl",
  "accountId": "xxxxxxxxxxxx",
  "results": {
    "transcripts": [
      {
        "transcript": "検索 サービス ヤフー ジャパン の (略) 発表 し 、 ます"
      }
    ],
    "items": [
      {
        "start_time": "0.04",
        "end_time": "0.54",
        "alternatives": [
          {
            "confidence": "1.0",
            "content": "検索"
          }
        ],
```


### confidence

また、品詞ごとの変換結果の信頼性が`confidence`に格納されています。

試しに`confidence`が

- 1.0(最高値)であれば**<font color="black">黒</font>**
- 0.9以上1.0未満であれば**<font color="gray">濃い灰色</font>**
- 0.9未満であれば**<font color="silver">薄い灰色</font>**

で表示するよう、取得したJSONファイルを加工してみました。

```python
import json


def conv_color(confidence: float) -> str:
    if confidence == 1:
        return "black"
    elif confidence >= 0.9:
        return "gray"
    else:
        return "silver"


with open('./transcript.json') as f:
    d = json.load(f)

    for item in d['results']['items']:
        color = conv_color(float(item['alternatives'][0]['confidence']))

        print(f'<font color="{color}">', end='')
        print(item['alternatives'][0]['content'], end='')
        print('</font>', end='')
```

すると、以下のような結果になりました。薄い部分はAmazon Transcribeも変換結果に自信が無い箇所・・・ということになります。

>**<font color="black">検索</font><font color="black">サービス</font><font color="silver">ヤフー</font><font color="silver">ジャパン</font><font color="black">の</font><font color="gray">親会社</font><font color="silver">セット</font><font color="black">ホールディングス</font><font color="gray">と</font><font color="black">通信</font><font color="black">アプリ</font><font color="gray">大手</font><font color="black">の</font><font color="black">ライン</font><font color="black">は</font><font color="silver">今日</font><font color="black">経営</font><font color="black">統合</font><font color="black">する</font><font color="black">こと</font><font color="black">で</font><font color="black">合意</font><font color="black">し</font><font color="black">た</font><font color="black">と</font><font color="black">発表</font><font color="black">し</font><font color="black">、</font><font color="black">まし</font><font color="black">た</font><font color="black">利用</font><font color="black">者</font><font color="gray">数</font><font color="black">億</font><font color="black">人</font><font color="black">規模</font><font color="black">の</font><font color="black">巨大</font><font color="gray">相手</font><font color="gray">企業</font><font color="black">が</font><font color="black">誕生</font><font color="black">し</font><font color="black">ます</font><font color="silver">両社</font><font color="black">が</font><font color="black">発表</font><font color="black">し</font><font color="black">た</font><font color="black">。</font><font color="black">合意</font><font color="black">案</font><font color="black">で</font><font color="black">は</font><font color="black">最終</font><font color="black">的</font><font color="black">に</font><font color="silver">セット</font><font color="black">ホールディングス</font><font color="black">の</font><font color="gray">親会社</font><font color="black">の</font><font color="black">ソフトバンク</font><font color="gray">と</font><font color="gray">ライン</font><font color="black">の</font><font color="gray">親会社</font><font color="black">の</font><font color="silver">韓国</font><font color="silver">ネバー</font><font color="gray">が</font><font color="silver">磯</font><font color="black">パーセント</font><font color="black">ずつ</font><font color="black">出資</font><font color="black">する</font><font color="black">、</font><font color="black">新</font><font color="black">会社</font><font color="black">を</font><font color="gray">作り</font><font color="black">ます</font><font color="gray">その</font><font color="gray">傘下</font><font color="gray">に</font><font color="black">ホールディングス</font><font color="black">を</font><font color="silver">置い</font><font color="black">て</font><font color="black">ヤフー</font><font color="gray">や</font><font color="gray">ライン</font><font color="black">を</font><font color="gray">子会社</font><font color="black">に</font><font color="black">し</font><font color="black">、</font><font color="black">ます</font><font color="gray">ライン</font><font color="gray">と</font><font color="black">ヤフー</font><font color="black">の</font><font color="gray">親会社</font><font color="black">と</font><font color="black">なる</font><font color="silver">セット</font><font color="black">ホールディングス</font><font color="black">の</font><font color="black">代表</font><font color="black">に</font><font color="black">は</font><font color="silver">今</font><font color="black">の</font><font color="silver">セット</font><font color="black">ホールディングス</font><font color="gray">の</font><font color="gray">川辺</font><font color="gray">健太郎</font><font color="black">社長</font><font color="black">が</font><font color="black">代表</font><font color="black">取締役</font><font color="black">社長</font><font color="silver">県</font><font color="silver">娘</font><font color="black">を</font><font color="gray">ライン</font><font color="black">の</font><font color="silver">入れ</font><font color="silver">ザワ</font><font color="silver">剛</font><font color="black">社長</font><font color="black">が</font><font color="black">代表</font><font color="black">取締役</font><font color="silver">権</font><font color="silver">更新</font><font color="silver">よう</font><font color="black">と</font><font color="black">し</font><font color="black">て</font><font color="gray">共同</font><font color="black">で</font><font color="black">、</font><font color="gray">着き</font><font color="black">ます</font><font color="silver">両社</font><font color="black">は</font><font color="black">今日</font><font color="black">の</font><font color="black">午後</font><font color="black">五</font><font color="black">時</font><font color="gray">から</font><font color="black">改憲</font><font color="black">を</font><font color="gray">開い</font><font color="gray">て</font><font color="gray">統合</font><font color="black">の</font><font color="gray">狙い</font><font color="black">など</font><font color="black">を</font><font color="black">発表</font><font color="black">し</font><font color="black">、</font><font color="black">ます</font>**

## 費用

1秒の音声変換に、0.0004USDがかかります。ただし、15秒未満の場合は15秒分の料金がかかるとのこと。

今回の音声は約1分なので、おおよそ2〜3円ということになります。

なお、使い始めから1年間は、毎月60分の無料利用枠があります。

- [Amazon Transcribeの料金](https://aws.amazon.com/jp/transcribe/pricing/)

## 最後に

アナウンサーによるはっきりとした音声でも、いくつかの誤変換は発生していました。Amazon Transcribeでは変換結果の信頼度合い(confidence)を品詞ごとに持っているので、これをどう活用するかがポイントなのかもしれません。

また、今回は試せていませんが、音声内の話者数を2人から10人まで指定することが可能で、それら話者ごとの変換ができるようです。テレビ番組や会議の音声を文字起こしさせてみたら面白そうです。

## 参考

- [Amazon Transcribe - AWSドキュメント](https://docs.aws.amazon.com/ja_jp/transcribe/latest/dg/what-is-transcribe.html)