ボクココ

個人開発に関するテックブログ

Amazon Transcribe による音声の文字化

ども、@kimihom です。

f:id:cevid_cpp:20200112163824j:plain

去年の11月末に、ついに Amazon Transcribe が日本語対応したということで調査を続けている。現時点での調査まとめ的な形で記事にしておこう。

Amazon Transcribe とは

Amazon Transcribe(音声をテキストに変換する機能を簡単に追加)| AWS

Amazon Transcribe は「音声をテキストに変換する機能」を提供してくれる AWS サービスの一つだ。会話を自動で文字として書き起こししてくれるので、例えば議事録を文字として起こしたり、何かのスピーチをサッと文字に書き起こしたりすることが簡単にできる。

この分野で言うと Google Cloud Speech-to-Text のほうが日本語対応が早かった。だから日本語を文字に起こす技術としては最新技術というわけではない。

Cloud Speech-to-Text - 音声認識  |  Cloud Speech-to-Text  |  Google Cloud

それでも Amazon Transcribe の日本語サポートが熱いのはなぜか。それはずばり、「Amazon S3 にある音声ファイルを文字に書き起こすことができる」という点に尽きる。Amazon S3 に音声ファイルを置いている企業にとっては、Amazon Transcribe の利用は最適な選択となる。

「どうせ音声文字化の品質はよくないでしょ」という反応は誰もが持つことだろう。実際に使って文字化してみた感想としては、もちろん現時点では人間が文字化した方が圧倒的に精度は高いのは事実である。だが、音声を聞くのではなく、ざっと概要だけ知れれば OK というケースにおいては実用に耐えうる精度だと言えるのではないだろうか。

Amazon Transcribe を使ってみる

Amazon Transcribe はとてもシンプルな設計になっている。S3 に置かれた音声ファイルを指定し、start_transcription_job を 実行をするとバックグラウンド処理として文字化処理が始まる。API で音声文字化処理のステータスを確認することができる。以下のステータスが存在する。

  • "QUEUED"
  • "IN_PROGRESS"
  • "FAILED"
  • "COMPLETED"

とりわけ大事なのが、 Transcribe を始めるときに指定するオプションだ。ここで 言語音声ファイルの場所音声ファイルには何人の人が存在するか とか チャネル数専門用語の登録 などを指定できる。

{
  transcription_job_name: "TranscriptionJobName", # required
  language_code: "en-US", # required, accepts en-US, es-US, en-AU, fr-CA, en-GB, de-DE, pt-BR, fr-FR, it-IT, ko-KR, es-ES, en-IN, hi-IN, ar-SA, ru-RU, zh-CN, nl-NL, id-ID, ta-IN, fa-IR, en-IE, en-AB, en-WL, pt-PT, te-IN, tr-TR, de-CH, he-IL, ms-MY, ja-JP, ar-AE
  media_sample_rate_hertz: 1,
  media_format: "mp3", # accepts mp3, mp4, wav, flac
  media: { # required
    media_file_uri: "Uri",
  },
  output_bucket_name: "OutputBucketName",
  output_encryption_kms_key_id: "KMSKeyId",
  settings: {
    vocabulary_name: "VocabularyName",
    show_speaker_labels: false,
    max_speaker_labels: 1,
    channel_identification: false,
    show_alternatives: false,
    max_alternatives: 1,
    vocabulary_filter_name: "VocabularyFilterName",
    vocabulary_filter_method: "remove", # accepts remove, mask
  },
  job_execution_settings: {
    allow_deferred_execution: false,
    data_access_role_arn: "DataAccessRoleArn",
  },
}

実際に文字化処理の実行が終わると、get_transcription_jobresp.transcription_job.transcript.transcript_file_uri から JSON ファイルを取得することができる。以下にサンプルのレスポンスを掲載する。channels の方には、AさんBさんといたときに、Aさんだけのセリフがずらっと出てくる形となり、items の方には時系列で言ったセリフ順にデータが入っている。 実際に UI に落とし込むには 会話として Aさん Bさんのセリフを時系列として出すだろうから、このJSON の解析が必要となるだろう。

{
  "jobName": "ChannelIdentification",
  "accountId": "123456789011111",
  "results": {
    "transcripts": [
      {
        "transcript": "こんにちは うん"
      }
    ],
    "channel_labels": {
      "channels": [
        {
          "channel_label": "ch_0",
          "items": [
            {
              "start_time": "0.04",
              "end_time": "0.75",
              "alternatives": [
                {
                  "confidence": "0.9935",
                  "content": "こんにちは"
                }
              ],
              "type": "pronunciation"
            }
          ]
        },
        {
          "channel_label": "ch_1",
          "items": [
            {
              "start_time": "1.04",
              "end_time": "1.25",
              "alternatives": [
                {
                  "confidence": "0.657",
                  "content": "うん"
                }
              ],
              "type": "pronunciation"
            },
          ]
        }
      ],
      "number_of_channels": 2
    },
    "items": [
      {
        "start_time": "0.04",
        "end_time": "0.75",
        "alternatives": [
          {
            "confidence": "0.9935",
            "content": "こんにちは"
          }
        ],
        "type": "pronunciation"
      },
      {
        "start_time": "0.04",
        "end_time": "0.75",
        "alternatives": [
          {
            "confidence": "0.9935",
            "content": "うん"
          }
      }
    ]
  },
  "status": "COMPLETED"
}

料金

Amazon Transcribe の料金 を見てみると、実際に文字化を行った分数だけのシンプルな料金体系のようだ。なので文字化されたものを API で取ってくる部分はお金がかからない(おそらく)。

90分の文字化でも $6.75 ってことで、そこまで大きな負担にはならなそうだ。

実装のポイント

文字化のプロセスにおいて、リクエストを送ったらサッと文字のレスポンスが返ってくるという形ではない点に注意しよう。

  1. Amazon S3 に音声ファイルを置く
  2. Amazon Transcribe に S3 パスとオプションを指定してリクエストを送る
  3. 2 で指定した transcription_job_name で現在のステータスを確認
  4. 現在のステータスが "COMPLETED" なら、get_transcription_job で文字化の結果を取得

注意しなければならないのはこれくらいで、だいぶ使いやすい印象を受ける。

もしリクエストを送ってレスポンスで文字化されたものが欲しい!という場合には、Google Cloud Speech-to-Text だと実はできる。ただ、この場合は制約があって1分未満の音声ファイルでないといけない。また、Google Cloud Speech-to-Text だとストリームによるリアルタイムの文字化も可能である。ただストリーミング入力も制限があって、およそ5分までとなっている。また、ストリーミングはgRPC経由のみとなっている。

終わりに

Amazon Transcribe は だいぶシンプルで使いやすい印象を受ける。去年11月に使えるようになったので、今年来年あたりは音声文字化の機能が至る所でリリースされていくのではないだろうか。

書記担当者がいなくなって、より快適に仕事ができるようになる未来がすぐそこまで来ていると言える。そして文字化が一般化された世界において、「音声を文字にする AI で〜」 と むやみやたらに "AI" という言葉は使わない方が身のためであろう。