LoginSignup
2
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-05-15

前回からの続きで、STTで音声認識Javascriptソースの記述について説明します。

3. STTで音声認識Javascriptソースの記述
wavファイルをアップロードし、STTに音声認識機能を利用するためのapp.jsを作成します。アップロードのためのロジックについては、偉大な先達の方々の手順4formidable、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を繰り返すとディスクスペースが逼迫しますので、注意してください。

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にデプロイに続きます。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1