グーグルが提供するクラウドベースの2つのAPI(と関連ツール/パッケージ)を利用して、ほんのわずかなコードで日本語音声を英語テキストに翻訳してみよう!
最近では、日本語を自動的に他の言語に(あるいはその逆に)翻訳してくれるアプリもよく見られるようになってきた。自分のアプリにもそんな機能を組み込みたいと思ったことはないだろうか。グーグルが提供する以下の2つのAPIを利用すれば、ほんのわずかなコードでこれが可能だ。
そこで、マイクから音声を取り込み、それを別の言語に翻訳する簡単なコンソールアプリを作成してみる(それぞれのAPIを使用する際の価格については、上のリンクにある「CLOUD SPEECH API の料金」および「CLOUD TRANSLATION API の料金」を参照されたい。比較的安価に利用できる。Speech APIについては無料で使える分もある)。
PCのマイクからの音声取り込みには、Windows/macOS/Linuxなどで動作するSoX(Sound eXchange)と呼ばれるコマンドラインツールと、これをJavaScriptから利用するためのnode-record-lpcm16パッケージを使用する(というわけで、本稿ではJavaScriptでコードを記述していく)。JavaScriptからSoXを使用するためのインタフェースは多数存在するが、Speech APIのドキュメント「ストリーミング音声認識の実行」で紹介されているサンプルコードでもこのパッケージを使用していることから、本稿でもこれを利用している。
注意点としては、本稿で取り上げる内容は2017年6月15日時点のものであることだ。特にSpeech APIについては「クイックスタート」ページで「これは、Google Cloud Speech API のベータ版リリースです。このAPI下位互換性のない方法で変更される可能性が」あるとただし書きされている。そのため、ここで紹介しているコードが今後のAPIの改訂で動作しなくなる可能性がある。
大まかな動作を図にすると以下のようになる。
なお、本稿で作成するアプリは基本的にWindowsで動作を確認している。
まずはSoXとnode-record-lpcm16パッケージのインストールをしておこう。
WindowsではSoXのダウンロードページからインストーラーをダウンロード、実行するのが簡単だ(加えて、環境変数PATHにインストールディレクトリを登録しておく必要がある)。macOSではHomebrewを使用して「brew install sox」を実行するだけだ。
本稿では既に述べた通り、JavaScript(Node.js)を使用してコンソールアプリを作成する。そこで、適当なプロジェクトディレクトリを作成して「npm init」コマンドを実行しておく。次に「npm install node-record-lpcm16 --save」を実行して、このパッケージをインストールする。
これだけで済めばよいのだが、Windowsでは実はうまく動かない(かもしれない。本稿執筆時点ではうまく動かなかった)。その場合には「Error: spawn rec ENOENT」ページなどを参考にして、node-record-lpcm16パッケージに含まれるindex.jsファイルを変更する必要がある。ここでは、index.jsファイルを次のように変更した(25行目近辺にあるswitch文)。macOSではこの変更は必要ない(また、以下で紹介していくコードではrecord.startメソッド呼び出しで指定するrecordProgramパラメーターを「'rec'」にする)。
…… 省略 ……
var cmd, cmdArgs, cmdOptions
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
…… 省略 ……
以上の変更を行ったら、次のコードを実行してみる。
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' // macOSではこの行を省略するか、'rec'を指定
}).pipe(file);
setTimeout(function () {
record.stop();
}, 7000);
これはnode-record-lpcm16のリポジトリで紹介されているサンプルコードとほぼ同様だが、record.startメソッド呼び出しで「recordProgramに'sox'を指定」している点が異なる。デフォルトでは「rec」という名前のコマンドが実行されるが、Windows用のインストーラーでSoXをインストールした場合には、recコマンドではなくsoxコマンドで録音も行う(つまり、recコマンドがインストールされない)ようになっているからだ。なお、macOSでこのコードを試すときには、この行を省略するか、「'rec'」を指定するようにしよう。
また、Speech APIのドキュメント「音声エンコードの概要」ページには「Speech API は現時点では .WAV 音声ファイル形式をサポートしていません。…… 省略 ……このファイルは LINEAR16 音声エンコードを使用して……省略……」との注意が掲載されている。そこでここではエンコードに「LINEAR16」を指定している。
このファイルを実行して、問題なくtest.rawファイルが作成されれば、準備は完了だ(rawファイルに音声が正しく保存されているかは、Audacityなどを利用して確認できるだろう。Audacityであればメニューの[ファイル]−[取り込み]−[ロー (raw) データの取り込み]からrawファイルを取り込んで再生してみる)。
次ページでは、Speech APIとTranslation APIを使用するための設定を行う。
Copyright© Digital Advantage Corp. All Rights Reserved.