音声認識機能について

Speech-to-Text は、Google Distributed Cloud(GDC)のエアギャップ環境で利用できる 3 つの Vertex AI 事前トレーニング済み API の 1 つです。Speech-to-Text サービスは、音声ファイル内の音声を認識し、音声をテキストに文字変換します。Speech-to-Text は、データ所在地とコンプライアンスの要件を満たしています。

次の表に、Speech-to-Text の主な機能を示します。

主な機能
音声文字変換 高度なディープ ラーニングのニューラル ネットワーク アルゴリズムを利用して、自動音声認識を実現します。
モデル サイズが 1 GB 未満で、最小限のリソースしか消費しない認識モデルをデプロイします。
API との互換性 Speech-to-Text API とそのクライアント ライブラリを使用して、音声を送信し、Speech-to-Text サービスからテキストの文字変換を受け取ります。

Speech-to-Text でサポートされている音声エンコード

Speech-to-Text API は、さまざまなエンコードをサポートしています。次の表に、サポートされているオーディオ コーデックをリスト表示します。

コーデック 名前 ロスレス 使用上の注意
FLAC Free Lossless Audio Codec ストリームには 16 ビットまたは 24 ビットが必要
LINEAR16 Linear PCM 16 ビット リニアパルス符号変調(PCM)エンコード。ヘッダーにはサンプリング レートを含める必要があります。
MULAW μ-law × 8 ビット PCM エンコード
OGG_OPUS Ogg コンテナ内の Opus でエンコードされた音声フレーム × サンプルレートは 8,000 Hz、12,000 Hz、16,000 Hz、24,000 Hz、48,000 Hz のいずれかにする必要があります

FLAC はオーディオ コーデックであり、音声ファイル形式でもあります。FLAC エンコードで音声ファイルを文字に変換するには、.FLAC ファイル形式(メタデータが格納されたヘッダーを含む)で提供する必要があります。

Speech-to-Text は、LINEAR16 または MULAW でエンコードされた音声を含む WAV ファイルをサポートしています。

Speech-to-Text 音声コーデックの詳細については、AudioEncoding リファレンス ドキュメントをご覧ください。

ソース マテリアルのエンコード時に選択できる場合は、音声認識向上のために、FLACLINEAR16 などのロスレス エンコードを使用してください。

Speech-to-Text の機能

Distributed Cloud の Speech-to-Text には、音声認識を行う次の 3 つの方法があります。

  • 同期認識: 音声データを Speech-to-Text API に送信し、そのデータに対して認識を行い、音声処理後に結果を返します。同期認識リクエストは、1 分以内の音声データに制限されます。

  • 非同期認識: 音声データを Speech-to-Text API に送信し、長時間実行オペレーションを開始します。このオペレーションを使用することで、認識結果を定期的にポーリングできます。非同期認識リクエストは長さが 480 分までの音声データに使用します。

  • ストリーミング認識: 双方向ストリームで提供された音声データの認識を行います。ストリーミング リクエストは、マイクからのライブ音声のキャプチャなどのリアルタイムの認識を目的として設計されています。ストリーミング認識では、音声をキャプチャしながら暫定的な結果を生成して、結果を表示できます。たとえば、ユーザーがまだ話している間に結果を表示できます。

リクエストには、構成パラメータと音声データが含まれます。以降のセクションでは、これらの認識リクエスト、それらが生成するレスポンス、それらのレスポンスの処理方法について詳しく説明します。

同期リクエストとレスポンス

Speech-to-Text 同期認識リクエストは、スピーチ音声データに対して認識を行うための最も簡単な方法です。Speech-to-Text は、同期リクエストで送信された最大 1 分間のスピーチ音声データを処理できます。Speech-to-Text はすべての音声を処理して認識した後に、レスポンスを返します。

Speech-to-Text は、次のリクエストを処理する前にレスポンスを返す必要があります。通常、Speech-to-Text はリアルタイムよりも速く音声を処理し、30 秒の音声を平均 15 秒で処理します。音声の品質が悪い場合は、認識リクエストの処理時間が大幅に長くなることがあります。

音声認識リクエスト

同期 Speech-to-Text API リクエストは、音声認識構成と音声データで構成されます。次の例は、リクエストを示しています。

{
    "config": {
        "encoding": "LINEAR16",
        "sample_rate_hertz": 16000,
        "language_code": "en-US",
    },
    "audio": {
        "content": "ZkxhQwAAACIQABAAAAUJABtAA+gA8AB+W8FZndQvQAyjv..."
    }
}

Speech-to-Text 同期認識リクエストのすべてに、RecognitionConfig 型の音声認識 config フィールドを含める必要があります。RecognitionConfig オブジェクトには、次の必須サブフィールドが含まれています。

  • encoding: 提供された音声のエンコード スキームを指定します。このフィールドの型は AudioEncoding です。コーデックを選択できる場合は、良好なパフォーマンスを得るために、FLACLINEAR16 などのロスレス エンコードをおすすめします。サポートされている音声エンコード形式の一覧については、Speech-to-Text でサポートされている音声エンコードをご覧ください。encoding フィールドは、ファイル ヘッダーにエンコードが含まれている FLAC ファイルと WAV ファイルでは省略可能です。
  • sample_rate_hertz: 提供された音声のサンプルレートをヘルツ単位で指定します。サンプルレートの詳細については、サンプルレートをご覧ください。sample_rate_hertz フィールドは、ファイル ヘッダーにサンプルレートが含まれている FLAC ファイルと WAV ファイルでは省略可能です。
  • language_code: 提供された音声を認識する言語とリージョンを指定します。言語コードは BCP-47 識別子である必要があります。言語コードは一般に第一言語タグと、言語が話される国を表す第二リージョン サブタグで構成されます。この例では、en は英語、US は米国を表します。サポートされている言語の一覧については、サポートされている言語をご覧ください。

config フィールドに含めることができるオプションのサブフィールドの詳細と説明については、RecognitionConfig をご覧ください。

RecognitionAudio 型の audio パラメータを通して Speech-to-Text に音声を渡します。audio フィールドには次のサブフィールドが含まれます。

  • content: リクエスト内に埋め込まれた評価対象の音声が格納されます。音声データのバイトは、純粋なバイナリ表現を使用してエンコードされます。JSON 表現では Base64 が使用されます。詳しくは、埋め込み音声コンテンツをご覧ください。このフィールド内で直接渡される音声は、時間が 1 分に制限されます。

サンプルレート

音声のサンプルレートはリクエスト構成の sample_rate_hertz フィールドで指定し、関連する音声コンテンツのサンプルレートと一致している必要があります。Speech-to-Text は、8,000 Hz から 48,000 Hz の間のサンプルレートをサポートしています。sample_rate_hertz フィールドを使用する代わりに、ファイル ヘッダーで FLAC ファイルまたは WAV ファイルのサンプリング レートを指定できます。ただし、他のすべての音声形式では sample_rate_hertz フィールドが必要です。

ソース素材のエンコード時に選択できる場合は、16,000 Hz のサンプルレートを使用して音声をキャプチャします。これより低い値では、音声認識の精度が低下する可能性があり、レベルを高くしても音声認識品質に目立った効果はありません。

ただし、音声データを 16,000 Hz 以外のサンプルレートで録音した場合は、音声を 16,000 Hz で再サンプリングしないでください。たとえば、以前のほとんどの電話音声では 8,000 Hz のサンプルレートが使われており、正確な結果が生成されないことがあります。そのような音声を使用する必要がある場合は、元のサンプルレートで Speech-to-Text API に渡します。

言語

Speech-to-Text の認識エンジンは、多様な言語をサポートしています。リクエスト構成の language_code フィールドで、BCP-47 識別子を使用して音声の言語(および国または地域の方言)を指定します。

サポートされている言語のページには、各機能でサポートされている言語の一覧が記載されています。

モデルの選択

音声文字変換リクエストを Speech-to-Text に送信するときに、その特定のソースタイプからの音声を認識するようにトレーニングされた機械学習モデルを使用して音声ファイルを処理できます。

音声認識のモデルを指定するには、リクエストの RecognitionConfig オブジェクトに model フィールドを追加し、使用するモデルを値として指定します。

Distributed Cloud の Speech-to-Text は、次の 2 つのモデルをサポートしています。

  • default: 特定の音声モデル(長文音声など)ではない音声を文字起こしします。
  • chirp: より高い精度が必要な場合に、多言語音声の文字起こしを行います。Chirp は、トレーニングに使用できるラベル付きデータが少ない低リソース言語であっても、多くの言語で自動音声認識を実行します。

埋め込み音声コンテンツ

リクエストの audio フィールドに content パラメータを渡すとき、音声認識リクエストに埋め込み音声が含まれます。REST リクエスト内のコンテンツとして渡される埋め込み音声の場合、その音声は JSON のシリアル化との互換性がある必要があります。

音声データが 60 秒以下で 10 MB 以下の場合にのみ、同期認識の content フィールドでデータを直接送信できます。content フィールド内の音声データは Base64 形式である必要があります。

クライアント ライブラリを使用してリクエストを作成するときは、このバイナリデータまたは Base64 でエンコードされたデータを content フィールドに直接書き出します。

ほとんどの開発環境には、バイナリを ASCII テキストデータにエンコードする base64 ユーティリティが付属しており、必要なツールとサポートが提供されます。また、Python には Base64 エンコード コンテンツを組み込むメカニズムがあります。次の例は、ファイルをエンコードする方法を示しています。

Linux

base64 コマンドライン ツールを使用してファイルをエンコードします。-w 0 フラグを使用して、行の折り返しを防ぎます。

base64 INPUT_FILE -w 0 > OUTPUT_FILE

Python

Python では、次のように音声ファイルを Base64 エンコードします。

# Import the base64 encoding library.
import base64

# Pass the audio data to an encoding function.
def encode_audio(audio):
  audio_content = audio.read()
  return base64.b64encode(audio_content)

音声認識のレスポンス

同期 Speech-to-Text API レスポンスは、結果を返すまでに時間がかかることがあります。処理が終わると、API によって次の例に示すレスポンスが返されます。

{
  "results": [
    {
      "alternatives": [
        {
          "transcript": "how old is the Brooklyn Bridge",
          "words": [
            {
              "word": "how"
            },
            {
              "word": "old"
            },
            {
              "word": "is"
            },
            {
              "word": "the"
            },
            {
              "word": "Brooklyn"
            },
            {
              "word": "Bridge"
            }
          ]
        }
      ]
    }
  ]
}

Speech-to-Text API 同期認識レスポンスにはすべて、RecognizeResponse 型の音声認識結果が含まれます。RecognizeResponse オブジェクトには次のフィールドがあります。

  • results: SpeechRecognitionResult 型の結果のリストが含まれます。このリストでは、各結果が音声のセグメントに対応します。各結果は、次のサブフィールドの 1 つ以上で構成されます。

    • alternatives: SpeechRecognitionAlternative 型の音声文字変換テキスト候補のリストが格納されます。レスポンスの最初の変換候補が、通常は最も可能性が高い変換候補です。各変換候補は次のサブフィールドで構成されます。

      • transcript: 音声文字変換テキストが含まれます。このような音声文字変換テキストが連続した変換候補とともに提供される場合、それらを連結できます。
      • words: 認識された各単語の単語固有の情報のリストが含まれます。

詳細については、RecognizeResponse をご覧ください。

非同期リクエストとレスポンス

非同期 Speech-to-Text API リクエストの形式は、同期リクエストと同じです。ただし、非同期リクエストは、レスポンスを返す代わりに長時間実行オペレーションを開始し、このオペレーションをすぐに返します。非同期音声認識では、最長 480 分までの音声を使用できます。

オペレーション レスポンスの例を次に示します。

{
  "name": "OPERATION_NAME",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.speech_v1p1beta1.LongRunningRecognizeMetadata"
    "progressPercent": 34,
    "startTime": "2016-08-30T23:26:29.579144Z",
    "lastUpdateTime": "2016-08-30T23:26:29.826903Z"
  }
}

結果がまだ存在していないことに注意してください。Speech-to-Text は引き続き音声を処理し、このオペレーションを使用して結果を保存します。結果は、LongRunningRecognize リクエストが完了したときに返されるオペレーションの response フィールドに表示されます。

次に、リクエストの完了後の完全なレスポンスの例を示します。

{
  "name": "1268386125834704889",
  "metadata": {
    "lastUpdateTime": "2016-08-31T00:16:32.169Z",
    "@type": "type.googleapis.com/google.cloud.speech_v1p1beta1.LongRunningRecognizeMetadata",
    "startTime": "2016-08-31T00:16:29.539820Z",
    "progressPercent": 100
  }
  "response": {
    "@type": "type.googleapis.com/google.cloud.speech_v1p1beta1.LongRunningRecognizeResponse",
    "results": [{
      "alternatives": [{
        "transcript": "how old is the Brooklyn Bridge",
        "words": [
            {
              "word": "how"
            },
            {
              "word": "old"
            },
            {
              "word": "is"
            },
            {
              "word": "the"
            },
            {
              "word": "Brooklyn"
            },
            {
              "word": "Bridge"
            }
          ]
      }]}]
  },
  "done": True
}

doneTrue に設定され、オペレーションの responseSpeechRecognitionResult 型の結果セットが格納されていることがわかります。この型は、同期認識リクエストによって返される型と同じです。

ストリーミングのリクエストとレスポンス

ストリーミング Speech-to-Text API 認識呼び出しは、双方向ストリーム内の音声をリアルタイムでキャプチャし、認識するために設計されています。アプリケーションは、リクエスト ストリームで音声を送信し、レスポンス ストリームで中間および最終認識結果をリアルタイムで受信できます。中間結果は音声の断片に対する現時点の認識結果を示しますが、最終認識結果は、その音声の断片の最終的で最良の予測を示します。

ストリーミング認識リクエスト

構成と音声の両方を 1 つのリクエストで送信する同期呼び出しや非同期呼び出しと異なり、ストリーミング Speech-to-Text API の呼び出しでは複数のリクエストを送信する必要があります。最初の StreamingRecognizeRequest には、StreamingRecognitionConfig 型の構成を含める必要があります。

StreamingRecognitionConfigconfig フィールドで構成されます。このフィールドには RecognitionConfig 型の音声の構成情報が含まれます。これは同期リクエストや非同期リクエストで指定されるものと同じです。

ストリーミング認識レスポンス

ストリーミング音声認識結果は、StreamingRecognizeResponse 型の一連のレスポンスを返します。このようなレスポンスは次のフィールドから構成されます。

  • speech_event_type: SpeechEventType 型のイベントが格納されます。これらのイベントの値は、1 つの発言が完了したタイミングを示します。音声イベントは、ストリームのレスポンス内のマーカーとして機能します。
  • results: 結果のリストが格納されます。これは、StreamingRecognitionResult 型の中間結果か最終結果のいずれかです。results リストには次のサブフィールドが含まれます。
    • alternatives: 候補の音声文字変換リストが含まれます。
    • is_final: このリストエントリ内に取得された結果が中間結果か最終結果かを示します。
    • result_end_time: 音声の先頭から相対的な、この結果の終了時点の時間オフセットを示します。

Chirp: ユニバーサル音声モデル

Chirp は、Google Distributed Cloud(GDC)エアギャップ上の次世代の Speech-to-Text モデルです。ユニバーサル音声モデルのバージョンである Chirp は、20 億を超えるパラメータを備え、1 つのモデルで多くの言語の音声を文字に変換できます。

Chirp コンポーネントを有効にすると、他のサポートされている言語で音声ファイルを文字に変換できます。

Chirp は、さまざまな公開テストセットと言語で最先端の単語誤り率(WER)を実現し、Distributed Cloud で多言語サポートを提供します。ユニバーサル エンコーダを使用して、現行の音声モデルとは異なるアーキテクチャでモデルをトレーニングし、他の多くの言語のデータを使用します。その後、特定の言語の音声文字変換を提供するようにモデルがファインチューニングされます。1 つのモデルに複数の言語のデータが統合されています。ただし、モデルで音声認識を行う言語はユーザーが指定します。

Chirp は、他のモデルよりもはるかに大きなチャンクで音声を処理します。結果は発話全体が終了した後にのみ利用できます。そのため、Chirp はリアルタイムでの使用には適さない場合があります。

Chirp のモデル ID は chirp です。したがって、リクエストの RecognitionConfig オブジェクトの model フィールドに値 chirp を設定できます。

利用可能な API メソッド

Chirp は、RecognizeStreamingRecognize の両方の Speech-to-Text API メソッドをサポートしています。

StreamingRecognize は発話ごとに結果を返すため、両方のメソッドは異なります。このため、このメソッドは、Recognize メソッドと比較して、音声の開始後にミリ秒ではなく秒単位のレイテンシが発生します。ただし、発話の終了後(文の後に一時停止が続く場合など)の StreamingRecognize のレイテンシは非常に低くなります。