GoogleのSpeechToTextAPIとnode.jsを使って音声をワンコマンドでテキスト化してみた

GoogleのSpeechToTextAPIとnode.jsを使って音声をワンコマンドでテキスト化してみた:

メモ用です。


概要

  1. GoogleCloudPlatform(GCP)を使ったプロジェクト、パケット、データオブジェクトの作成方法並びに認証設定を解説します。
  2. その後npmパッケージのgoogle-cloud/speechを使ってGCPConsoleにアクセスするために必要なアクセスキーなどの情報が書かれたjsonファイルをダウンロードする手順や環境変数のセットアップを行います。
  3. 必要な音声ファイルをFLAC形式に変換する方法、並びにmp4, m4a, FLAC, waveなどの音声フォーマット・エンコーディングについてちょびっと解説します。
  4. jsプログラムを記載しますので、node.jsで実行するところをお見せします。


手順1

https://console.cloud.google.com/

GoogleCloudPlatformにアクセスして,Cloud Speech APIを有効化します。

以下の手順です。


スクリーンショット 2018-12-28 16.46.53.png




スクリーンショット 2018-12-28 16.47.09.png


APIとサービスの有効化をクリック



スクリーンショット 2018-12-28 16.47.32.png


Cloud Speechと検索すると上のような画面になるので、Cloud Speech APIをクリック



スクリーンショット 2018-12-28 16.47.42.png


上の画面では青いボタンが「管理」と書かれていますが、APIが有効化されていなければ「APIを有効化する」と書かれてるのでそれをクリックして有効化します。

次にprojectを作成してください。

Projectが作成できたら、

GCP用のコマンド(SDK)または各プログラミング言語からライブラリを使ってgoogleのconsoleにアクセスしてAPIなどを利用できるようにするために、シークレットアクセスきーなるものが必要です。

左のサイドメニューからAPIとサービスをクリックして認証情報に行ってください。



スクリーンショット 2018-12-28 13.38.56.png


するとこんなページが出るので、青色ボタンの「認証情報の作成」をクリックし、


スクリーンショット 2018-12-28 13.39.30.png


サービスアカウントキーをクリックします。



スクリーンショット 2018-12-28 13.42.10.png


キーのタイプはjsonにして作成します。

サービスアカウント(IAM)を作るのですが、好きな名前をサービスアカウント名に設定して役割はProjectのオーナーに設定します。

作成を押すとファイルがダウンロードされるので
demoフォルダにserviceaccount.jsonで保存します。


ファイルツリー

demo

 serviceaccount.json


手順2

続いて、作成したプロジェクトにおいて音声ファイルなどのデータを保存するStorageサービスを使うのですが、フォルダ的な意味合いでパケットと呼ばれるものを使います。

下のような感じで



スクリーンショット 2018-12-28 13.47.25.png


パケットを作成します。


スクリーンショット 2018-12-28 14.03.41.png


名前を適当に入れて場所をアジアにします。


スクリーンショット 2018-12-28 14.04.21.png


そして作成を押すと



スクリーンショット 2018-12-28 14.05.37.png


みたいな画面になりますので、

ここに文字起こししたい音声ファイルを入れていくのですが、ここで課題が発生します。


手順3

このSpeechToTextAPIが文字起こしできる音声ファイルのエンコーディング形式やチャンネル数は決まっているので、その形式に沿ったファイルに変換できるサイトを使います。

以下のサイトを使います。
https://online-audio-converter.com/



スクリーンショット 2018-12-28 14.08.04.png



音声用語の解説

音声ファイルの圧縮形式には可逆形式と不可逆形式があり、圧縮した後に元のファイルに戻せるか否かの違いがあります。

よくあるMP3などは人間が聞き取れない周波数の高い音を中心に取り除くことで軽量化を図るファイル形式でWAVEというのは非圧縮状態のファイル形式です。生の音声データです。

最近ではm4aなども多いみたいです。

そしてFLACという圧縮形式を使えばMP3とは違いかなり重い音声データファイルになるのですが、WAVEに戻せますし、綺麗に音を拾うので文字起こしの精度を重視する際はこのFLACがおすすめですしSpeechToTextAPIが対応しているファイルエンコーディングもFLACとかLINEARぐらいです。

なのでお手元にお持ちの音声ファイルを上記画像で表示されているOpenFilesというところに入れて、

FLACを選択、AdvancedSettingsでは

SampleRate 48000

Channels 1

にして変換したやつをダウンロードします。


手順4

先ほどのパケット管理画面へ行き、ファイルをアップロードするというボタンをクリックして

この〜〜.flacという音声ファイルをアップロードします。


スクリーンショット 2018-12-28 14.15.49.png


こんな感じです。


スクリーンショット 2018-12-28 14.22.06.png



手順5

それでは先ほど作ったフォルダの中で以下コマンドを打ちましょう。

npm init


ファイルツリー

demo

 serviceaccount.json

 package.json

そして出来上がったpakcage.jsonを以下のように記述します

{ 
  "name": "demo", 
  "version": "1.0.0", 
  "description": "", 
  "main": "index.js", 
  "scripts": { 
    "test": "echo \"Error: no test specified\" && exit 1" 
  }, 
  "author": "", 
  "license": "ISC", 
  "dependencies": { 
    "@google-cloud/speech": "^2.1.1", 
    "dotenv": "^6.2.0" 
  } 
} 
 
そしてnpm installとコマンドを打ちます。

これで必要なパッケージが整いました。


ファイルツリー

demo

 node_module(フォルダ)

 serviceaccount.json

 package.json

 package-lock.json

では次にjsファイルを作りましょう。

同じディレクトリで

文字起こしされたスクリプトを格納するフォルダをsrcという名前で作り、

プログラムとなるspeech.jsというファイルを作り、

そのファイルに以下のコードを貼り付けてください。

const speech = require("@google-cloud/speech"); 
const fs = require('fs'); 
require('dotenv').config(); 
const client = new speech.SpeechClient(); 
 
const gcsUri = 'gs://' + process.argv[2] + '/' + process.argv[3] 
const audio = { 
  uri: gcsUri 
}; 
const config = { 
  encoding: 'FLAC', 
  sampleRateHertz: 48000, 
  languageCode: 'ja-JP', 
}; 
const request = { 
  audio: audio, 
  config: config, 
}; 
 
// Detects speech in the audio file 
client 
  .longRunningRecognize(request) 
  .then(data => { 
    const operation = data[0]; 
    // Get a Promise representation of the final result of the job 
    return operation.promise(); 
  }) 
  .then(data => { 
    const response = data[0]; 
    const transcription = response.results 
      .map(result => result.alternatives[0].transcript) 
      .join('\n'); 
      var outputName = 'src/' + process.argv[3].replace("flac", "txt") 
      fs.writeFileSync(outputName, transcription) 
    console.log(`Transcription: ${transcription}`); 
  }) 
  .catch(err => { 
    console.error('ERROR:', err); 
  }); 


ファイルツリー

demo

 node_module(フォルダ)

 src(フォルダ)

 serviceaccount.json

 package.json

 package-lock.json

 speech.js

さて、あと少しですがこのままだとうまくいきません。

最後にGOOGLE_APPLICATION_CREDENTIALSという環境変数に、先ほどダウンロードしたサービスアカウントキーであるjsonファイルまでのパスを設定しなければなりません。

.envファイルをフォルダの中に作りましょう。

そして以下のように記述してください。

GOOGLE_APPLICATION_CREDENTIALS='./serviceaccount.json' 


ファイルツリー

demo

 node_module(フォルダ)

 src(フォルダ)

 .env

 serviceaccount.json

 package.json

 package-lock.json

 speech.js

さぁこれで準備が整いました。

demoディレクトリ上で次のコマンドを打ちましょう。

node speech.js aaa bbb.flac

aaaには文字起こししたい音声ファイルを入れているパケットの名前を入れます。

下の写真ならば

 audio-demo

になるはずです



スクリーンショット 2018-12-28 16.27.43.png


続いて bbbには音声ファイルの名前を入れます。

下の写真の例ならば
sample.flac

になります



スクリーンショット 2018-12-28 16.29.19.png


ですので、打つべきコマンドは、

node speech.js audio-memo sample.flacです。

するとsrcフォルダにsample.txtというファイルが出力されているはずです。


ファイルツリー

demo

 node_module(フォルダ)

 src(フォルダ)

  sample.txt

 .env

 serviceaccount.json

 package.json

 package-lock.json

 speech.js

もしも

Error: 7 PERMISSION_DENIED

~~~~.iam.gserviceaccount.com does not have storage.objects.get access to ~~/sample.flac

というエラーが出ましたら、

パケット管理画面へ行ってください。



スクリーンショット 2018-12-28 16.34.55.png


そして右下の「パケットの権限を編集」というボタンを押します。



スクリーンショット 2018-12-28 16.37.21.png


役割の部分には上の写真のようにストレージオブジェクトの閲覧者と入力し、メンバーには

projectOwner:~~~~と入力してください。

~~

~には自分のprojectのidが入ります。以上です。

コメント

このブログの人気の投稿

投稿時間:2021-06-17 22:08:45 RSSフィード2021-06-17 22:00 分まとめ(2089件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)