そのワード、文字起こしして大丈夫!? Amazon Transcribe のリアルタイム文字起こしが語彙フィルタリングに対応しました

Amazon Transcribe のリアルタイム文字起こしを実施する際に語彙フィルタリングを有効化することで、特定の文字のマスク、除去、タグづけができます。

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

コンバンハ、千葉(幸)です。

先日のアップデートで、Amazon Transcribe のリアルタイム文字起こしが語彙フィルタリングに対応しました。

何が変わったのか

前提として、Amazon Transcribeは音声をテキストに変換してくれる自動音声認識(ASR)サービスです。つまりは文字起こしをしてくれます。

Amazon Transcribeによる文字起こしは大きく分けて2つあり、ジョブによるバッチ文字起こしと、ストリーミングによるリアルタイム文字起こしに対応しています。(※ちなみにリアルタイム文字起こしは日本語には対応していません。気長に待ちましょう。)

文字起こしのオプションの1つとして、語彙フィルタリング(Vocabulary Filtering)があります。指定したワードについて、文字起こしの結果からマスクしたり、除外することができます。これらの「マスク」や「除外」をフィルターメソッドと呼びます。

語彙フィルタリングは2019年の12月に開始された機能であり、当初バッチ文字起こしにおいてのみ対応していました。

今回のアップデートによって語彙フィルタリングがリアルタイム文字起こしにも対応したほか、リアルタイム文字起こしにのみ対応したフィルターメソッド Tag も追加されています。

やってみた

AWSのドキュメントは以下を参照すると良いでしょう。

https://docs.aws.amazon.com/transcribe/latest/dg/filter-unwanted-words.html

順番にやっていきます。

ソースファイルの作成

まずはフィルタリングするワードを指定するために、ソースファイルを作成します。これはテキストファイル上にワードを羅列するだけです。

今回は以下のようなテキストファイルを作成しました。

saitama
kanagawa

改行を挟んでワードを羅列し、.txt形式で保存すれば完了です。ちなみにここで大文字小文字は区別されません。

語彙フィルタの作成

AWSマネジメントコンソールの Amazon Transcribeの画面から Vocabulary filtering に遷移し、 Create vocabulary filter を押下します。

ちなみに後続の作業でリアルタイム文字起こしを行いますが、現状Tokyoリージョンは対応していません。リアルタイム文字起こしを行うリージョンと同一のリージョンに語彙フィルタを作成する必要があるため、この段階から適切なリージョンを選択してください。

どのリージョンがリアルタイム文字起こしに対応しているかのソースが見つからなかったのですが、2020年5月現在以下が該当するかと思います。

  • バージニア北部
  • オハイオ
  • オレゴン
  • シドニー
  • セントラル(カナダ)
  • アイルランド

今回はバージニア北部を選択しました。

フィルターの名称と言語を選択し、語彙フィルタのソースとなるファイルをインプットします。インプットの仕方には以下2種類があります。

  • コンソールからのアップロード(File upload
  • S3のロケーション指定(S3 location

後者は、S3バケットにソースファイルを予めアップロードしておき、そのロケーションを s3://BucketName/SourceFileName のような形式で指定する方式です。この画面からS3のブラウジングができるので、パスを覚えておく必要はありません。また、ここでのS3バケットは、語彙フィルタと同一のリージョンに存在する必要があります。

今回は手軽にコンソールからのアップロードを選択しました。指定が完了したら Create vocabulary filter を押下します。正常に作成が完了しました。

語彙フィルタを使用したリアルタイム文字起こし

リアルタイム文字起こしに対応しているリージョンでは、Amazon Transcribeの画面に Real-time transcription が表示されています。Start streamingを押下すれば、音声入力を受け付ける状態になり、すぐに文字起こしが可能な状態になります。

画面下部から、オプションとしてカスタム語彙語彙フィルタリングが選択可能です。(カスタム語彙とは、固有名詞など文字起こしが難しいワードについて、予め表示の仕方を定義しておくことで文字起こしの精度を上げることができる機能です。今回は使用しません。)

先ほど作成した語彙フィルタを選択し、フィルタで実施するメソッドを選択します。

  • Mask:フィルタに合致するワードを***に変換します
  • Remove:フィルタに合致するワードを除外します
  • Tag:(後述します)

まずはMaskのメソッドで試してみます。

ストリーミングを開始し、ひたすら「I like Chiba!」「I like Saitama!」「I like Kanagawa!」とマイクに向かって喋ります。なかなか思うように認識してくれなかったのですが、ひとまず「Saitama」がマスクできる状態を実現できました。

前後に散らばっているおかしなワードは、私の発音が生み出した悲しい存在たちです。どうしてもKanagawaは認識してもらえませんでした。深夜だしご近所の目もあるので深追いはやめておきました。

続いてフィルターのメソッドをTagにして再度試してみます。

ちなみに、ストリーミングを開始してからオプション設定を変更することはできないので、一度ストリーミングを止めてからやり直す必要があります。試してみた結果がこちら。

わかりづらいですが、「Saitama」が斜体で表示されています。これが何を意味するかというと、文字起こし結果のダウンロードファイルを見るとわかります。

コンソール画面から文字起こし結果をダウンロードすると、Json形式になっています。コンソール上ではただのテキストとして表示されている(そのままコピーもできます)のですが、Jsonファイルにおいては一つの文章ごとにこのような形で表示されます。

{
    "Transcript": {
        "Results": [
            {
                "Alternatives": [
                    {
                        "Items": [
                            {
                                "Content": "I",
                                "EndTime": 24.5,
                                "StartTime": 24.2,
                                "Type": "pronunciation",
                                "VocabularyFilterMatch": false
                            },
                            {
                                "Content": "like",
                                "EndTime": 24.72,
                                "StartTime": 24.52,
                                "Type": "pronunciation",
                                "VocabularyFilterMatch": false
                            },
                            {
                                "Content": "Saitama",
                                "EndTime": 25.57,
                                "StartTime": 25.05,
                                "Type": "pronunciation",
                                "VocabularyFilterMatch": true
                            }
                        ]
                    }
                ]
            }
        ]
    }
}

この結果において、フィルターメソッドTagに合致したものは、VocabularyFilterMatch が Trueとして記録されます。文章における特定のワードの出現頻度などを確認するのに役立ちそうです。

終わりに

語彙フィルターを使用することで、好ましくないワードを文字起こし結果に反映されないようコントロールしたり、出現回数を管理できるようになります。バッチ文字起こしだけでなくリアルタイム文字起こしにも対応したのはユースケースが拡がり嬉しいアップデートであったと思います。

ちなみに私(千葉)は、千葉だけでなく埼玉も神奈川も好きです。住んでいるのは東京です。よろしくお願いします。