This project allows to detect specific wake words on a live audio stream.
To do so it generates a set of features from some audio samples to later compare them with the features generated from a live stream, to calculate the probability of a match.
The features can be loaded from a previous generated model file or extracted from the samples before starting to process the live streaming.
This web demo is available so you can quickly try out Rustpotter using a web browser.
It includes some models generated using multiple voices from a text-to-speech service. You can also load your own ones.
Please note that the audio processing runs entirely on your browser, your voice is not sent anywhere.
This project uses wav, it works internally with the spec 48000hz 16 bit 1 channel int, but allows to configure the detector to work with other specs.
The detector configuration is ignored when adding a keyword with samples as the wav spec is read from each file header (so raw samples are not allowed).
Rustpotter versions prior to v1.0.0 are not recommended, model compatibility was broken frequently.
Since 1.0.0 it will stick to semver, and a model compatibly break will be marked by a MAJOR version change, same will apply for related packages (cli, wasm-wrapper, java-wrapper...).
rust
let mut detector_builder = detector::FeatureDetectorBuilder::new();
let mut word_detector = detector_builder.build();
let name = String::from("hey home");
let path = String::from("./hey_home.rpw");
word_detector.add_wakeword(
name.clone(),
false,
None,
None,
vec!["./<audio sample path>.wav", "./<audio sample path>2.wav", ...],
);
match word_detector.create_wakeword_model(name.clone(), path) {
Ok(_) => {
println!("{} created!", name);
}
Err(message) => {
panic!(message);
}
};
```rust
let mut detectorbuilder = detector::FeatureDetectorBuilder::new();
detectorbuilder.setthreshold(0.4);
detectorbuilder.setsamplerate(16000);
let mut worddetector = detectorbuilder.build();
let result = worddetector.addwakewordfrommodel(command.modelpath, command.averagetemplates, true, None);
if result.iserr() {
panic!("Unable to load wakeword model");
}
while true {
let mut framebuffer: Vec
```
This project started as a port of the project node-personal-wakeword and uses the method described in this medium article.
The motivation behind this project is to learn about audio analysis and Rust. Also to have access to an open source wakeword spotter to use in other open projects.
Feel encourage to suggest any improvements or fixes.