前回からの続きで、STTで音声認識Javascriptソースの記述について説明します。
3. STTで音声認識Javascriptソースの記述
wavファイルをアップロードし、STTに音声認識機能を利用するためのapp.jsを作成します。アップロードのためのロジックについては、偉大な先達の方々の手順4とformidable、BluemixにDeployするためのportの設定については手順5の記述を参考にしています。STTの音声認識処理については、STTのAPI ReferenceのSessionlessのRecognize audioのサンプルを参考にしています。
STTのサービス資格情報を、 'USERNAMEを挿入'や 'PASSWORDを挿入'の箇所に設定します。なお、ソースファイル中の、”//wavファイルのフルパスを生成”の記述は開発時のローカルのWindowsのためのモノです(Windows環境とBluemixではファイルのパスにおける、ドライブ指定や\の処理が異なるためです、不便です)。
var paramsで、recognizeのオプションを使用しています。modelでja-JP_NarrowbandModelを設定するとイキナリ課金になるようですので、注意してください。余談ですが、ja-JP_NarrowbandModelは、ビットレートが低い(例 128kbps)録音データの音声認識に使用します。このような音声データは、ja-JP_BroadbandModelでは処理でず、エラー終了します。
また、このソースでは、Uploadされたwavファイルはそのまま残ります。何回もUploadを繰り返すとディスクスペースが逼迫しますので、注意してください。
var http = require('http'),
util = require('util'),
formidable = require('formidable'),
server;
var cfenv = require( 'cfenv' );
var appEnv = cfenv.getAppEnv();
//ファイル保存場所
var TEST_TMP=".";
//ポート番号
var TEST_PORT=8080;
//uploadされたファイルのパス
var wavpath = null;
server = http.createServer(function(req, res) {
if (req.url == '/') {
res.writeHead(200, {'content-type': 'text/html; charset=UTF-8'});
res.end(
'<form action="/upload" enctype="multipart/form-data" method="post">'+
'<input type="text" name="title"><br>'+
'<input type="file" name="upload" multiple="multiple"><br>'+
'<input type="submit" value="Upload">'+
'</form>'+
'<form action="/watson" method="post">'+
'<input type="submit" value="Watson">'+
'</form>'
);
} else if (req.url == '/upload') {
var form = new formidable.IncomingForm(),
files = [],
fields = [];
form.uploadDir = TEST_TMP;
form
.on('field', function(field, value) {
console.log(field, value);
fields.push([field, value]);
})
.on('file', function(field, file) {
console.log(field, file);
wavpath = file.path;
files.push([field, file]);
})
.on('end', function() {
console.log('-> upload done');
res.writeHead(200, {'content-type': 'text/plain; charset=UTF-8'});
res.write('received fields:\n\n '+util.inspect(fields));
res.write('\n\n');
console.log('-> util.inspect');
console.log(util.inspect(files));
console.log(wavpath);
res.end('received files:\n\n '+util.inspect(files));
});
form.parse(req);
} else if (req.url == '/watson') {
// watson-developer-cloud stt start
var watson = require('watson-developer-cloud');
var fs = require('fs');
var speech_to_text = watson.speech_to_text({
username: 'USERNAMEを挿入',
password: 'PASSWORDを挿入',
version: 'v1'
});
//wavファイルのフルパスを生成
//var fullwavpath = null;
//fullwavpath = 'C:' + wavpath;
//console.log(fullwavpath);
//var result = fullwavpath.replace( /\\/g , '\\'+'\\' );
//console.log(result);
var fullwavpath = null;
fullwavpath = wavpath;
console.log(fullwavpath);
var result = fullwavpath;
console.log(result);
var params = {
audio: fs.createReadStream(result),
content_type: 'audio/wav',
model: 'ja-JP_BroadbandModel',
timestamps: true,
word_alternatives: 0.9
};
speech_to_text.recognize(params, function(err, transcript) {
if (err)
console.log(err);
else
console.log(JSON.stringify(transcript, null, 2));
res.writeHead(200, {'content-type': 'text/plain; charset=UTF-8'});
res.write(JSON.stringify(transcript, null, 2));
res.write('\n\n');
res.end('テキスト化終了')
});
// watson-developer-cloud stt end
} else {
res.writeHead(404, {'content-type': 'text/plain'});
res.end('404');
}
});
//server.listen(TEST_PORT);
server.listen(appEnv.port);
console.log('listening on http://localhost:'+TEST_PORT+'/');
4. Bluemixにデプロイに続きます。