IBM Bluemix/Watson Speech To Text/Node.jsでApplication開発(3)

[前回](http://qiita.com/yoshiono/items/b7352e9d1dfe7a7f9fd1)からの続きで、STTで音声認識Javascriptソースの記述について説明します。

**3. STTで音声認識Javascriptソースの記述**
wavファイルをアップロードし、STTに音声認識機能を利用するためのapp.jsを作成します。アップロードのためのロジックについては、偉大な先達の方々の[手順4](http://dev.classmethod.jp/server-side/node-formidable/)と[formidable](https://github.com/felixge/node-formidable)、BluemixにDeployするためのportの設定については[手順5](http://dotnsf.blog.jp/archives/1042018908.html)の記述を参考にしています。STTの音声認識処理については、STTの[API Reference](https://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/speech-to-text/api/v1/)の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を繰り返すとディスクスペースが逼迫しますので、注意してください。

```js:app.js
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にデプロイ](http://qiita.com/yoshiono/items/61518b82be69abde3c15)に続きます。