0
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 5 years have passed since last update.

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

Last updated at Posted at 2018-12-28

メモ用です。

概要

  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
というエラーが出ましたら、

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

<img width="1342" alt="スクリーンショット 2018-12-28 16.34.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/252596/701c1bcd-0a59-63b7-318f-cca839ca3960.png">

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


<img width="443" alt="スクリーンショット 2018-12-28 16.37.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/252596/e66fd17d-4e23-e9b1-8a56-4bba23a8a2dc.png">

役割の部分には上の写真のようにストレージオブジェクトの閲覧者と入力し、メンバーには
projectOwner:~~~~~~と入力してください。
~~~~~には自分のprojectのidが入ります。


以上です。
0
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
0
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?