素人Web屋の備忘録

素人Web屋の備忘録。たまに雑記。

Cloud Speech API + node.jsで音声認識をさせてみる1

前回、前々回とNode.js+Express+Azureでチャットアプリを作成しました。
これからルーム機能やログイン機能を付けていったら面白そうだなと思っているのですが、一番面白そうだなと思ったのが音声入力だったので、そちらから始めてみることにしました。
前回までの記事はこちら
Node.js+Express+Azureでチャットアプリをデプロイしてみる1
Node.js+Express+Azureでチャットアプリをデプロイしてみる2

調べたところ、音声認識Google Cloud Platform(GCP)のCloud Speech APIを使って実現できるみたいなのでそちらを使ってみたいと思います。
GCPGoogleクラウド上で提供しているサービスの総称で、そこにはとても多くのAPIライブラリがあったりVMやアプリのプラットフォームがあったりします。
GCPについて
https://cloud.google.com/

実際に音声認識をさせるまでかなりハマって大変だったので、気を付けるポイントなども書いていきます。

Node.jsはインストールされている前提で、以下環境です。
環境
Window10
node.js(8.9.4)

さらに音声認識をするために必要な以下のソフトをインストールします。
sox(音声ファイルの形式を変換するソフト)
Audacity(音声ファイルが正しく記録されているか確認用なのでなくてもOK)
Macを使っていればsoxbrew install soxでOK

前準備

Cloud Speech APIを使うためにGCPに登録します。
登録はこちらを参考にしました。ありがとうございます!
https://book.mynavi.jp/manatee/detail/id=65673

プロジェクト名を設定してプロジェクトを作成したら、ナビゲーションメニューを開いて「APIとサービス」からCloud Speech APIを有効にします。
次に認証情報の「認証情報を作成」のプルダウンからサービスアカウントキーを作成します。
作成後にjsonファイル(秘密鍵)が自分のPCに保存されます。※失くさない&&公開しないようにセキュリティに気を付けて保管してください。

作成後、プロジェクトIDとjsonファイルを環境変数に登録することが必要です。

export GCLOUD_PROJECT=プロジェクトID
export GOOGLE_APPLICATION_CREDENTIALS="pass/to/createdJsonFile"

node-record-lpcm16のインストール

今回用に適当にディレクトリを作成したら、そこでまずpackage.jsonを作成します。

npm init

次にnode.jsで音声ファイルを作成するためにnode-record-lpcm16をインストールします。

npm install node-record-lpcm16 --save

インストールが完了したら、落ちてきたパッケージ内にあるindex.jsの26行目のswitch文を以下の記述に変更します。

switch (options.recordProgram) {
  // On some Windows machines, sox is installed using the "sox" binary
  // instead of "rec"
  case 'sox': // case 'sox'節に以下のコードを追加
  cmd = options.recordProgram;
  cmdArgs = [
    '-q',                                 // show no progress
    '-t', 'waveaudio',                    // input-type
    '-d',                                 // use default recording device
    '-r', options.sampleRate.toString(),  // sample rate
    '-c', '1',                            // channels
    '-e', 'signed-integer',               // sample encoding
    '-b', '16',                           // precision (bits)
    '-t', 'raw',                          // output-type
    '-'                                   // pipe
  ];
  break;
  case 'rec':
  default:
    cmd = options.recordProgram
    cmdArgs = [
      '-q',                     // show no progress
      '-r', options.sampleRate, // sample rate
      '-c', '1',                // channels
      '-e', 'signed-integer',   // sample encoding
      '-b', '16',               // precision (bits)
      '-t', 'wav',              // audio type
      '-',                      // pipe
          // end on silence
      'silence', '1', '0.1', options.thresholdStart || options.threshold + '%',
      '1', options.silence, options.thresholdEnd || options.threshold + '%'
    ]
    break
  // On some systems (RasPi), arecord is the prefered recording binary
  case 'arecord':
    cmd = 'arecord'
    cmdArgs = [
      '-q',                     // show no progress
      '-r', options.sampleRate, // sample rate
      '-c', '1',                // channels
      '-t', 'wav',              // audio type
      '-f', 'S16_LE',           // Sample format
      '-'                       // pipe
    ]
    if (options.device) {
      cmdArgs.unshift('-D', options.device)
    }
    break
}

index.jsの作成

ここまで終わったら実際に音声を取り込んで音声ファイルを吐き出すindex.jsを作成します。

const record = require('node-record-lpcm16');
const fs = require('fs');

const filename = 'test.raw';
const file = fs.createWriteStream(filename);

const encoding = 'LINEAR16';
const sampleRate = 16000;

record.start({
  sampleRateHertz: sampleRate,
  encoding: encoding,
  recordProgram: 'sox'
}).pipe(file);

setTimeout(function () {
  record.stop();
}, 7000);

index.jsを実行します。

node index.js

実際にtest.rawファイルが吐き出されたら音声ファイルの取り込みは成功です。
rest.rawの確認方法として、Audacityを使います。

Audacityを起動して、ファイル>取り込み>Rawデータの取り込みを選択します。
test.rawを選択すると、サンプリング周波数の入力画面が表示されるので16000を入力します。
取り込みが完了したら再生を押して音声が録音されているか確認できます。

問題なく音声が取り込まれていることを確認したら、次にそれをテキストに変えてConsole画面に表示させる処理を書きていきます。

長くなったので残りは後日書きます!
読んでいただいてありがとうございました!