GoogleのSpeechToTextAPIとnode.jsを使って音声をワンコマンドでテキスト化してみた
GoogleのSpeechToTextAPIとnode.jsを使って音声をワンコマンドでテキスト化してみた:
メモ用です。
https://console.cloud.google.com/
GoogleCloudPlatformにアクセスして,Cloud Speech APIを有効化します。
以下の手順です。
APIとサービスの有効化をクリック
Cloud Speechと検索すると上のような画面になるので、Cloud Speech APIをクリック
上の画面では青いボタンが「管理」と書かれていますが、APIが有効化されていなければ「APIを有効化する」と書かれてるのでそれをクリックして有効化します。
次にprojectを作成してください。
Projectが作成できたら、
GCP用のコマンド(SDK)または各プログラミング言語からライブラリを使ってgoogleのconsoleにアクセスしてAPIなどを利用できるようにするために、シークレットアクセスきーなるものが必要です。
左のサイドメニューからAPIとサービスをクリックして認証情報に行ってください。
するとこんなページが出るので、青色ボタンの「認証情報の作成」をクリックし、
サービスアカウントキーをクリックします。
キーのタイプはjsonにして作成します。
サービスアカウント(IAM)を作るのですが、好きな名前をサービスアカウント名に設定して役割はProjectのオーナーに設定します。
作成を押すとファイルがダウンロードされるので
demoフォルダにserviceaccount.jsonで保存します。
demo
serviceaccount.json
続いて、作成したプロジェクトにおいて音声ファイルなどのデータを保存するStorageサービスを使うのですが、フォルダ的な意味合いでパケットと呼ばれるものを使います。
下のような感じで
パケットを作成します。
名前を適当に入れて場所をアジアにします。
そして作成を押すと
みたいな画面になりますので、
ここに文字起こししたい音声ファイルを入れていくのですが、ここで課題が発生します。
このSpeechToTextAPIが文字起こしできる音声ファイルのエンコーディング形式やチャンネル数は決まっているので、その形式に沿ったファイルに変換できるサイトを使います。
以下のサイトを使います。
https://online-audio-converter.com/
音声ファイルの圧縮形式には可逆形式と不可逆形式があり、圧縮した後に元のファイルに戻せるか否かの違いがあります。
よくあるMP3などは人間が聞き取れない周波数の高い音を中心に取り除くことで軽量化を図るファイル形式でWAVEというのは非圧縮状態のファイル形式です。生の音声データです。
最近ではm4aなども多いみたいです。
そしてFLACという圧縮形式を使えばMP3とは違いかなり重い音声データファイルになるのですが、WAVEに戻せますし、綺麗に音を拾うので文字起こしの精度を重視する際はこのFLACがおすすめですしSpeechToTextAPIが対応しているファイルエンコーディングもFLACとかLINEARぐらいです。
なのでお手元にお持ちの音声ファイルを上記画像で表示されているOpenFilesというところに入れて、
FLACを選択、AdvancedSettingsでは
SampleRate 48000
Channels 1
にして変換したやつをダウンロードします。
先ほどのパケット管理画面へ行き、ファイルをアップロードするというボタンをクリックして
この〜〜.flacという音声ファイルをアップロードします。
こんな感じです。
それでは先ほど作ったフォルダの中で以下コマンドを打ちましょう。
npm init
demo
serviceaccount.json
package.json
そして出来上がったpakcage.jsonを以下のように記述します
そしてnpm installとコマンドを打ちます。
これで必要なパッケージが整いました。
demo
node_module(フォルダ)
serviceaccount.json
package.json
package-lock.json
では次にjsファイルを作りましょう。
同じディレクトリで
文字起こしされたスクリプトを格納するフォルダをsrcという名前で作り、
プログラムとなるspeech.jsというファイルを作り、
そのファイルに以下のコードを貼り付けてください。
demo
node_module(フォルダ)
src(フォルダ)
serviceaccount.json
package.json
package-lock.json
speech.js
さて、あと少しですがこのままだとうまくいきません。
最後にGOOGLE_APPLICATION_CREDENTIALSという環境変数に、先ほどダウンロードしたサービスアカウントキーであるjsonファイルまでのパスを設定しなければなりません。
.envファイルをフォルダの中に作りましょう。
そして以下のように記述してください。
demo
node_module(フォルダ)
src(フォルダ)
.env
serviceaccount.json
package.json
package-lock.json
speech.js
さぁこれで準備が整いました。
demoディレクトリ上で次のコマンドを打ちましょう。
node speech.js aaa bbb.flac
aaaには文字起こししたい音声ファイルを入れているパケットの名前を入れます。
下の写真ならば
audio-demo
になるはずです
続いて bbbには音声ファイルの名前を入れます。
下の写真の例ならば
sample.flac
になります
ですので、打つべきコマンドは、
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
というエラーが出ましたら、
パケット管理画面へ行ってください。
そして右下の「パケットの権限を編集」というボタンを押します。
役割の部分には上の写真のようにストレージオブジェクトの閲覧者と入力し、メンバーには
projectOwner:~~~~と入力してください。
~~
~には自分のprojectのidが入ります。以上です。
メモ用です。
概要
- GoogleCloudPlatform(GCP)を使ったプロジェクト、パケット、データオブジェクトの作成方法並びに認証設定を解説します。
- その後npmパッケージのgoogle-cloud/speechを使ってGCPConsoleにアクセスするために必要なアクセスキーなどの情報が書かれたjsonファイルをダウンロードする手順や環境変数のセットアップを行います。
- 必要な音声ファイルをFLAC形式に変換する方法、並びにmp4, m4a, FLAC, waveなどの音声フォーマット・エンコーディングについてちょびっと解説します。
- jsプログラムを記載しますので、node.jsで実行するところをお見せします。
手順1
https://console.cloud.google.com/GoogleCloudPlatformにアクセスして,Cloud Speech APIを有効化します。
以下の手順です。
APIとサービスの有効化をクリック
Cloud Speechと検索すると上のような画面になるので、Cloud Speech APIをクリック
上の画面では青いボタンが「管理」と書かれていますが、APIが有効化されていなければ「APIを有効化する」と書かれてるのでそれをクリックして有効化します。
次にprojectを作成してください。
Projectが作成できたら、
GCP用のコマンド(SDK)または各プログラミング言語からライブラリを使ってgoogleのconsoleにアクセスしてAPIなどを利用できるようにするために、シークレットアクセスきーなるものが必要です。
左のサイドメニューからAPIとサービスをクリックして認証情報に行ってください。
するとこんなページが出るので、青色ボタンの「認証情報の作成」をクリックし、
サービスアカウントキーをクリックします。
キーのタイプはjsonにして作成します。
サービスアカウント(IAM)を作るのですが、好きな名前をサービスアカウント名に設定して役割はProjectのオーナーに設定します。
作成を押すとファイルがダウンロードされるので
demoフォルダにserviceaccount.jsonで保存します。
ファイルツリー
demoserviceaccount.json
手順2
続いて、作成したプロジェクトにおいて音声ファイルなどのデータを保存するStorageサービスを使うのですが、フォルダ的な意味合いでパケットと呼ばれるものを使います。下のような感じで
パケットを作成します。
名前を適当に入れて場所をアジアにします。
そして作成を押すと
みたいな画面になりますので、
ここに文字起こししたい音声ファイルを入れていくのですが、ここで課題が発生します。
手順3
このSpeechToTextAPIが文字起こしできる音声ファイルのエンコーディング形式やチャンネル数は決まっているので、その形式に沿ったファイルに変換できるサイトを使います。以下のサイトを使います。
https://online-audio-converter.com/
音声用語の解説
音声ファイルの圧縮形式には可逆形式と不可逆形式があり、圧縮した後に元のファイルに戻せるか否かの違いがあります。よくあるMP3などは人間が聞き取れない周波数の高い音を中心に取り除くことで軽量化を図るファイル形式でWAVEというのは非圧縮状態のファイル形式です。生の音声データです。
最近ではm4aなども多いみたいです。
そしてFLACという圧縮形式を使えばMP3とは違いかなり重い音声データファイルになるのですが、WAVEに戻せますし、綺麗に音を拾うので文字起こしの精度を重視する際はこのFLACがおすすめですしSpeechToTextAPIが対応しているファイルエンコーディングもFLACとかLINEARぐらいです。
なのでお手元にお持ちの音声ファイルを上記画像で表示されているOpenFilesというところに入れて、
FLACを選択、AdvancedSettingsでは
SampleRate 48000
Channels 1
にして変換したやつをダウンロードします。
手順4
先ほどのパケット管理画面へ行き、ファイルをアップロードするというボタンをクリックしてこの〜〜.flacという音声ファイルをアップロードします。
こんな感じです。
手順5
それでは先ほど作ったフォルダの中で以下コマンドを打ちましょう。npm init
ファイルツリー
demoserviceaccount.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" } }
これで必要なパッケージが整いました。
ファイルツリー
demonode_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); });
ファイルツリー
demonode_module(フォルダ)
src(フォルダ)
serviceaccount.json
package.json
package-lock.json
speech.js
さて、あと少しですがこのままだとうまくいきません。
最後にGOOGLE_APPLICATION_CREDENTIALSという環境変数に、先ほどダウンロードしたサービスアカウントキーであるjsonファイルまでのパスを設定しなければなりません。
.envファイルをフォルダの中に作りましょう。
そして以下のように記述してください。
GOOGLE_APPLICATION_CREDENTIALS='./serviceaccount.json'
ファイルツリー
demonode_module(フォルダ)
src(フォルダ)
.env
serviceaccount.json
package.json
package-lock.json
speech.js
さぁこれで準備が整いました。
demoディレクトリ上で次のコマンドを打ちましょう。
node speech.js aaa bbb.flac
aaaには文字起こししたい音声ファイルを入れているパケットの名前を入れます。
下の写真ならば
audio-demo
になるはずです
続いて bbbには音声ファイルの名前を入れます。
下の写真の例ならば
sample.flac
になります
ですので、打つべきコマンドは、
node speech.js audio-memo sample.flacです。
するとsrcフォルダにsample.txtというファイルが出力されているはずです。
ファイルツリー
demonode_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
というエラーが出ましたら、
パケット管理画面へ行ってください。
そして右下の「パケットの権限を編集」というボタンを押します。
役割の部分には上の写真のようにストレージオブジェクトの閲覧者と入力し、メンバーには
projectOwner:~~~~
~~
~には自分のprojectのidが入ります。以上です。
コメント
コメントを投稿