Amazon Transcribeで複数の認識候補が取得できるAlternative resultsを試してみた!

2019.12.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、平野です。

Amazon Transcribeを試してみました。 というのも、私は以前(主に日本語の)音声認識システムの研究開発をしていたので、 このサービスは触らなくてはならないものだったのですが、 日本語対応がなかったので尻込みしていました。

ついに日本語対応!ということで、少しずつ触り始めています。 これまでもTranscribeに関するブログはいくつも上がっているので、 ちょっとは新規性をということで、最近追加されたAlternativve results機能を試してみました。

Alternative resultsとは

複数の認識結果を提示してくれるモードです。 いくつの候補を出力してくれるかを最大を10として指定できます。

Alternative resultsを指定しない場合と 一番の候補(認識器が一番自信があるとして出力するもの)には変動はありません。 あくまでも信頼度が一番ではない候補についても表示をしてくれるというだけのものです。 なので、認識率が向上するような機能ではありません。

サンプル音声

サンプル音声として、日本語話し言葉コーパス(CSJ)からサンプルの音声を拾ってきました。

日本語話し言葉コーパス(CSJ) - 音声・転記テキストサンプル

今回は「学会講演」という名前のファイルを使いました。 ファイル名はasp-smp.mp3です。

なお、この音声には「再朗読音声」版もあり、今後色々比較したい時に便利です。 再朗読とは、同じ文章を改めて丁寧に発話し直したもので、 音響的に非常に認識しやすい音声での認識精度を見ることで、 言語的なモデリングの精度を計るためなどに使用されます。 (今回の記事では特に使用していません)

CLIで認識をかける

マネジメントコンソールからポチポチ設定してもいいのですが、 いろいろ試すことを考えて、CLIからの実行を行います。

上記を参考に、以下のようなtranscription-job.jsonを作成します。 音声ファイルはあらかじめS3にアップロード済みとします。

{
    "TranscriptionJobName": "cm-hirano-aps-smp-0001",
    "LanguageCode": "ja-JP",
    "MediaFormat": "mp3",
    "Media": {
        "MediaFileUri": "s3://cm-hirano-shigetoshi-test/sample/audio/aps-smp.mp3"
    }
}

一番重要な言語指定をja-JPとします。
CLIからジョブを作成する際は、メディア形式は指定必須になっているようです。 サンプリングレートは自動で拾ってくれます。

これをAWS CLIから実行して認識ジョブを作成します。

aws transcribe start-transcription-job --cli-input-json file://transcription-job.json

数分待つとジョブが完了するので頃合いを見計らって結果を取得します。

$ aws transcribe get-transcription-job --transcription-job-name cm-hirano-aps-smp-0001
{
    "TranscriptionJob": {
        "TranscriptionJobName": "cm-hirano-aps-smp-0003",
        "TranscriptionJobStatus": "COMPLETED",
        "LanguageCode": "ja-JP",
        "MediaSampleRateHertz": 16000,
        "MediaFormat": "mp3",
        "Media": {
            "MediaFileUri": "s3://cm-hirano-shigetoshi-test/sample/audio/reproduction-smp.mp3"
        },
        "Transcript": {
            "TranscriptFileUri": "https://s3.ap-northeast-1.amazonaws.com/aws-transcribe-ap-northeast-1-prod/(以下略)
        },
        "CreationTime": 1575364118.435,
        "CompletionTime": 1575364240.162,
        "Settings": {
            "ChannelIdentification": false,
            "ShowAlternatives": false
        }
    }
}

TranscriptFileUriの部分に結果のjsonファイルが置かれているので、 以下のようにすれば一発で整形してファイル保存できます。

$ aws transcribe get-transcription-job --transcription-job-name cm-hirano-aps-smp-0001 | jq -r '.TranscriptionJob | .Transcript | .TranscriptFileUri' | xargs curl | jq . > aps-smp-0001.json

ちなみに認識結果はこちらのようになっており、 実際に音声を聞いていただければわかりますが、ほとんど100%と言って良いレベルで認識していました。 (これだと再朗読との比較がつまらなくなってしまうのでそこは残念w)

Alternative resultsを設定してみる

続いてAlternative resultsをしてみます。 AWS CLIで指定する方法としては、下のようにSettings内に指定します。

{
    "TranscriptionJobName": "cm-hirano-aps-smp-0003",
    "LanguageCode": "ja-JP",
    "MediaFormat": "mp3",
    "Media": {
        "MediaFileUri": "s3://cm-hirano-shigetoshi-test/sample/audio/reproduction-smp.mp3"
    },
    "Settings": {
        "ShowAlternatives": true,
        "MaxAlternatives": 10
    }
}

今回は表示する最大の候補数(MaxAlternatives)は10で設定しました。 あとは同様に実行して結果を取得してみます。

以下、そこそこ大きいjsonなので認識された文章の部分(transcriptが含まれる行)だけ示します。

Alternative resultsを設定しない場合

こちらは発話全体に対する認識結果が一つ取得できるだけです。

# 全体の認識結果
"transcript": "え パラ 言語 情報 と いう こと な ん です が あ 簡単 に 最初 に 復習 を し て おき たい と 思い ます ま あのー こう やっ て あっ 話し て おり ます と 恐れ は 勿論 あの 言語 的 情報 を 伝える と いう こと が 一 つ の 重要 な 目的 な ん で あり ます が 同時 に パラ 言語 情報 そして 非 言語 情報 が 伝わっ て おり ます ま この 三 分 法 は 藤崎 先生 LENCE] による もの でし て パラ 言語 情報 と いう の は? 要 は あの 意図 的 に 最後 できる 話者 が ちゃんと コントロール し て 出し てる ん だ けど も 言語 情報 と 違っ て 連続 的 に 変化 する から カテゴライズ する こと が やや 難しい そう いっ た 情報 で あり ます"

Alternative resultsを10に設定した場合

発話全体に対する認識結果は同じものが取得できます。 そして後続として、全体の認識結果とちょっとだけ違う候補の文章も取得できています。

最終的な認識結果にならなかった文章について見てみると、 単語の区切り方が違うだけだったり、一単語が違うだけなど、 全く別の候補が取れるかというかそういう感じではなさそうです。 人間が思うような「別候補」とは少し感覚が違うかもしれませんが、 これは今回認識させた音声が比較的認識しやすいものだったので仕方ないという感じかもしれません。

また、複数候補が出る文章単位ですが、認識器が自動的に区切っているようです。 特に発話中にポーズ(無音)があるとそこで切られているような印象です。

# 全体の認識結果
"transcript": "え パラ 言語 情報 と いう こと な ん です が あ 簡単 に 最初 に 復習 を し て おき たい と 思い ます ま あのー こう やっ て あっ 話し て おり ます と 恐れ は 勿論 あの 言語 的 情報 を 伝える と いう こと が 一 つ の 重要 な 目的 な ん で あり ます が 同時 に パラ 言語 情報 そして 非 言語 情報 が 伝わっ て おり ます ま この 三 分 法 は 藤崎 先生 LENCE] による もの でし て パラ 言語 情報 と いう の は? 要 は あの 意図 的 に 最後 できる 話者 が ちゃんと コントロール し て 出し てる ん だ けど も 言語 情報 と 違っ て 連続 的 に 変化 する から カテゴライズ する こと が やや 難しい そう いっ た 情報 で あり ます"

# 部分ごとの認識候補
"transcript": "え パラ 言語 情報 と いう こと な ん です が あ 簡単 に 最初 に 復習 を し て おき たい と 思い ます ま あのー こう やっ て あっ 話し て おり ます と 恐れ は 勿論 あの 言語 的 情報 を 伝える と いう こと が 一 つ の 重要 な 目的 な ん で あり ます が 同時 に パラ 言語 情報 そして 非 言語 情報 が 伝わっ て おり ます ま この 三 分 法 は 藤崎 先生",
"transcript": "え パラ 言語 情報 と いう こと な ん です が あ 簡単 に 最初 に 復習 を し て おき たい と 思い ます ま あのー こう やっ て あっ 話し て おり ます と ソレ は 勿論 あの 言語 的 情報 を 伝える と いう こと が 一 つ の 重要 な 目的 な ん で あり ます が 同時 に パラ 言語 情報 そして 非 言語 情報 が 伝わっ て おり ます ま この 三 分 法 は 藤崎 先生",
"transcript": "え パラ 言語 情報 と いう こと な ん です が あ 簡単 に 最初 に 皿 を し て おき たい と 思い ます ま あのー こう やっ て あっ 話し て おり ます と 恐れ は 勿論 あの 言語 的 情報 を 伝える と いう こと が 一 つ の 重要 な 目的 な ん で あり ます が 同時 に パラ 言語 情報 そして 非 言語 情報 が 伝わっ て おり ます ま この 三 分 法 は 藤崎 先生",
"transcript": "え パラ 言語 情報 と いう こと な ん です が あ 簡単 に 最初 に 皿 を し て おき たい と 思い ます ま あのー こう やっ て あっ 話し て おり ます と ソレ は 勿論 あの 言語 的 情報 を 伝える と いう こと が 一 つ の 重要 な 目的 な ん で あり ます が 同時 に パラ 言語 情報 そして 非 言語 情報 が 伝わっ て おり ます ま この 三 分 法 は 藤崎 先生",

"transcript": "LENCE] による もの でし て",
"transcript": "による もの でし て",
"transcript": "に よる もの でし て",
"transcript": "LENCE] LENCE] による もの でし て",
"transcript": "LENCE] による もの でし て LENCE]",
"transcript": "LENCE] に よる もの でし て",
"transcript": "による もの でし て LENCE]",

"transcript": "パラ 言語 情報 と いう の は? 要 は あの 意図 的 に 最後 できる 話者 が ちゃんと コントロール し て 出し てる ん だ けど も 言語 情報 と 違っ て 連続 的 に 変化 する から カテゴライズ する こと が やや 難しい そう いっ た 情報 で あり ます",
"transcript": "パラ 言語 情報 と いう の は? 要 は あの 意図 的 に 制御 できる 話者 が ちゃんと コントロール し て 出し てる ん だ けど も 言語 情報 と 違っ て 連続 的 に 変化 する から カテゴライズ する こと が やや 難しい そう いっ た 情報 で あり ます",
"transcript": "パラ 言語 情報 と いう の は? 要 は あの 意図 的 に 最後 できる 話者 が ちゃんと コントロール し て 出し てる だ けど も 言語 情報 と 違っ て 連続 的 に 変化 する から カテゴライズ する こと が やや 難しい そう いっ た 情報 で あり ます",
"transcript": "パラ 言語 情報 と いう の は? 要 は あの 意図 的 に 制御 できる 話者 が ちゃんと コントロール し て 出し てる だ けど も 言語 情報 と 違っ て 連続 的 に 変化 する から カテゴライズ する こと が やや 難しい そう いっ た 情報 で あり ます",

10を指定したにも関わらず、それほど多くの候補が出力されていないのは、 一定スコアで足切りをしているからと思われます。

まとめ

日本語版リリースが来たのでAmazon Transcribeを試してみました!

Alternative resultsは複数の認識候補が取得できるので、 後続に自前の言語モデルでリスコアリングしてより確かそうな認識結果を取得する、 のような使い方も考えられるのではないでしょうか?

引き続きTranscribeについては色々と調べていきたいと思います! 誰かの参考になれば幸いです。