Node.js での Speech-to-Text API の使用

1. 概要

Google Cloud Speech-to-Text API を使用すると、デベロッパーは、使いやすい API で強力なニューラル ネットワーク モデルを応用することで、120 の言語と方言で音声をテキストに変換できます。

この Codelab では、Node.js で Speech-to-Text API を使用することに焦点を当てます。このチュートリアルでは、英語やその他の言語の音声ファイルを Cloud Speech-to-Text API に送信して文字変換を行う方法について説明します。

学習内容

  • Speech-to-Text API を有効にする方法
  • API リクエストを認証する方法
  • Node.js 用 Google Cloud クライアント ライブラリをインストールする方法
  • 英語の音声ファイルを文字に変換する方法
  • 単語タイムスタンプを使用して音声ファイルを文字変換する方法
  • さまざまな言語の音声ファイルを文字に変換する方法

必要なもの

  • Google Cloud Platform プロジェクト
  • ChromeFirefox などのブラウザ
  • Javascript/Node.js の使用経験

アンケート

このチュートリアルをどのように使用されますか?

通読するのみ 通読し、演習を行う

Node.js のご利用経験はどの程度ありますか?

初心者 中級者 上級者

Google Cloud Platform サービスのご利用経験についてどのように評価されますか?

初心者 中級者 上級者

2. 設定と要件

セルフペース型の環境設定

  1. Cloud Console にログインし、新しいプロジェクトを作成するか、既存のプロジェクトを再利用します(Gmail アカウントまたは G Suite アカウントをお持ちでない場合は、アカウントを作成する必要があります)。

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

プロジェクト ID を忘れないようにしてください。プロジェクト ID はすべての Google Cloud プロジェクトを通じて一意の名前にする必要があります(上記の名前はすでに使用されているので使用できません)。以降、このコードラボでは PROJECT_ID と呼びます。

  1. 次に、Google Cloud リソースを使用するために、Cloud Console で課金を有効にする必要があります。

このコードラボを実行しても、費用はほとんどかからないはずです。このチュートリアル以外で請求が発生しないように、リソースのシャットダウン方法を説明する「クリーンアップ」セクションの手順に従うようにしてください。Google Cloud の新規ユーザーは $300 の無料トライアル プログラムをご利用いただけます。

Cloud Shell の起動

Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。

Cloud Shell をアクティブにする

  1. Cloud Console で、[Cloud Shell をアクティブにする] H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ をクリックします。

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Cloud Shell を起動したことがない場合、その内容を説明する中間画面が(スクロールしなければ見えない範囲に)が表示されます。その場合は、[続行] をクリックします(以後表示されなくなります)。このワンタイム スクリーンは次のようになります。

kEPbNAo_w5C_pi9QvhFwWwky1cX8hr_xEMGWySNIoMCdi-Djx9AQRqWn-__DmEpC7vKgUtl-feTcv-wBxJ8NwzzAp7mY65-fi2LJo4twUoewT1SUjd6Y3h81RG3rKIkqhoVlFR-G7w

Cloud Shell のプロビジョニングと接続に少し時間がかかる程度です。

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

この仮想マシンには、必要な開発ツールがすべて準備されています。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働するため、ネットワーク パフォーマンスが充実しており認証もスムーズです。このコードラボでの作業のほとんどは、ブラウザまたは Chromebook から実行できます。

Cloud Shell に接続すると、すでに認証は完了しており、プロジェクトに各自のプロジェクト ID が設定されていることがわかります。

  1. Cloud Shell で次のコマンドを実行して、認証されたことを確認します。
gcloud auth list

コマンド出力

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
gcloud config list project

コマンド出力

[core]
project = <PROJECT_ID>

上記のようになっていない場合は、次のコマンドで設定できます。

gcloud config set project <PROJECT_ID>

コマンド出力

Updated property [core/project].

3. Speech-to-Text API を有効にする

Speech-to-Text API の使用を開始する前に、API を有効にする必要があります。Cloud Shell で次のコマンドを使用して、API を有効にできます。

gcloud services enable speech.googleapis.com

4. API リクエストを認証する

Speech-to-Text API にリクエストを送信するには、サービス アカウントを使用する必要があります。プロジェクトのサービス アカウントを Google クライアント Node.js ライブラリで使用して、Speech-to-Text API リクエストを送信します。ほかのユーザー アカウントと同じように、サービス アカウントはメールアドレスで表されます。このセクションでは、Cloud SDK を使用してサービス アカウントを作成し、サービス アカウントの認証で必要になる認証情報を作成します。

まず、この Codelab 全体を通して使用する PROJECT_ID を使って環境変数を設定します。Cloud Shell を使用している場合は、この変数は自動的に設定されます。

export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value core/project)

次に、Speech-to-Text API にアクセスする新しいサービス アカウントを作成します。

gcloud iam service-accounts create my-speech-to-text-sa \
  --display-name "my speech-to-text codelab service account"

次に、作成した新しいサービス アカウントとしてログインするために Node.js コードで使用する認証情報を作成します。次のコマンドを使用して認証情報を作成し、JSON ファイル ~/key.json に保存します。

gcloud iam service-accounts keys create ~/key.json \
  --iam-account  my-speech-to-text-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com

最後に、次のステップで説明する Speech-to-Text API Node.js ライブラリが認証情報の検索に使用する GOOGLE_APPLICATION_CREDENTIALS 環境変数を設定します。先ほど作成した、認証情報を含む JSON ファイルのフルパスを設定する必要があります。

export GOOGLE_APPLICATION_CREDENTIALS="/home/${USER}/key.json"

Speech-to-Text API に対する認証の詳細については、こちらをご確認ください。

5. Node.js 用 Google Cloud Speech-to-Text API クライアント ライブラリをインストールする

まず、この Speech-to-Text API ラボの実行に使用するプロジェクトを作成し、任意のフォルダに新しい Node.js パッケージを初期化します。

npm init

NPM がプロジェクト構成に関するいくつかの質問(名前やバージョンなど)を行います。各質問に対して、ENTER を押してデフォルト値を受け入れます。デフォルトのエントリ ポイントは、index.js という名前のファイルです。

次に、Google Cloud Speech ライブラリをプロジェクトにインストールします。

npm install --save @google-cloud/speech

Google Cloud 用の Node.js 開発環境を設定する手順については、設定ガイドをご覧ください。

これで、Speech-to-Text API を使用する準備が整いました。

6. 音声ファイルを文字変換する

このセクションでは、事前に録音された英語の音声ファイルを文字起こしします。音声ファイルは Google Cloud Storage で利用できます。

内の index.js ファイルに移動し、コードを次のコードに置き換えます。

// Imports the Google Cloud client library
const speech = require('@google-cloud/speech');

const client = new speech.SpeechClient();

/**
 * Calls the Speech-to-Text API on a demo audio file.
 */
async function quickstart() {
// The path to the remote LINEAR16 file stored in Google Cloud Storage
  const gcsUri = 'gs://cloud-samples-data/speech/brooklyn_bridge.raw';

  // The audio file's encoding, sample rate in hertz, and BCP-47 language code
  const audio = {
    uri: gcsUri,
  };
  const config = {
    encoding: 'LINEAR16',
    sampleRateHertz: 16000,
    languageCode: 'en-US',
  };
  const request = {
    audio: audio,
    config: config,
  };

  // Detects speech in the audio file
  const [response] = await client.recognize(request);
  const transcription = response.results
      .map(result => result.alternatives[0].transcript)
      .join('\n');
  console.log(`Transcription: ${transcription}`);
}

quickstart();

コードを 1 ~ 2 分ほどかけて確認し、音声ファイルの文字起こしに使用されていることを確認します。

Encoding パラメータでは、音声ファイルに使用する音声エンコードのタイプを API に指定します。Flac は、.raw ファイルのエンコード タイプです(エンコード タイプの詳細については、ドキュメントをご覧ください)。

RecognitionAudio オブジェクトでは、Cloud Storage 内の音声ファイルの uri または音声ファイルのローカル ファイルパスを API に渡すことができます。ここでは、Cloud Storage URI を使用しています。

プログラムを実行します。

node .

次の出力が表示されます。

how old is the Brooklyn Bridge

7. 単語のタイムスタンプを使用して文字変換する

Speech-to-Text では、文字起こしされた音声の時間オフセット(タイムスタンプ)を検出できます。時間オフセットは、提供された音声で発話された各単語の開始時点と終了時点を示します。時間オフセット値は、音声の開始時点からの経過時間を 100 ミリ秒単位で表します。

内の index.js ファイルに移動し、コードを次のコードに置き換えます。

const speech = require('@google-cloud/speech');

const client = new speech.SpeechClient();

/**
 * Calls the Speech-to-Text API on a demo audio file.
 */
async function quickstart() {
// The path to the remote LINEAR16 file stored in Google Cloud Storage
  const gcsUri = 'gs://cloud-samples-data/speech/brooklyn_bridge.raw';

  // The audio file's encoding, sample rate in hertz, and BCP-47 language code
  const audio = {
    uri: gcsUri,
  };
  const config = {
    encoding: 'LINEAR16',
    sampleRateHertz: 16000,
    languageCode: 'en-US',
    enableWordTimeOffsets: true,
  };
  const request = {
    audio: audio,
    config: config,
  };

  // Detects speech in the audio file
  const [response] = await client.recognize(request);
  response.results.forEach((result) => {
    result.alternatives.forEach((alternative) => {
      console.log(`Transcript: ${alternative.transcript}`);
      console.log(`Word details:`);
      console.log(` Word count ${alternative.words.length}`);
      alternative.words.forEach((item) => {
        console.log(`  ${item.word}`);
        const s = parseInt(item.startTime.seconds) +
         item.startTime.nanos/1000000000;
        console.log(`   WordStartTime: ${s}s`);
        const e = parseInt(item.endTime.seconds) +
        item.endTime.nanos/1000000000;
        console.log(`   WordEndTime: ${e}s`);
      });
    });
  });
}

quickstart();

コードを 1 ~ 2 分ほどかけて確認し、単語のタイムスタンプ付きで音声ファイルの文字起こしに使用されていることを確認します。EnableWordTimeOffsets パラメータは、時間オフセットを有効にするよう API に指示します(詳しくは、ドキュメントをご覧ください)。

プログラムを再度実行します。

node .

次の出力が表示されます。

Transcript: how old is the Brooklyn Bridge
Word details:
 Word count 6
  how
   WordStartTime: 0s
   WordEndTime: 0.3s
  old
   WordStartTime: 0.3s
   WordEndTime: 0.6s
  is
   WordStartTime: 0.6s
   WordEndTime: 0.8s
  the
   WordStartTime: 0.8s
   WordEndTime: 0.9s
  Brooklyn
   WordStartTime: 0.9s
   WordEndTime: 1.1s
  Bridge
   WordStartTime: 1.1s
   WordEndTime: 1.4s

8. さまざまな言語の文字起こし

多言語対応が可能です。サポート対象の言語については、こちらをご覧ください。

このセクションでは、事前に録音されたフランス語の音声ファイルを文字起こしします。音声ファイルは Google Cloud Storage で利用できます。

内の index.js ファイルに移動し、コードを次のコードに置き換えます。

// Imports the Google Cloud client library
const speech = require('@google-cloud/speech');

const client = new speech.SpeechClient();

/**
 * Calls the Speech-to-Text API on a demo audio file.
 */
async function quickstart() {
// The path to the remote LINEAR16 file stored in Google Cloud Storage
  const gcsUri = 'gs://cloud-samples-data/speech/corbeau_renard.flac';

  // The audio file's encoding, sample rate in hertz, and BCP-47 language code
  const audio = {
    uri: gcsUri,
  };
  const config = {
    encoding: 'FLAC',
    languageCode: 'fr-FR',
  };
  const request = {
    audio: audio,
    config: config,
  };

  // Detects speech in the audio file
  const [response] = await client.recognize(request);
  const transcription = response.results
      .map((result) => result.alternatives[0].transcript)
      .join('\n');
  console.log(`Transcription: ${transcription}`);
}

quickstart();

プログラムを再度実行すると、次の出力が表示されます。

maître corbeau sur un arbre perché tenait en son bec un fromage

これはフランスで有名なある童話の一文です。

サポートされている言語と言語コードの全一覧については、こちらのドキュメントをご覧ください。

9. 完了

このラボでは、Node.js を使用して Speech-to-Text API を使用し、音声ファイルに対してさまざまな種類の文字起こしを行う方法を学びました。

クリーンアップ

このクイックスタートで使用するリソースに対して Google Cloud Platform アカウントに課金されないようにするには:

  • Cloud Platform Console に移動します。
  • シャットダウンするプロジェクトを選択し、上部の [削除] をクリックします。これにより、プロジェクトの削除がスケジュールされます。

詳細

ライセンス

この作業はクリエイティブ・コモンズの表示 2.0 汎用ライセンスにより使用許諾されています。