A speech recognition library for the web
Try the live demo.
JuliusJS is an opinionated port of Julius to JavaScript.
It actively listens to the user to transcribe what they are saying through a callback.
// bootstrap JuliusJS
var julius = new Julius();
julius.onrecognition = function(sentence) {
console.log(sentence);
};
// say "Hello, world!"
// console logs: `> HELLO WORLD`
Worker
bower install juliusjs --save
julius.js
in your html
<script src="https://github.com/zzmp/juliusjs/raw/master/julius.js"></script>
Make the scripts available to the client through your server
var express = require('express'),
app = express();
app.use(express.static('path/to/dist'));
In your main script, bootstrap JuliusJS and register an event listener for recognition events
// bootstrap JuliusJS
var julius = new Julius();
// register listener
julius.onrecognition = function(sentence, score) {
// ...
console.log(sentence);
};
In order for JuliusJS to use it, your grammar must follow the Julius grammar specification. The site includes a tutorial on writing grammars.
By default, phonemes are defined in voxforge/hmmdefs
, though you might find other sites more useful as reference.
mkdfa.pl
script and associated binaries, distributed with Julius.
./bin/mkdfa.pl
, included with this repoemscripten.sh
to populate bin
with the necessary filesyourGrammar.voca
file with words to be recognized
.voca
file defines "word candidates" and their pronunciations.yourGrammar.grammar
file with phrases composed of those words
.grammar
file defines "category-level syntax, i.e. allowed connection of words by their category name."./bin/mkdfa.pl yourGrammar
.voca
and .grammar
must be prefixed with the same nameyourGrammar.dfa
and yourGrammar.dict
Give the new .dfa
and .dict
files to the Julius
constructor
// when bootstrapping JuliusJS
var julius = new Julius('path/to/dfa', 'path/to/dict');
The Julius
constructor takes three arguments which can be used to tune the engine:
new Julius('path/to/dfa', 'path/to/dict', options)
Both 'path/to/dfa' and 'path/to/dict' must be set to use a custom grammar
.dfa
file, generated as described abovenull
, the default grammar will be used.dict
file, generated as described abovenull
, the default grammar will be usedoptions.verbose
- if true
, JuliusJS will log to the consoleoptions.stripSilence
- if true
, silence phonemes will not be included in callbacks
true
by defaultoptions.transfer
- if true
, captured microphone input will be piped to your speakers
options.*
options.zc = 30
will lower the zero-crossing threshold to 30.h
and hlist
options are unsupported.Coming soon...
Coming soon...
If you use JuliusJS
let me know, and I'll add your project to this list (or issue a pull request yourself).
onrecognition
)Contributions are welcome! See CONTRIBUTING.md
for guidelines.
You'll need emscripten, the LLVM to JS compiler, to build this from the C source. Once you have that, run ./emscript.sh
. If you are missing other tools, the script will let you know.
As emscript.sh reloads and recompiles static libraries, ./reemscript.sh
is available once you've already run emscript.sh. reemscript.sh will only recompile to JavaScript based on your latest changes. This can also be run with npm make
.
Additionally, tests are set will be made to run using npm test
.
In the meantime, a blank page with the JuliusJS library can be served using npm start
.
These scripts will compile/recompile Julius C source to JavaScript, as well as copy all other necessary files, to the js folder.
emscript.sh will also compile binaries, which you can use to create recognition grammars or compile grammars to smaller binary files. These are copied to the bin folder.
This is where the source for Julius will go once emscript.sh is run. emscript.sh will replace certain files in src/julius4 with those in src/include in order to make src/emscripted, the files eventually compiled to JavaScript.
Files in bold were changed to replace a loop with eventing, to simulate multithreading in a Worker.
The home to the testing server run with npm start
. Files are copied to this folder from dist with emscript.sh and reemscript.sh. If they are modified, they should be commited back to the dist folder.
The home for committed copies of the compiled library, as well as the wrappers that make them work: julius.js and worker.js. dist/listener/converter.js is the file that actually pipes Web Audio to Julius (the compiled C program).
JuliusJS is a port of the "Large Vocabulary Continuous Speech Recognition Engine Julius" to JavaScript