Help us understand the problem. What is going on with this article?

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

はじめに

AWSの自動音声認識サービスAmazon Transcribeが日本語に対応したとのことで、日本語音声を入力して文字起こしを試してみました。

題材

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

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

文字起こし方法

Transcribeは、

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

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

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

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

request.json
{
  "TranscriptionJobName": "yl",
  "LanguageCode": "ja-JP",
  "MediaFormat": "mp3",
  "Media": {
    "MediaFileUri": "https://foobar.s3-ap-northeast-1.amazonaws.com/yl.mp3"
  }
}
$ aws transcribe start-transcription-job --cli-input-json file://request.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で変換ジョブのステータスを確認します。

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

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

{
    "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を取得します。

$ aws transcribe get-transcription-job --transcription-job-name "yl"
{
    "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なので、ここからファイルを取得します。

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

結果はtranscriptsitemsに分かれています。

{
  "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には、これら品詞単位の区切りに半角スペースが入っています。

{
  "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(最高値)であれば
  • 0.9以上1.0未満であれば濃い灰色
  • 0.9未満であれば薄い灰色

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

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も変換結果に自信が無い箇所・・・ということになります。

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

費用

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

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

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

最後に

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

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

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away