sc-voice
Version:
SuttaCentral Voice
93 lines (86 loc) • 2.86 kB
JavaScript
const version = '1.0.0';
const fs = require("fs");
const path = require("path");
const E_ARG_INVALID = -1;
const E_EXCEPTION = -2;
const {
exec,
execSync,
} = require('child_process');
const {
Voice,
} = require('../index');
const { logger, } = require('log-instance');
logger.level = 'warn';
var argv = process.argv;
var parseArg = (ashort, along, action, result) => {
argv = argv.reduce((acc,a,i) => {
if (a === ashort || a === along) {
result = action(acc, a, i);
} else {
acc.push(a);
}
return acc;
}, []);
return result;
};
var help = parseArg('-h', '--help', (acc,a,i) => true, false);
var lang = parseArg('-l', '--language', (acc,a,i) => argv[i+1], 'pli');
var vname = parseArg('-v', '--voice', (acc,a,i) => argv[i+1], 'aditi');
var cache = parseArg('-c', '--cache', (acc,a,i) => argv[i+1], 'common');
var usage = parseArg('-u', '--usage', (acc,a,i) => argv[i+1], 'recite');
var fnIn = parseArg('-i', '--input', (acc,a,i) => argv[i+1], 'stdin');
var fdIn = !fnIn || fnIn === 'stdin' ? 0 : fs.openSync(fnIn, 'r');
var fnOut = parseArg('-o', '--output', (acc,a,i) => argv[i+1], null);
var text = '(stdin)';
for (var i=0; i<argv.length; i++) {
var arg = argv[i];
if (arg.startsWith('-')) {
console.error(`unknown argument:${arg}`);
process.exit(E_ARG_INVALID);
}
}
if (help) {
console.log(`Voice command line utility v${version}
=====================================
Converts specified text into sound
Parameters:
-h --help show this listing
-l --language input language ('pli')
-v --voice voice name ('aditi')
-c --cache sound cache ('common')
-u --usage voice usage ('recite', 'navigate', 'review')
-i --input input file ('stdin')
-o --output output file (default is to play sound)
Arguments:`);
console.log(` help\t: ${help}`);
console.log(` lang\t: ${lang}`);
console.log(` voice\t: ${vname}`);
console.log(` cache\t: ${cache}`);
console.log(` usage\t: ${usage}`);
console.log(` input\t: ${fdIn ? fnIn : 'stdin'}`);
console.log(` output\t: ${fnOut ? fnOut : '(play sound)'}`);
console.log(` text\t: ${text}`);
process.exit(0);
}
(async function() { try {
text = fs.readFileSync(0).toString();
console.error(`text\t: ${text}`);
var voice = Voice.createVoice(vname);
if (voice == null) {
throw new Error(`unknown voice name:${vname}`);
}
var result = await voice.speak(text, {
usage,
});
var cmd = fnOut
? `ffmpeg -i ${result.file} -y ${fnOut}`
: `ffplay -nodisp -autoexit ${result.file}`;
console.error(cmd);
execSync(cmd);
process.exit(0);
} catch(e) {
console.error(e.stack);
process.exit(E_EXCEPTION);
}})();