Google Cloud Speech/Translation APIを使って翻訳アプリを作ってみよう:特集: Google Cloud Platformを使ってみる(4/4 ページ)
グーグルが提供するクラウドベースの2つのAPI(と関連ツール/パッケージ)を利用して、ほんのわずかなコードで日本語音声を英語テキストに翻訳してみよう!
テキストを英語に翻訳
テキスト化された日本語の英語テキストへの翻訳にはTranslation API(をラップする@google-cloud/translateパッケージ)が提供しているtranslateメソッドを呼び出すだけだ。このメソッドには上で取得したテキストと、翻訳先の言語(ここでは'en')を指定してやればよい。よって、translateメソッドの呼び出しは次のようにして行える。上のコードから変更があったのはTranslation APIの取り込みとクライアントの作成、setTimeout関数呼び出しだけなので、該当箇所を以下に示す。
…… 省略 ……
const translate = require('@google-cloud/translate');
…… 省略 ……
const translateClient = translate();
…… 省略 ……
setTimeout(function () {
var text = null;
record.stop();
speechClient.recognize(filename, config) // Speech API呼び出し
.then((results) => {
text = results[0].replace(/まる/g, '。');
return translateClient.translate(text, 'en'); // Translation API呼び出し
})
.then(result => console.log(`${text} => ${result[0]}`))
.catch(err => console.log(err));
}, 7000);
translateメソッドもPromiseオブジェクトを返送するので、ここではthenメソッドとcatchメソッドをチェーンさせている。実行結果を以下に示す。
> node recognitionViaFile.js
talk to your PC/Mac in 7 secs
ご注文はいかがいたしますか。俺はうなぎ => How do you order? I am eel
「俺はうなぎ」を「I am eel」にそのまま翻訳してくれるのは、Translation APIのかわいいところといえるだろう。
ストリームを使用した音声認識と翻訳
上のコードでは、ファイルを一度作成してから、それをSpeech APIとTranslation APIに渡していたが、Node.jsのストリームとSpeech APIが提供するRecognitionStreamオブジェクトを使えば、ファイルを生成することなく、マイクから取り込んだ音声をそのまま認識可能だ。詳細は「ストリーミング音声認識の実行」ページなどを参考にしていただくこととして、以下にこれを行うコードを示す(streamRecognition.jsファイル)。
const record = require('node-record-lpcm16');
const speech = require('@google-cloud/speech');
const translate = require('@google-cloud/translate');
const speechClient = speech();
const translateClient = translate();
const encoding = 'LINEAR16';
const sampleRate = 16000;
// 音声認識で使用するパラメーターの設定(エンコード方式/サンプリング周波数/言語)
const request = {
config: {
encoding: encoding,
sampleRateHertz: sampleRate,
languageCode: 'ja-jp'
}
};
// ストリームによる音声認識を行うオブジェクトの生成
const stream = speechClient.createRecognizeStream(request)
.on('error', console.error)
.on('data', (data) => {
var text = data.results.replace(/まる/g, '。');
translateClient.translate(text, 'en') // Translation API呼び出し
.then(result => console.log(`${text} => ${result[0]}`))
.catch(err => console.log(err));
});
// マイクからの入力を開始して、streamオブジェクトにストリームとして入力
record.start({
encoding: encoding,
sampleRate: sampleRate,
recordProgram: 'sox' // macOSでは'rec'を指定
}).pipe(stream);
console.log('talk to your PC/Mac in 10 secs');
// 10秒後に音声入力を終了
setTimeout(function () {
record.stop();
}, 10000);
ここでは、@google-cloud/speechパッケージが提供するcreateRecognizeStreamメソッドを使用して、音声認識を行うストリームを作成している。引数に渡しているrequestオブジェクトには上で説明したRecognitionConfigオブジェクトが含まれている。ここでは、先ほどと同様なフィールドを指定している。
そして、dataイベントが発生して、音声認識後のデータが送られてきたら、これをTranslation APIのtranslateメソッドに渡している(このコード自体は先ほどと同様だ)。これに伴い、setTimeout関数呼び出しではシンプルに音声取り込みを終了するだけとなっている(タイムアウトを10秒後に変更しているのは、ストリームによる処理が分かりやすくなるようにするためだ。興味のある方は実際に試して、音声を区切りながらマイクに発声してみよう)。
また、先ほどまでのコードではrecord.startメソッドの呼び出し結果を、pipeメソッドでファイルに流していたのが、上のコードではRecognizeStreamオブジェクトに渡すようになっている。
実行結果を以下に示す。
> node streamRecognition.js
talk to your PC/Mac in 10 secs
ご注文はいかがいたしますか。 => How do you order?
俺はうなぎ => I am eel
この結果から分かるように、ストリーミングによる音声認識では、ある程度まとまったテキストごとに認識が行われ、その結果が随時返送されるようになる(macOSでは最初のチャンクは認識してくれるが、その後の音声認識がうまくできなかったことがあったので、次回までに原因が分かればと思う。これが、動作確認がWindowsだけな理由だ)。
本稿では、グーグルが提供するSpeech APIとTranslation APIを使用して、マイクから日本語の音声を取り込み、それを英語テキストに翻訳する簡単なコンソールアプリを作成してみた。これらのAPIを使用するだけで、極めて少ないコード量でとても簡単に翻訳機能を持ったアプリを作成できるのが分かったはずだ。可能性としては、何らかの読み上げAPIと組み合わせることで、日本語音声を他の言語の音声へ自動翻訳するといったことも考えられる。
今回は簡単なコンソールアプリを作成したが、次回はこれにきちんとしたGUIを付けてみよう。また、機会があれば、マイクロソフトのCognitive Servicesを使って同様なことを行い、それぞれを比較してみたい。
Copyright© Digital Advantage Corp. All Rights Reserved.