モデル適応により音声文字変換の結果を改善する

概要

モデル適応機能を使用すると、提案される可能性がある他の候補よりも、Speech-to-Text が特定の単語やフレーズをより高い頻度で認識するように設定できます。たとえば、音声データに「weather」という単語が含まれているとします。Speech-to-Text が「weather」という単語を検出した場合、「whether」よりも多く「weather」と文字変換されることが理想的です。この場合は、モデル適応を使用して「weather」と認識するように Speech-to-Text にバイアスをかけることができます。

モデルの適応は、特に次のようなユースケースに対して有効です。

  • 音声データで頻繁に使用される単語やフレーズの精度を改善する。たとえば、ユーザーがよく発する音声コマンドを、認識モデルに知らせることができます。

  • Speech-to-Text によって認識される語彙を増加させる。Speech-to-Text には大量の語彙が含まれています。ただし、音声データに一般的な言語使用においては使用頻度が極めて低い単語(正式名称や地域特有の単語など)が高頻度で含まれている場合は、モデル適応を使用してそれらの単語を追加できます。

  • 音声にノイズが含まれている場合や、鮮明でない場合に音声文字変換の精度を改善する。

ご使用の言語でモデル適応機能が利用できるかどうかについては、言語サポートページをご覧ください。

単語とフレーズの認識精度を向上させる

Speech-to-Text が音声データを文字変換するときに「weather」という単語を認識する確率を高めるには、SpeechAdaptation リソースの PhraseSet オブジェクトに含まれる「weather」という単独の単語を渡します。

フレーズを指定することで、Speech-to-Text がその単語の並びを認識しやすくなります。フレーズを提供することで、個々の単語を含むフレーズの一部を認識する確率も高まります。これらのフレーズの数とサイズの制限については、コンテンツの制限ページをご覧ください。

モデル適応の強度は、モデル適応ブースト機能を使用して微調整できます。

クラスを使用して認識精度を向上させる

クラスとは、通貨単位やカレンダー日付など、自然言語で発生する一般的なコンセプトを表します。クラスにより、共通のコンセプトに対応する大規模な単語グループの音声文字変換の精度を向上できますが、必ずしも同一の単語やフレーズを含むとは限りません。

たとえば、お住まいの地域の住所を音声で録音したとします。「My house is 123 Main Street, the fourth house on the left.」という音声が録音されていたとしましょう。この場合、Speech-to-Text により「123」という数の並びは、「百二十三」という数値としてではなく、番地として認識されることが望ましいでしょう。しかし、すべての人が同じ住所「123 Main Street」に住んでいるわけではありません。可能なすべての番地を PhraseSet リソースにリストすることは実用的ではありません。代わりにクラスを使用することで、実際の番号に関係なく番地を認識させることができます。この例で、Speech-to-Text は「123 メイン ストリート」や「987 大通り」などの語句を番地として認識するため、より正確な文字変換を行うことができます。

クラストークン

モデル適応でクラスを使用するには、PhraseSet リソースの phrases フィールドにクラストークンを格納します。ご利用の言語で使用できるトークンを確認するには、サポートされているクラストークンの一覧をご覧ください。たとえば、ソース音声からの住所番号の音声文字変換を改善するには、SpeechContext オブジェクトに値 $ADDRESSNUM を指定します。

クラスは、phrases 配列のスタンドアロン アイテムとして使用することも、1 つ以上のクラストークンを複数の単語からなるフレーズに埋め込むこともできます。たとえば、文字列にクラストークン ["my address is $ADDRESSNUM"] を含めることで、より多くのフレーズで住所番号を指定できます。ただし、「I am at 123 Main Street」など、類似しているが同一ではないフレーズが含まれている場合には役立ちません。類似のフレーズを認識しやすくするためには、クラストークン ["my address is $ADDRESSNUM", "$ADDRESSNUM"] を単独で追加することが重要です。無効または異常なクラストークンを使用した場合、Speech-to-Text はエラーを発生させずトークンを無視しますが、それ以外のフレーズはコンテキストで使用されます。

カスタムクラス

関連する項目または値のカスタムリストで構成された独自の CustomClass クラスを作成することもできます。たとえば、地域に存在する数百軒のレストランのうち、いずれかの名前が含まれる可能性がある音声データを文字変換する必要がある場合が考えられます。レストラン名は一般的な音声での検出頻度は極めて低く、認識モデルによって「正しい」回答として選択される可能性は低くなります。カスタムクラスを使用すると、音声に出現した際にそれらの名前を正しく認識するように認識モデルにバイアスをかけることができます。

カスタムクラスを使用するには、ClassItem として各レストラン名を含む CustomClass リソースを作成します。カスタムクラスは、事前ビルドされたクラストークンと同じ方法で機能します。phrase には、事前ビルドされたクラストークンとカスタムクラスの両方を含めることができます。

ABNF 文法

Augmented Backus-Naur Form(ABNF)の文法を使用して、単語のパターンを指定することもできます。リクエストのモデル適応に ABNF 文法を使用すると、指定した文法に一致するすべての単語が Speech-to-Text で認識される確率が高くなります。

この機能を使用するには、リクエストの SpeechAdaptation フィールドに ABNF grammar オブジェクトを含めます。ABNF 文法には、CustomClass リソースと PhraseSet リソースへの参照を含めることもできます。このフィールドの構文の詳細については、Speech Recognition Grammar Specification と以下の code sample をご覧ください。

ブーストを使用して音声文字変換の結果を微調整する

デフォルトでは、モデル適応はほとんどのケースで十分な効果を発揮します。モデル適応のブースト機能を使用すると、一部のフレーズに対する重み付けの割り当てを他のフレーズよりも引き上げることで、認識モデルのバイアスを引き上げられます。ブーストの実装は、1)モデル適応をすでに実装していて、2)音声文字変換の結果に対してモデル適応効果の強度をさらに調整する必要がある場合にのみ行うことをおすすめします。

たとえば、「fare」よりも「fair」という単語が頻繁に出現する状況で、「fare to get into the county fair」と尋ねる録音が多くあるとします。この場合は、モデル適応を使用して、PhraseSet リソースに phrases として追加することにより、モデルが「fair」と「fare」の両方を認識する確率を向上させることができます。これにより、「hare」や「lair」などよりも高い頻度で「fair」と「fare」と認識するよう Speech-to-Text に指示されます。

ただし、「fair」は音声においてより頻繁に出現するため、「fare」よりも高い頻度で認識されなければなりません。すでに、Speech-to-Text API を使用して音声を文字変換し、正しい単語(「fair」)を認識し損ねるエラーを多数見つけているかもしれません。この場合、さらにブーストでフレーズを使用して、「fare」よりも「fair」により高いブースト値を割り当てることをおすすめします。「fair」に割り当てる重み付け値を高くすると、Speech-to-Text API が「fare」よりも「fair」を頻繁に選択するようにバイアスが適用されます。ブースト値を割り当てていない場合、認識モデルは「fair」と「fare」を同じ確率で認識します。

ブーストの基礎

ブーストを使用する場合は、PhraseSet リソースの phrase 項目に重み付け値を割り当てます。Speech-to-Text は、音声データ内の単語の文字変換候補を選択するときに、この重み付け値を参照します。この値が大きいほど、Speech-to-Text が文字変換候補からその単語や語句を選択する可能性が高くなります。

たとえば、「My favorite extract in American Museum of Natural History is the blue wheat」というフレーズにブースト値を割り当てます。このフレーズを phrase オブジェクトに追加し、ブースト値を割り当てると、認識モデルはそのフレーズを全体として逐語的に認識する可能性が高くなります。

複数単語のフレーズにブーストを適用しても、期待する結果が得られない場合は、そのフレーズ内のすべてのバイグラム(順序のある 2 単語)を phrase 項目として追加し、それぞれにブースト値を割り当てます。上述の例の場合、バイグラムと N グラム(3 つ以上の単語)をさらに追加して、確認してください(たとえば、「my favorite」、「my favorite exhibit」、「favorite exhibit」、「my favorite exhibit at the American Museum of Natural History」、「American Museum of Natural History」、「blue whale」など)。これにより、Speech-to-Text 認識モデルは、元のブーストされたフレーズの一部を含むものの、逐語的には一致しない音声内の関連フレーズを認識する可能性が高くなります。

ブースト値を設定する

強調数値には 0 より大きい浮動小数点数値を指定してください。ブースト値の実質的な上限値は 20 です。最適な結果を得るには、ブースト値を調整して音声文字変換結果を確認し、正確な音声文字変換結果が得られるようにします。

ブースト値を大きくすると、認識漏れ(音声に出現する単語や語句が Speech-to-Text で正しく認識されない)が少なくなります。ただし、ブーストを使用すると過剰検出(音声に出現していない単語や語句が音声文字変換に出力される)の可能性は高くなります。

タイムアウト通知を受信する

Speech-to-Text のレスポンスには、認識時のモデル適応動作に関する情報を提供する SpeechAdaptationInfo フィールドが含まれます。モデル適応に関連するタイムアウトが発生した場合、adaptationTimeouttrue になり、timeoutMessage はタイムアウトの原因となった適応構成を指定します。タイムアウトが発生しても、モデル適応は返された音声文字変換に影響しません。

モデル適応を使用したユースケース例

次の例では、「call me fionity and oh my gosh what do we have here ionity」という音声録音を、モデル適応を使って音声文字変換するプロセスを順を追って説明します。このケースでは、モデルが「fionity」と「ionity」を正しく識別することが重要です。

次のコマンドでは、モデル適応を行わずに音声認識を行います。音声文字変換の結果は「call me Fiona tea and oh my gosh what do we have here I own a day」となり、正しくありません。

   curl -H "Authorization: Bearer $(gcloud auth
   --impersonate-service-account=$SA_EMAIL print-access-token)" -H
   "Content-Type: application/json; charset=utf-8"
   "https://speech.googleapis.com/v1p1beta1/speech:recognize" -d '{"config":
   {"languageCode": "en-US"}, "audio":
   {"uri":"gs://biasing-resources-test-audio/call_me_fionity_and_ionity.wav"}}'
   

リクエストの例:

     {
       "config":{
       "languageCode":"en-US"
       },
       "audio":{
          "uri":"gs://biasing-resources-test-audio/call_me_fionity_and_ionity.wav"
       }
     }
   

PhraseSet を使用して音声文字変換を改善する

  1. PhraseSet を作成します。

    curl -X POST -H "Authorization: Bearer $(gcloud auth
    --impersonate-service-account=$SA_EMAIL print-access-token)" -H
    "Content-Type: application/json; charset=utf-8"
    "https://speech.googleapis.com/v1p1beta1/projects/project_id/locations/global/phraseSets"
    -d '{"phraseSetId": "test-phrase-set-1"}'
    

    リクエストの例:

    {
       "phraseSetId":"test-phrase-set-1"
    }
    
  2. PhraseSet を取得します。

    curl -X GET -H "Authorization: Bearer $(gcloud auth
    --impersonate-service-account=$SA_EMAIL print-access-token)" -H
    "Content-Type: application/json; charset=utf-8"
    "https://speech.googleapis.com/v1p1beta1/projects/project_id>/locations/global/phraseSets/test-phrase-set-1"\
    
  3. 「fionity」と「ionity」というフレーズを PhraseSet に追加し、boost の値 10 をそれぞれに割り当てます。

    curl -X PATCH -H "Authorization: Bearer $(gcloud auth
    --impersonate-service-account=$SA_EMAIL print-access-token)" -H
    "Content-Type: application/json; charset=utf-8"
    "https://speech.googleapis.com/v1p1beta1/projects/project_id/locations/global/phraseSets/test-phrase-set-1?updateMask=phrases"\
    -d '{"phrases": [{"value": "ionity", "boost": 10}, {"value": "fionity", "boost": 10}]}'
    

    PhraseSet が次のように更新されます。

    {
      "phrases":[
         {
              "value":"ionity",
              "boost":10
           },
           {
              "value":"fionity",
              "boost":10
           }
        ]
     }
    
  4. 音声を再度認識します。今回はモデル適応と先ほど作成した PhraseSet を使用します。これで、「call me fionity and oh my gosh what do we have here ionity」として正しく音声文字変換されます。

    curl -H "Authorization: Bearer $(gcloud auth --impersonate-service-account=$SA_EMAIL print-access-token)"
    -H "Content-Type: application/json; charset=utf-8"
    "https://speech.googleapis.com/v1p1beta1/speech:recognize" -d '{"config":
    {"adaptation": {"phrase_set_references": ["projects/project_id/locations/global/phraseSets/test-phrase-set-1"]},
    "languageCode": "en-US"}, "audio": {"uri":"gs://biasing-resources-test-audio/call_me_fionity_and_ionity.wav"}}'
    

    リクエストの例:

    {
       "config":{
          "adaptation":{
             "phrase_set_references":[
                "projects/project_id/locations/global/phraseSets/test-phrase-set-1"
             ]
          },
          "languageCode":"en-US"
       },
       "audio":{
          "uri":"gs://biasing-resources-test-audio/call_me_fionity_and_ionity.wav"
       }
    }
    

CustomClass を使用して音声文字変換の結果を改善する

  1. CustomClass を作成します。

    curl -X POST -H "Authorization: Bearer $(gcloud auth
    --impersonate-service-account=$SA_EMAIL print-access-token)" -H
    "Content-Type: application/json; charset=utf-8"
    "https://speech.googleapis.com/v1p1beta1/projects/project_id/locations/global/customClasses"
    -d '{"customClassId": "test-custom-class-1"}'
    

    リクエストの例:

    {
       "customClassId": "test-custom-class-1"
    }
    
  2. CustomClass を取得します。

     curl -X GET -H "Authorization: Bearer $(gcloud auth
     --impersonate-service-account=$SA_EMAIL print-access-token)" -H
     "Content-Type: application/json; charset=utf-8"
     "https://speech.googleapis.com/v1p1beta1/projects/project_id/locations/global/customClasses/test-custom-class-1"
     

  3. テスト用の音声クリップを認識します。CustomClass は空のため、「call me Fiona tea and oh my gosh what do we have here I own a day」のように、返される文字起こしがまだ正しくありません。

    curl -H "Authorization: Bearer $(gcloud auth
    --impersonate-service-account=$SA_EMAIL print-access-token)" -H
    "Content-Type: application/json; charset=utf-8"
    "https://speech.googleapis.com/v1p1beta1/speech:recognize" -d '{"config":
    {"adaptation": {"phraseSets": [{"phrases": [{"value":
    "${projects/project_idlocations/global/customClasses/test-custom-class-1}",
    "boost": "10"}]}]}, "languageCode": "en-US"}, "audio":
    {"uri":"gs://biasing-resources-test-audio/call_me_fionity_and_ionity.wav"}}'
    

    リクエストの例:

      {
       "config":{
          "adaptation":{
             "phraseSets":[
                {
                   "phrases":[
                      {
                         "value":"${projects/project_id/locations/global/customClasses/test-custom-class-1}",
                         "boost":"10"
                      }
                   ]
                }
             ]
          },
          "languageCode":"en-US"
       },
       "audio":{
          "uri":"gs://biasing-resources-test-audio/call_me_fionity_and_ionity.wav"
       }
     }
    
  4. 「fionity」と「ionity」というフレーズをカスタムクラスに追加します。

    curl -X PATCH -H "Authorization: Bearer $(gcloud auth
    --impersonate-service-account=$SA_EMAIL print-access-token)" -H
    "Content-Type: application/json; charset=utf-8"
    "https://speech.googleapis.com/v1p1beta1/projects/project_id/locations/global/customClasses/test-custom-class-1?updateMask=items"
    -d '{"items": [{"value": "ionity"}, {"value": "fionity"}]}'
    

    これにより、カスタムクラスが次のように更新されます。

    {
       "items":[
          {
             "value":"ionity"
          },
          {
             "value":"fionity"
          }
       ]
    }
    
  5. サンプルの音声を再度認識します。今回は、CustomClass に「fionity」と「ionity」が含まれています。音声文字変換は「call me fionity and oh my gosh what do we have here ionity」と正しく行われています。

    curl -H "Authorization: Bearer $(gcloud auth
    --impersonate-service-account=$SA_EMAIL print-access-token)" -H
    "Content-Type: application/json; charset=utf-8"
    "https://speech.googleapis.com/v1p1beta1/speech:recognize" -d '{"config":
    {"adaptation": {"phraseSets": [{"phrases": [{"value":
    "${projects/project_id/locations/global/customClasses/test-custom-class-1}",
    "boost": "10"}]}]}, "languageCode": "en-US"}, "audio":
    {"uri":"gs://biasing-resources-test-audio/call_me_fionity_and_ionity.wav"}}'
    

    リクエストの例:

    {
       "config":{
          "adaptation":{
             "phraseSets":[
                {
                   "phrases":[
                      {
    "value":"${projects/project_id/locations/global/customClasses/test-custom-class-1}",
                         "boost":"10"
                      }
                   ]
                }
             ]
          },
          "languageCode":"en-US"
       },
       "audio":{
          "uri":"gs://biasing-resources-test-audio/call_me_fionity_and_ionity.wav"
       }
    }
    

PhraseSetCustomClass を参照する

  1. 前に作成した PhraseSet リソースを更新して、CustomClass を参照します。

    curl -X PATCH -H "Authorization: Bearer $(gcloud auth
    --impersonate-service-account=$SA_EMAIL print-access-token)" -H
    "Content-Type: application/json; charset=utf-8"
    "https://speech.googleapis.com/v1p1beta1/projects/project_id/locations/global/phraseSets/test-phrase-set-1?updateMask=phrases"
    -d '{"phrases": [{"value": "${projects/project_id/locations/global/customClasses/test-custom-class-1}", "boost": 10}]}'
    

    リクエストの例:

    {
       "config":{
          "adaptation":{
             "phraseSets":[
                {
                   "phrases":[
                      {
                         "value":"${projects/project_id/locations/global/customClasses/test-custom-class-1}",
                         "boost":"10"
                      }
                   ]
                }
             ]
          },
          "languageCode":"en-US"
       },
       "audio":{
          "uri":"gs://biasing-resources-test-audio/call_me_fionity_and_ionity.wav"
       }
    }
    
  2. CustomClass を参照する)PhraseSet リソースを使用して音声を認識します。音声文字変換により、「call me fionity and oh my gosh what do we have here ionity」が正確に認識されます。

    curl -H "Authorization: Bearer $(gcloud auth
    --impersonate-service-account=$SA_EMAIL print-access-token)" -H
    "Content-Type: application/json; charset=utf-8"
    "https://speech.googleapis.com/v1p1beta1/speech:recognize" -d '{"config":
    {"adaptation": {"phrase_set_references":
    ["projects/project_id/locations/global/phraseSets/test-phrase-set-1"]},
    "languageCode": "en-US"}, "audio":
    {"uri":"gs://biasing-resources-test-audio/call_me_fionity_and_ionity.wav"}}'
    

    リクエストの例:

    {
       "phrases":[
          {
             "value":"${projects/project_id/locations/global/customClasses/test-custom-class-1}",
             "boost":10
          }
       ]
    }
    

CustomClassPhraseSet を削除する

  1. PhraseSet を削除します。

    curl -X DELETE -H "Authorization: Bearer $(gcloud auth
    --impersonate-service-account=$SA_EMAIL print-access-token)" -H
    "Content-Type: application/json; charset=utf-8"
    "https://speech.googleapis.com/v1p1beta1/projects/project_id/locations/global/phraseSets/test-phrase-set-1"
    
  2. CustomClass を削除します。

    curl -X DELETE -H "Authorization: Bearer $(gcloud auth
    --impersonate-service-account=$SA_EMAIL print-access-token)" -H
    "Content-Type: application/json; charset=utf-8"
    "https://speech.googleapis.com/v1p1beta1/projects/project_id/locations/global/customClasses/test-custom-class-1"
    

ABNF Grammar を使用して音声文字変換の結果を改善する

  1. abnf_grammar を使用して音声を認識します。この例は、CustomClass リソース(projects/project_id/locations/global/customClasses/test-custom-class-1)、インライン化された CustomClass: test-custom-class-2、クラストークン: ADDRESSNUM、および PhraseSet リソース(projects/project_id/locations/global/phraseSets/test-phrase-set-1)を参照しています。文字列の最初のルール(外部宣言の後)は、ルートとして扱われます。

    リクエストの例:

    {
       "config":{
          "adaptation":{
             "abnf_grammar":{
                "abnf_strings": [
                  "external ${projects/project_id/locations/global/phraseSets/test-phrase-set-1}" ,
                  "external ${projects/project_id/locations/global/customClasses/test-custom-class-1}" ,
                  "external ${test-custom-class-2}" ,
                  "external $ADDRESSNUM" ,
                  "$root = $test-phrase-set-1 $name lives in $ADDRESSNUM;" ,
                  "$name = $title $test-custom-class-1 $test-custom-class-2" ,
                  "$title = Mr | Mrs | Miss | Dr | Prof ;"
                ]
             }
          }
       }
    }
    

次のステップ