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

概要

モデル適応機能を使用すると、提案される可能性がある他の候補よりも、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 Main Street」や「987 Grand Boulevard」などの語句は番地として認識されるため、より正確に文字変換されます。

クラストークン

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

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

次のスニペットは、Speech-to-Text API に送信される JSON ペイロードの例を示しています。JSON スニペットには、クラストークンを使用する SpeechContext オブジェクトが含まれます。

カスタムクラス

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

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

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

デフォルトでは、モデル適応によって得られる効果は、特に 1 つの単語で構成されるフレーズの場合に比較的小さなものにとどまります。モデル適応のブースト機能を使用すると、一部のフレーズに対する重み付けの割り当てを他のフレーズよりも引き上げることで、認識モデルのバイアスを引き上げられます。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」)を認識し損ねるエラーを多数見つけているかもしれません。この場合、boost 機能を使用して、「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 項目に追加し、それぞれにブースト値を割り当てます。上記の例の場合、バイグラムとエンドグラム(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」など)。これにより、STT 認識モデルは、元のブーストされたフレーズの一部を含むものの、逐語的には一致しない音声内の関連フレーズを認識する可能性が高くなります。

強調数値の設定

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

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

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

次の例では、「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"}'
    

    リクエストの例:

    {
       "phraseSetId":"test-phrase-set-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 I have there 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」と「ionion」というフレーズを追加します。

    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"
    

次のステップ