You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Haha-Yes/node_modules/node-opus/examples/stream-to-alsa.js

57 lines
1.7 KiB
JavaScript

'use strict';
// replace username and password with speech to text credentials
// audio.wav can be found here: https://github.com/watson-developer-cloud/nodejs-wrapper/blob/master/test/resources/audio.wav?raw=true
var fs = require('fs');
var opus = require('node-opus');
var ogg = require('ogg');
var cp = require('child_process');
var oggDecoder = new ogg.Decoder();
oggDecoder.on('stream', function (stream) {
var opusDecoder = new opus.Decoder();
// the "format" event contains the raw PCM format
opusDecoder.on('format', function (format) {
// format example:
//{
// channels: 1,
// sampleRate: 24000,
// bitDepth: 16,
// float: false,
// signed: true,
// gain: 0,
// preSkip: 156,
// version: 1
//}
// convert the signed & bitDepth to an alsa compatible format (`aplay --help format` for full list)
var alsaFormat;
if (format.signed && format.bitDepth == 16) {
alsaFormat = 'S16_LE'; // assume Little Endian
} else {
throw new Error('unexpected format: ' + JSON.stringify(format));
}
// set up aplay to accept data from stdin
var aplay = cp.spawn('aplay',['--format=' + alsaFormat, '--rate=' + format.sampleRate, '--channels='+format.channels, '--']);
// send the raw PCM data to aplay
opusDecoder.pipe(aplay.stdin);
// or pipe to node-speaker, a file, etc
});
// an "error" event will get emitted if the stream is not a Vorbis stream
// (i.e. it could be a Theora video stream instead)
opusDecoder.on('error', console.error);
stream.pipe(opusDecoder);
});
fs.createReadStream('input.opus').pipe(oggDecoder);