4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

クライアントアプリから Google Cloud Speech-to-Text を使ってみた(マイク編)

Last updated at Posted at 2020-07-26

前回の記事のつづきです。前提の環境やソースコードなどはすべて前回の記事とおなじなので、そちらを先にご参照ください。

今回のコンテンツ

入門ガイドにある**「ストリーミング入力の音声文字変換」** をやってみましょう。

TL;DR

  • MacでもWindowsでもマイクによる音声認識が可能でした
  • ただ SoX - Sound eXchange というライブラリをOSごとにインストールする方式なので、WEB開発むけという意味だとこの方式は採用しないかな、、。。

ライブラリのインストールなど環境設定

Node.jsのクライアントアプリケーションからOSのマイクデバイスにアクセスするには、SoX - Sound eXchange のインストールなどが必要です。基本はすべてチュートリアルに説明があるのでインストールできればなんでもOKなのですが、一応作業メモを。

Mac

Macの環境構築はシンプルです

brew install sox

するだけ。

Windows

バイナリをインストールして、パスを通すなどが必要です。ハマりました

バイナリへの直リンクはココ でです。
ダウンロードしたモノをインストールしたのち、下記の通りインストールディレクトリC:\Program Files (x86)\sox-14-4-2 へパスを通します。

path

さらにさらに環境によるかもしれませんが、こちらでやった限り Error: spawn rec ENOENT の現象が発生し、
sample_ts\node_modules\node-record-lpcm16\recorders\sox.js に手修正が必要でした、、、。

  let args = [
    '--type', 'waveaudio', // audio type    <-この1行を追加
    '--default-device',
    '--no-show-progress', // show no progress
    '--rate', options.sampleRate, // sample rate
    '--channels', options.channels, // channels
    '--encoding', 'signed-integer', // sample encoding
    '--bits', '16', // precision (bits)
    '--type', options.audioType, // audio type
    '-' // pipe
  ]

うーん、とても「簡単」とはいかないですね、、メンドクサイ。

やってみる

コードは前回の記事で取得済なので、実行するだけです。

Mac

% pwd
/xxx/speech_node_samples/sample_ts
% export GOOGLE_APPLICATION_CREDENTIALS="`pwd`/firebase-adminsdk.json"
%
% npx ts-node src/index3.ts
Listening, press Ctrl+C to stop.
Transcription: テストをしています
Transcription: もう一度テストです

(終了するにはCtrl-C)
^C
% 

ちゃんと音声認識できていますね!
数秒無音が続くと音声認識が実行されて画面に結果が表示され、また待ち状態になります。

Windows

(cloneしたコードはt:\speech_node_samples\sample_ts\ に展開されているとします)

T:\speech_node_samples\sample_ts> set GOOGLE_APPLICATION_CREDENTIALS=t:\speech_node_samples\sample_ts\firebase-adminsdk.json

T:\speech_node_samples\sample_ts> npx ts-node src\index3.ts
Listening, press Ctrl+C to stop.
Transcription: テストをしています
Transcription: もう一度テストです

(終了するにはCtrl-C)
^Cバッチ ジョブを終了しますか (Y/N)? y
T:\speech_node_samples\sample_ts>

Windowsでも、(環境設定はメンドクサかったですが) ちゃんと音声認識できていますね!

コードの中身

コードを見ておきましょう。これもストリーミング入力の音声文字変換のほぼまんまですが。

src/index3.ts
import speech from '@google-cloud/speech'
const recorder = require('node-record-lpcm16');

async function main() {
  // Creates a client
  const client = new speech.SpeechClient()
  const sampleRateHertz = 16000

  const config = {
    encoding: 'LINEAR16',
    languageCode: 'ja-JP',
    model: 'default',
    sampleRateHertz: sampleRateHertz,
    interimResults: false, // If you want interim results, set this to true
  }

  const request: any = {
    config: config,
  }

  // Create a recognize stream
  const recognizeStream = client
    .streamingRecognize(request)
    .on('error', console.error)
    .on('data', (data) =>
      process.stdout.write(
        data.results[0] && data.results[0].alternatives[0]
          ? `Transcription: ${data.results[0].alternatives[0].transcript}\n`
          : '\n\nReached transcription time limit, press Ctrl+C\n',
      ),
    )

  // Start recording and send the microphone input to the Speech API.
  // Ensure SoX is installed, see https://www.npmjs.com/package/node-record-lpcm16#dependencies
  recorder
    .record({
      sampleRateHertz: sampleRateHertz,
      threshold: 0,
      // Other options, see https://www.npmjs.com/package/node-record-lpcm16#options
      verbose: false,
      recordProgram: 'rec', // Try also "arecord" or "sox"
      silence: '10.0',
    })
    .stream()
    .on('error', console.error)
    .pipe(recognizeStream)

  console.log('Listening, press Ctrl+C to stop.')
}

if (!module.parent) {
  main().catch(console.error)
}

流れとしては

  • @google-cloud/speechライブラリの streamingRecognize メソッドで、音声認識をおこなうStreamを作成し、認識結果を受信したときの挙動を設定しておきます(結果を画面に表示するだけ)
  • node-record-lpcm16ライブラリをつかってマイクからの音声を受信し、先ほどのStreamをセットしておく

となります。
以上で「マイクからの音声をもとに、クライアントアプリケーションから、ライブラリを用いて音声認識する」ことができました。

まとめ

前回までのコンテンツも含めて、以下のことができるようになりました。

  • 音声ファイルをもとに、クライアントアプリケーションから、ライブラリを用いて音声認識する ことができました。
  • 音声ファイルをもとに、クライアントアプリケーションから、RESTを用いて音声認識する ことができました。
  • マイクからの音声をもとに、クライアントアプリケーションから、ライブラリを用いて音声認識する ことができました。
  • 今回のマイクからの音声受信は、各OSにSoxというプログラムのインストールが必要だったり、WEBアプリなどからは利用できなそう、ということがわかりました。

おつかれさまでしたー。

関連リンク

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?