⚡ refact and moves ~/bin to ~/.local/bin
This commit is contained in:
71
.local/bin/piper.mjs
Executable file
71
.local/bin/piper.mjs
Executable file
@@ -0,0 +1,71 @@
|
||||
#!/usr/bin/env nodejsscript
|
||||
/* jshint esversion: 11,-W097, -W040, module: true, node: true, expr: true, undef: true *//* global echo, $, pipe, s, fetch, cyclicLoop */
|
||||
const p_home= $.xdg.home`Applications/piper/`
|
||||
const p_models= p_home+"models/"
|
||||
|
||||
$.api("", true)
|
||||
.version("2023-05-31")
|
||||
.describe([
|
||||
"This is a wrapper around the piper CLI.",
|
||||
"It allows you to get the list of available models, or to simplify `piper` callings.",
|
||||
"",
|
||||
"Visit: https://github.com/rhasspy/piper",
|
||||
"Original help:",
|
||||
...s.$().run`${p_home}piper --help`.stderr.split("\n").filter(Boolean).map(l=> "\t"+l)
|
||||
])
|
||||
.option("--models", "prints available models")
|
||||
.option("--model, -m", "chooses voice model by it's index or by text search (full name)")
|
||||
.option("--input_file, -I", "path to input text file (defaults to stdin)")
|
||||
.action(function main({
|
||||
models: is_models,
|
||||
model= 0,
|
||||
input_file,
|
||||
_,
|
||||
...pass
|
||||
}){
|
||||
if(is_models){
|
||||
models()
|
||||
.forEach(l=> echo(l));
|
||||
echo(helpTextModels("…for more models"))
|
||||
$.exit(0);
|
||||
}
|
||||
model= getModel(model);
|
||||
pass= Object.entries(pass)
|
||||
.map(([ name, value ])=> `${name.length > 1 ? "--" : "-"}${name} '${value}'`)
|
||||
.join(" ");
|
||||
const o= s.run(`echo ${text(input_file)} | ${p_home}piper --model ${model} ${pass}`);
|
||||
$.exit(o.code);
|
||||
})
|
||||
.parse();
|
||||
|
||||
function text(input_file){
|
||||
const candidate= input_file ? s.cat(input_file).stdout : $.stdin.text();
|
||||
if(typeof candidate!=="string")
|
||||
$.error("Missing input text file or piped text. Use `--help` for more information.");
|
||||
return "'"+candidate.trim().replaceAll("\n", "\t — \t").replaceAll("'", "\"")+"'";
|
||||
}
|
||||
function getModel(identifier){
|
||||
const candidate= typeof identifier==="number" ?
|
||||
models()[identifier] :
|
||||
models().find(l=> l.includes(identifier));
|
||||
if(!candidate)
|
||||
$.error([
|
||||
`Model identifier '${identifier}' seems not to matching any existing model.`,
|
||||
"Try `--models` to see all available models."
|
||||
].join("\n"));
|
||||
return candidate.slice(candidate.indexOf(" ")+1);
|
||||
}
|
||||
function models(){
|
||||
const out= s.ls(`${p_models}*.onnx`)
|
||||
.map((l, n)=> `${n}: ${l}`);
|
||||
if(!out.length)
|
||||
$.error(helpTextModels("No available models."));
|
||||
return out;
|
||||
}
|
||||
function helpTextModels(...text_initial){
|
||||
return [
|
||||
...text_initial,
|
||||
"Visits https://github.com/rhasspy/piper",
|
||||
"and download/extract model(s) into "+p_models
|
||||
].join("\n");
|
||||
}
|
Reference in New Issue
Block a user