Initial Commit
This commit is contained in:
@@ -0,0 +1,2 @@
|
|||||||
|
/target
|
||||||
|
*.wav
|
||||||
Generated
+155
@@ -0,0 +1,155 @@
|
|||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 4
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "itoa"
|
||||||
|
version = "1.0.18"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "memchr"
|
||||||
|
version = "2.8.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "proc-macro2"
|
||||||
|
version = "1.0.107"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9"
|
||||||
|
dependencies = [
|
||||||
|
"unicode-ident",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "quote"
|
||||||
|
version = "1.0.47"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde"
|
||||||
|
version = "1.0.229"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba"
|
||||||
|
dependencies = [
|
||||||
|
"serde_core",
|
||||||
|
"serde_derive",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_core"
|
||||||
|
version = "1.0.229"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48"
|
||||||
|
dependencies = [
|
||||||
|
"serde_derive",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_derive"
|
||||||
|
version = "1.0.229"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn 3.0.3",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_json"
|
||||||
|
version = "1.0.151"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14"
|
||||||
|
dependencies = [
|
||||||
|
"itoa",
|
||||||
|
"memchr",
|
||||||
|
"serde",
|
||||||
|
"serde_core",
|
||||||
|
"zmij",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "speech-detection"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"vosk",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "syn"
|
||||||
|
version = "2.0.119"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"unicode-ident",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "syn"
|
||||||
|
version = "3.0.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"unicode-ident",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "thiserror"
|
||||||
|
version = "1.0.69"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
|
||||||
|
dependencies = [
|
||||||
|
"thiserror-impl",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "thiserror-impl"
|
||||||
|
version = "1.0.69"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn 2.0.119",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-ident"
|
||||||
|
version = "1.0.24"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "vosk"
|
||||||
|
version = "0.3.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ae9e2a552b3fb49f097849cfed3d4a2a7163bb7ea507268666980605a676c627"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
|
"thiserror",
|
||||||
|
"vosk-sys",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "vosk-sys"
|
||||||
|
version = "0.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "73ab2937e19c7d32c1a077a4a220011cbbb2b6ab83bb35635ffb65a82b7e43f6"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "zmij"
|
||||||
|
version = "1.0.23"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
[package]
|
||||||
|
name = "speech-detection"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
vosk = "0.3.1"
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
use std::{env, path::PathBuf};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let root = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
|
||||||
|
|
||||||
|
println!(
|
||||||
|
"cargo:rustc-link-search=native={}",
|
||||||
|
root.join("vosk-linux-x86_64-0.3.45").display()
|
||||||
|
);
|
||||||
|
println!("cargo:rustc-link-lib=dylib=vosk");
|
||||||
|
|
||||||
|
println!("cargo:rerun-if-changed=vosk-linux-x86_64-0.3.45/vosk_api.h");
|
||||||
|
}
|
||||||
Generated
+82
@@ -0,0 +1,82 @@
|
|||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1785141334,
|
||||||
|
"narHash": "sha256-kh35kIx7el4Jk8Ki3BH9/Pn1eZYSYLJ6LMALos0zOy0=",
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "38a4887411571457d700c51c64a6e49ead2ed5ab",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nixos",
|
||||||
|
"ref": "nixpkgs-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs",
|
||||||
|
"rust-overlay": "rust-overlay",
|
||||||
|
"utils": "utils"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"rust-overlay": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1785216007,
|
||||||
|
"narHash": "sha256-KrGilCiFVxEQOaBD3TODhklZzE7uICQvqsBWgycIABA=",
|
||||||
|
"owner": "oxalica",
|
||||||
|
"repo": "rust-overlay",
|
||||||
|
"rev": "8ec8a5a41f8d8244e672829c9cd705416139d3f0",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "oxalica",
|
||||||
|
"repo": "rust-overlay",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"utils": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1731533236,
|
||||||
|
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
{
|
||||||
|
description = "Nix development flake for speech-detection";
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:nixos/nixpkgs?ref=nixpkgs-unstable";
|
||||||
|
utils.url = "github:numtide/flake-utils";
|
||||||
|
rust-overlay = {
|
||||||
|
url = "github:oxalica/rust-overlay";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs =
|
||||||
|
{
|
||||||
|
self,
|
||||||
|
nixpkgs,
|
||||||
|
utils,
|
||||||
|
rust-overlay,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
utils.lib.eachDefaultSystem (
|
||||||
|
system:
|
||||||
|
let
|
||||||
|
overlays = [ (import rust-overlay) ];
|
||||||
|
pkgs = import nixpkgs {
|
||||||
|
inherit system overlays;
|
||||||
|
};
|
||||||
|
rust = pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml;
|
||||||
|
|
||||||
|
libPath =
|
||||||
|
with pkgs;
|
||||||
|
lib.makeLibraryPath [
|
||||||
|
gcc.cc.lib
|
||||||
|
];
|
||||||
|
|
||||||
|
in
|
||||||
|
{
|
||||||
|
devShells = {
|
||||||
|
default =
|
||||||
|
with pkgs;
|
||||||
|
mkShell {
|
||||||
|
buildInputs = [
|
||||||
|
rust
|
||||||
|
cargo-nextest
|
||||||
|
fish
|
||||||
|
pkg-config
|
||||||
|
fontconfig
|
||||||
|
stdenv.cc.cc.lib
|
||||||
|
];
|
||||||
|
|
||||||
|
env.RUST_SRC_PATH = "${pkgs.rust.packages.stable.rustPlatform.rustLibSrc}";
|
||||||
|
LD_LIBRARY_PATH = "$LD_LIBRARY_PATH:${libPath}";
|
||||||
|
|
||||||
|
shellHook = ''
|
||||||
|
echo Entered Rust dev shell for project speech-detection
|
||||||
|
export LIBC_PATH=${pkgs.stdenv.cc.cc.lib}/lib/
|
||||||
|
exec fish -C "set -ax LD_LIBRARY_PATH $PWD/vosk-linux-x86_64-0.3.45"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
[toolchain]
|
||||||
|
channel = "nightly"
|
||||||
|
components = [
|
||||||
|
"clippy",
|
||||||
|
"rustfmt",
|
||||||
|
"rust-analyzer",
|
||||||
|
"rust-src",
|
||||||
|
"rustc-codegen-cranelift",
|
||||||
|
]
|
||||||
+20
@@ -0,0 +1,20 @@
|
|||||||
|
use vosk::{Model, Recognizer};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let samples = [100, -2, 700, 30, 4, 5];
|
||||||
|
let model_path = "./vosk-model-small-en-us-0.15";
|
||||||
|
|
||||||
|
let model = Model::new(model_path).unwrap();
|
||||||
|
let mut recognizer = Recognizer::new(&model, 16000.0).unwrap();
|
||||||
|
|
||||||
|
recognizer.set_max_alternatives(10);
|
||||||
|
recognizer.set_words(true);
|
||||||
|
recognizer.set_partial_words(true);
|
||||||
|
|
||||||
|
for sample in samples.chunks(100) {
|
||||||
|
let _ = recognizer.accept_waveform(sample);
|
||||||
|
println!("{:#?}", recognizer.partial_result());
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("{:#?}", recognizer.final_result().multiple().unwrap());
|
||||||
|
}
|
||||||
Executable
BIN
Binary file not shown.
@@ -0,0 +1,361 @@
|
|||||||
|
// Copyright 2020-2021 Alpha Cephei Inc.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
/* This header contains the C API for Vosk speech recognition system */
|
||||||
|
|
||||||
|
#ifndef VOSK_API_H
|
||||||
|
#define VOSK_API_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Model stores all the data required for recognition
|
||||||
|
* it contains static data and can be shared across processing
|
||||||
|
* threads. */
|
||||||
|
typedef struct VoskModel VoskModel;
|
||||||
|
|
||||||
|
|
||||||
|
/** Speaker model is the same as model but contains the data
|
||||||
|
* for speaker identification. */
|
||||||
|
typedef struct VoskSpkModel VoskSpkModel;
|
||||||
|
|
||||||
|
|
||||||
|
/** Recognizer object is the main object which processes data.
|
||||||
|
* Each recognizer usually runs in own thread and takes audio as input.
|
||||||
|
* Once audio is processed recognizer returns JSON object as a string
|
||||||
|
* which represent decoded information - words, confidences, times, n-best lists,
|
||||||
|
* speaker information and so on */
|
||||||
|
typedef struct VoskRecognizer VoskRecognizer;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Batch model object
|
||||||
|
*/
|
||||||
|
typedef struct VoskBatchModel VoskBatchModel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Batch recognizer object
|
||||||
|
*/
|
||||||
|
typedef struct VoskBatchRecognizer VoskBatchRecognizer;
|
||||||
|
|
||||||
|
|
||||||
|
/** Loads model data from the file and returns the model object
|
||||||
|
*
|
||||||
|
* @param model_path: the path of the model on the filesystem
|
||||||
|
* @returns model object or NULL if problem occured */
|
||||||
|
VoskModel *vosk_model_new(const char *model_path);
|
||||||
|
|
||||||
|
|
||||||
|
/** Releases the model memory
|
||||||
|
*
|
||||||
|
* The model object is reference-counted so if some recognizer
|
||||||
|
* depends on this model, model might still stay alive. When
|
||||||
|
* last recognizer is released, model will be released too. */
|
||||||
|
void vosk_model_free(VoskModel *model);
|
||||||
|
|
||||||
|
|
||||||
|
/** Check if a word can be recognized by the model
|
||||||
|
* @param word: the word
|
||||||
|
* @returns the word symbol if @param word exists inside the model
|
||||||
|
* or -1 otherwise.
|
||||||
|
* Reminding that word symbol 0 is for <epsilon> */
|
||||||
|
int vosk_model_find_word(VoskModel *model, const char *word);
|
||||||
|
|
||||||
|
|
||||||
|
/** Loads speaker model data from the file and returns the model object
|
||||||
|
*
|
||||||
|
* @param model_path: the path of the model on the filesystem
|
||||||
|
* @returns model object or NULL if problem occured */
|
||||||
|
VoskSpkModel *vosk_spk_model_new(const char *model_path);
|
||||||
|
|
||||||
|
|
||||||
|
/** Releases the model memory
|
||||||
|
*
|
||||||
|
* The model object is reference-counted so if some recognizer
|
||||||
|
* depends on this model, model might still stay alive. When
|
||||||
|
* last recognizer is released, model will be released too. */
|
||||||
|
void vosk_spk_model_free(VoskSpkModel *model);
|
||||||
|
|
||||||
|
/** Creates the recognizer object
|
||||||
|
*
|
||||||
|
* The recognizers process the speech and return text using shared model data
|
||||||
|
* @param model VoskModel containing static data for recognizer. Model can be
|
||||||
|
* shared across recognizers, even running in different threads.
|
||||||
|
* @param sample_rate The sample rate of the audio you going to feed into the recognizer.
|
||||||
|
* Make sure this rate matches the audio content, it is a common
|
||||||
|
* issue causing accuracy problems.
|
||||||
|
* @returns recognizer object or NULL if problem occured */
|
||||||
|
VoskRecognizer *vosk_recognizer_new(VoskModel *model, float sample_rate);
|
||||||
|
|
||||||
|
|
||||||
|
/** Creates the recognizer object with speaker recognition
|
||||||
|
*
|
||||||
|
* With the speaker recognition mode the recognizer not just recognize
|
||||||
|
* text but also return speaker vectors one can use for speaker identification
|
||||||
|
*
|
||||||
|
* @param model VoskModel containing static data for recognizer. Model can be
|
||||||
|
* shared across recognizers, even running in different threads.
|
||||||
|
* @param sample_rate The sample rate of the audio you going to feed into the recognizer.
|
||||||
|
* Make sure this rate matches the audio content, it is a common
|
||||||
|
* issue causing accuracy problems.
|
||||||
|
* @param spk_model speaker model for speaker identification
|
||||||
|
* @returns recognizer object or NULL if problem occured */
|
||||||
|
VoskRecognizer *vosk_recognizer_new_spk(VoskModel *model, float sample_rate, VoskSpkModel *spk_model);
|
||||||
|
|
||||||
|
|
||||||
|
/** Creates the recognizer object with the phrase list
|
||||||
|
*
|
||||||
|
* Sometimes when you want to improve recognition accuracy and when you don't need
|
||||||
|
* to recognize large vocabulary you can specify a list of phrases to recognize. This
|
||||||
|
* will improve recognizer speed and accuracy but might return [unk] if user said
|
||||||
|
* something different.
|
||||||
|
*
|
||||||
|
* Only recognizers with lookahead models support this type of quick configuration.
|
||||||
|
* Precompiled HCLG graph models are not supported.
|
||||||
|
*
|
||||||
|
* @param model VoskModel containing static data for recognizer. Model can be
|
||||||
|
* shared across recognizers, even running in different threads.
|
||||||
|
* @param sample_rate The sample rate of the audio you going to feed into the recognizer.
|
||||||
|
* Make sure this rate matches the audio content, it is a common
|
||||||
|
* issue causing accuracy problems.
|
||||||
|
* @param grammar The string with the list of phrases to recognize as JSON array of strings,
|
||||||
|
* for example "["one two three four five", "[unk]"]".
|
||||||
|
*
|
||||||
|
* @returns recognizer object or NULL if problem occured */
|
||||||
|
VoskRecognizer *vosk_recognizer_new_grm(VoskModel *model, float sample_rate, const char *grammar);
|
||||||
|
|
||||||
|
|
||||||
|
/** Adds speaker model to already initialized recognizer
|
||||||
|
*
|
||||||
|
* Can add speaker recognition model to already created recognizer. Helps to initialize
|
||||||
|
* speaker recognition for grammar-based recognizer.
|
||||||
|
*
|
||||||
|
* @param spk_model Speaker recognition model */
|
||||||
|
void vosk_recognizer_set_spk_model(VoskRecognizer *recognizer, VoskSpkModel *spk_model);
|
||||||
|
|
||||||
|
|
||||||
|
/** Reconfigures recognizer to use grammar
|
||||||
|
*
|
||||||
|
* @param recognizer Already running VoskRecognizer
|
||||||
|
* @param grammar Set of phrases in JSON array of strings or "[]" to use default model graph.
|
||||||
|
* See also vosk_recognizer_new_grm
|
||||||
|
*/
|
||||||
|
void vosk_recognizer_set_grm(VoskRecognizer *recognizer, char const *grammar);
|
||||||
|
|
||||||
|
|
||||||
|
/** Configures recognizer to output n-best results
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* {
|
||||||
|
* "alternatives": [
|
||||||
|
* { "text": "one two three four five", "confidence": 0.97 },
|
||||||
|
* { "text": "one two three for five", "confidence": 0.03 },
|
||||||
|
* ]
|
||||||
|
* }
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* @param max_alternatives - maximum alternatives to return from recognition results
|
||||||
|
*/
|
||||||
|
void vosk_recognizer_set_max_alternatives(VoskRecognizer *recognizer, int max_alternatives);
|
||||||
|
|
||||||
|
|
||||||
|
/** Enables words with times in the output
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* "result" : [{
|
||||||
|
* "conf" : 1.000000,
|
||||||
|
* "end" : 1.110000,
|
||||||
|
* "start" : 0.870000,
|
||||||
|
* "word" : "what"
|
||||||
|
* }, {
|
||||||
|
* "conf" : 1.000000,
|
||||||
|
* "end" : 1.530000,
|
||||||
|
* "start" : 1.110000,
|
||||||
|
* "word" : "zero"
|
||||||
|
* }, {
|
||||||
|
* "conf" : 1.000000,
|
||||||
|
* "end" : 1.950000,
|
||||||
|
* "start" : 1.530000,
|
||||||
|
* "word" : "zero"
|
||||||
|
* }, {
|
||||||
|
* "conf" : 1.000000,
|
||||||
|
* "end" : 2.340000,
|
||||||
|
* "start" : 1.950000,
|
||||||
|
* "word" : "zero"
|
||||||
|
* }, {
|
||||||
|
* "conf" : 1.000000,
|
||||||
|
* "end" : 2.610000,
|
||||||
|
* "start" : 2.340000,
|
||||||
|
* "word" : "one"
|
||||||
|
* }],
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* @param words - boolean value
|
||||||
|
*/
|
||||||
|
void vosk_recognizer_set_words(VoskRecognizer *recognizer, int words);
|
||||||
|
|
||||||
|
/** Like above return words and confidences in partial results
|
||||||
|
*
|
||||||
|
* @param partial_words - boolean value
|
||||||
|
*/
|
||||||
|
void vosk_recognizer_set_partial_words(VoskRecognizer *recognizer, int partial_words);
|
||||||
|
|
||||||
|
/** Set NLSML output
|
||||||
|
* @param nlsml - boolean value
|
||||||
|
*/
|
||||||
|
void vosk_recognizer_set_nlsml(VoskRecognizer *recognizer, int nlsml);
|
||||||
|
|
||||||
|
|
||||||
|
/** Accept voice data
|
||||||
|
*
|
||||||
|
* accept and process new chunk of voice data
|
||||||
|
*
|
||||||
|
* @param data - audio data in PCM 16-bit mono format
|
||||||
|
* @param length - length of the audio data
|
||||||
|
* @returns 1 if silence is occured and you can retrieve a new utterance with result method
|
||||||
|
* 0 if decoding continues
|
||||||
|
* -1 if exception occured */
|
||||||
|
int vosk_recognizer_accept_waveform(VoskRecognizer *recognizer, const char *data, int length);
|
||||||
|
|
||||||
|
|
||||||
|
/** Same as above but the version with the short data for language bindings where you have
|
||||||
|
* audio as array of shorts */
|
||||||
|
int vosk_recognizer_accept_waveform_s(VoskRecognizer *recognizer, const short *data, int length);
|
||||||
|
|
||||||
|
|
||||||
|
/** Same as above but the version with the float data for language bindings where you have
|
||||||
|
* audio as array of floats */
|
||||||
|
int vosk_recognizer_accept_waveform_f(VoskRecognizer *recognizer, const float *data, int length);
|
||||||
|
|
||||||
|
|
||||||
|
/** Returns speech recognition result
|
||||||
|
*
|
||||||
|
* @returns the result in JSON format which contains decoded line, decoded
|
||||||
|
* words, times in seconds and confidences. You can parse this result
|
||||||
|
* with any json parser
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* {
|
||||||
|
* "text" : "what zero zero zero one"
|
||||||
|
* }
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* If alternatives enabled it returns result with alternatives, see also vosk_recognizer_set_max_alternatives().
|
||||||
|
*
|
||||||
|
* If word times enabled returns word time, see also vosk_recognizer_set_word_times().
|
||||||
|
*/
|
||||||
|
const char *vosk_recognizer_result(VoskRecognizer *recognizer);
|
||||||
|
|
||||||
|
|
||||||
|
/** Returns partial speech recognition
|
||||||
|
*
|
||||||
|
* @returns partial speech recognition text which is not yet finalized.
|
||||||
|
* result may change as recognizer process more data.
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* {
|
||||||
|
* "partial" : "cyril one eight zero"
|
||||||
|
* }
|
||||||
|
* </pre>
|
||||||
|
*/
|
||||||
|
const char *vosk_recognizer_partial_result(VoskRecognizer *recognizer);
|
||||||
|
|
||||||
|
|
||||||
|
/** Returns speech recognition result. Same as result, but doesn't wait for silence
|
||||||
|
* You usually call it in the end of the stream to get final bits of audio. It
|
||||||
|
* flushes the feature pipeline, so all remaining audio chunks got processed.
|
||||||
|
*
|
||||||
|
* @returns speech result in JSON format.
|
||||||
|
*/
|
||||||
|
const char *vosk_recognizer_final_result(VoskRecognizer *recognizer);
|
||||||
|
|
||||||
|
|
||||||
|
/** Resets the recognizer
|
||||||
|
*
|
||||||
|
* Resets current results so the recognition can continue from scratch */
|
||||||
|
void vosk_recognizer_reset(VoskRecognizer *recognizer);
|
||||||
|
|
||||||
|
|
||||||
|
/** Releases recognizer object
|
||||||
|
*
|
||||||
|
* Underlying model is also unreferenced and if needed released */
|
||||||
|
void vosk_recognizer_free(VoskRecognizer *recognizer);
|
||||||
|
|
||||||
|
/** Set log level for Kaldi messages
|
||||||
|
*
|
||||||
|
* @param log_level the level
|
||||||
|
* 0 - default value to print info and error messages but no debug
|
||||||
|
* less than 0 - don't print info messages
|
||||||
|
* greather than 0 - more verbose mode
|
||||||
|
*/
|
||||||
|
void vosk_set_log_level(int log_level);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Init, automatically select a CUDA device and allow multithreading.
|
||||||
|
* Must be called once from the main thread.
|
||||||
|
* Has no effect if HAVE_CUDA flag is not set.
|
||||||
|
*/
|
||||||
|
void vosk_gpu_init();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Init CUDA device in a multi-threaded environment.
|
||||||
|
* Must be called for each thread.
|
||||||
|
* Has no effect if HAVE_CUDA flag is not set.
|
||||||
|
*/
|
||||||
|
void vosk_gpu_thread_init();
|
||||||
|
|
||||||
|
/** Creates the batch recognizer object
|
||||||
|
*
|
||||||
|
* @returns model object or NULL if problem occured */
|
||||||
|
VoskBatchModel *vosk_batch_model_new(const char *model_path);
|
||||||
|
|
||||||
|
/** Releases batch model object */
|
||||||
|
void vosk_batch_model_free(VoskBatchModel *model);
|
||||||
|
|
||||||
|
/** Wait for the processing */
|
||||||
|
void vosk_batch_model_wait(VoskBatchModel *model);
|
||||||
|
|
||||||
|
/** Creates batch recognizer object
|
||||||
|
* @returns recognizer object or NULL if problem occured */
|
||||||
|
VoskBatchRecognizer *vosk_batch_recognizer_new(VoskBatchModel *model, float sample_rate);
|
||||||
|
|
||||||
|
/** Releases batch recognizer object */
|
||||||
|
void vosk_batch_recognizer_free(VoskBatchRecognizer *recognizer);
|
||||||
|
|
||||||
|
/** Accept batch voice data */
|
||||||
|
void vosk_batch_recognizer_accept_waveform(VoskBatchRecognizer *recognizer, const char *data, int length);
|
||||||
|
|
||||||
|
/** Set NLSML output
|
||||||
|
* @param nlsml - boolean value
|
||||||
|
*/
|
||||||
|
void vosk_batch_recognizer_set_nlsml(VoskBatchRecognizer *recognizer, int nlsml);
|
||||||
|
|
||||||
|
/** Closes the stream */
|
||||||
|
void vosk_batch_recognizer_finish_stream(VoskBatchRecognizer *recognizer);
|
||||||
|
|
||||||
|
/** Return results */
|
||||||
|
const char *vosk_batch_recognizer_front_result(VoskBatchRecognizer *recognizer);
|
||||||
|
|
||||||
|
/** Release and free first retrieved result */
|
||||||
|
void vosk_batch_recognizer_pop(VoskBatchRecognizer *recognizer);
|
||||||
|
|
||||||
|
/** Get amount of pending chunks for more intelligent waiting */
|
||||||
|
int vosk_batch_recognizer_get_pending_chunks(VoskBatchRecognizer *recognizer);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* VOSK_API_H */
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
US English model for mobile Vosk applications
|
||||||
|
|
||||||
|
Copyright 2020 Alpha Cephei Inc
|
||||||
|
|
||||||
|
Accuracy: 10.38 (tedlium test) 9.85 (librispeech test-clean)
|
||||||
|
Speed: 0.11xRT (desktop)
|
||||||
|
Latency: 0.15s (right context)
|
||||||
|
|
||||||
|
|
||||||
Binary file not shown.
@@ -0,0 +1,7 @@
|
|||||||
|
--sample-frequency=16000
|
||||||
|
--use-energy=false
|
||||||
|
--num-mel-bins=40
|
||||||
|
--num-ceps=40
|
||||||
|
--low-freq=20
|
||||||
|
--high-freq=7600
|
||||||
|
--allow-downsample=true
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
--min-active=200
|
||||||
|
--max-active=3000
|
||||||
|
--beam=10.0
|
||||||
|
--lattice-beam=2.0
|
||||||
|
--acoustic-scale=1.0
|
||||||
|
--frame-subsampling-factor=3
|
||||||
|
--endpoint.silence-phones=1:2:3:4:5:6:7:8:9:10
|
||||||
|
--endpoint.rule2.min-trailing-silence=0.5
|
||||||
|
--endpoint.rule3.min-trailing-silence=0.75
|
||||||
|
--endpoint.rule4.min-trailing-silence=1.0
|
||||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,17 @@
|
|||||||
|
10015
|
||||||
|
10016
|
||||||
|
10017
|
||||||
|
10018
|
||||||
|
10019
|
||||||
|
10020
|
||||||
|
10021
|
||||||
|
10022
|
||||||
|
10023
|
||||||
|
10024
|
||||||
|
10025
|
||||||
|
10026
|
||||||
|
10027
|
||||||
|
10028
|
||||||
|
10029
|
||||||
|
10030
|
||||||
|
10031
|
||||||
@@ -0,0 +1,166 @@
|
|||||||
|
1 nonword
|
||||||
|
2 begin
|
||||||
|
3 end
|
||||||
|
4 internal
|
||||||
|
5 singleton
|
||||||
|
6 nonword
|
||||||
|
7 begin
|
||||||
|
8 end
|
||||||
|
9 internal
|
||||||
|
10 singleton
|
||||||
|
11 begin
|
||||||
|
12 end
|
||||||
|
13 internal
|
||||||
|
14 singleton
|
||||||
|
15 begin
|
||||||
|
16 end
|
||||||
|
17 internal
|
||||||
|
18 singleton
|
||||||
|
19 begin
|
||||||
|
20 end
|
||||||
|
21 internal
|
||||||
|
22 singleton
|
||||||
|
23 begin
|
||||||
|
24 end
|
||||||
|
25 internal
|
||||||
|
26 singleton
|
||||||
|
27 begin
|
||||||
|
28 end
|
||||||
|
29 internal
|
||||||
|
30 singleton
|
||||||
|
31 begin
|
||||||
|
32 end
|
||||||
|
33 internal
|
||||||
|
34 singleton
|
||||||
|
35 begin
|
||||||
|
36 end
|
||||||
|
37 internal
|
||||||
|
38 singleton
|
||||||
|
39 begin
|
||||||
|
40 end
|
||||||
|
41 internal
|
||||||
|
42 singleton
|
||||||
|
43 begin
|
||||||
|
44 end
|
||||||
|
45 internal
|
||||||
|
46 singleton
|
||||||
|
47 begin
|
||||||
|
48 end
|
||||||
|
49 internal
|
||||||
|
50 singleton
|
||||||
|
51 begin
|
||||||
|
52 end
|
||||||
|
53 internal
|
||||||
|
54 singleton
|
||||||
|
55 begin
|
||||||
|
56 end
|
||||||
|
57 internal
|
||||||
|
58 singleton
|
||||||
|
59 begin
|
||||||
|
60 end
|
||||||
|
61 internal
|
||||||
|
62 singleton
|
||||||
|
63 begin
|
||||||
|
64 end
|
||||||
|
65 internal
|
||||||
|
66 singleton
|
||||||
|
67 begin
|
||||||
|
68 end
|
||||||
|
69 internal
|
||||||
|
70 singleton
|
||||||
|
71 begin
|
||||||
|
72 end
|
||||||
|
73 internal
|
||||||
|
74 singleton
|
||||||
|
75 begin
|
||||||
|
76 end
|
||||||
|
77 internal
|
||||||
|
78 singleton
|
||||||
|
79 begin
|
||||||
|
80 end
|
||||||
|
81 internal
|
||||||
|
82 singleton
|
||||||
|
83 begin
|
||||||
|
84 end
|
||||||
|
85 internal
|
||||||
|
86 singleton
|
||||||
|
87 begin
|
||||||
|
88 end
|
||||||
|
89 internal
|
||||||
|
90 singleton
|
||||||
|
91 begin
|
||||||
|
92 end
|
||||||
|
93 internal
|
||||||
|
94 singleton
|
||||||
|
95 begin
|
||||||
|
96 end
|
||||||
|
97 internal
|
||||||
|
98 singleton
|
||||||
|
99 begin
|
||||||
|
100 end
|
||||||
|
101 internal
|
||||||
|
102 singleton
|
||||||
|
103 begin
|
||||||
|
104 end
|
||||||
|
105 internal
|
||||||
|
106 singleton
|
||||||
|
107 begin
|
||||||
|
108 end
|
||||||
|
109 internal
|
||||||
|
110 singleton
|
||||||
|
111 begin
|
||||||
|
112 end
|
||||||
|
113 internal
|
||||||
|
114 singleton
|
||||||
|
115 begin
|
||||||
|
116 end
|
||||||
|
117 internal
|
||||||
|
118 singleton
|
||||||
|
119 begin
|
||||||
|
120 end
|
||||||
|
121 internal
|
||||||
|
122 singleton
|
||||||
|
123 begin
|
||||||
|
124 end
|
||||||
|
125 internal
|
||||||
|
126 singleton
|
||||||
|
127 begin
|
||||||
|
128 end
|
||||||
|
129 internal
|
||||||
|
130 singleton
|
||||||
|
131 begin
|
||||||
|
132 end
|
||||||
|
133 internal
|
||||||
|
134 singleton
|
||||||
|
135 begin
|
||||||
|
136 end
|
||||||
|
137 internal
|
||||||
|
138 singleton
|
||||||
|
139 begin
|
||||||
|
140 end
|
||||||
|
141 internal
|
||||||
|
142 singleton
|
||||||
|
143 begin
|
||||||
|
144 end
|
||||||
|
145 internal
|
||||||
|
146 singleton
|
||||||
|
147 begin
|
||||||
|
148 end
|
||||||
|
149 internal
|
||||||
|
150 singleton
|
||||||
|
151 begin
|
||||||
|
152 end
|
||||||
|
153 internal
|
||||||
|
154 singleton
|
||||||
|
155 begin
|
||||||
|
156 end
|
||||||
|
157 internal
|
||||||
|
158 singleton
|
||||||
|
159 begin
|
||||||
|
160 end
|
||||||
|
161 internal
|
||||||
|
162 singleton
|
||||||
|
163 begin
|
||||||
|
164 end
|
||||||
|
165 internal
|
||||||
|
166 singleton
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,3 @@
|
|||||||
|
[
|
||||||
|
1.682383e+11 -1.1595e+10 -1.521733e+10 4.32034e+09 -2.257938e+10 -1.969666e+10 -2.559265e+10 -1.535687e+10 -1.276854e+10 -4.494483e+09 -1.209085e+10 -5.64008e+09 -1.134847e+10 -3.419512e+09 -1.079542e+10 -4.145463e+09 -6.637486e+09 -1.11318e+09 -3.479773e+09 -1.245932e+08 -1.386961e+09 6.560655e+07 -2.436518e+08 -4.032432e+07 4.620046e+08 -7.714964e+07 9.551484e+08 -4.119761e+08 8.208582e+08 -7.117156e+08 7.457703e+08 -4.3106e+08 1.202726e+09 2.904036e+08 1.231931e+09 3.629848e+08 6.366939e+08 -4.586172e+08 -5.267629e+08 -3.507819e+08 1.679838e+09
|
||||||
|
1.741141e+13 8.92488e+11 8.743834e+11 8.848896e+11 1.190313e+12 1.160279e+12 1.300066e+12 1.005678e+12 9.39335e+11 8.089614e+11 7.927041e+11 6.882427e+11 6.444235e+11 5.151451e+11 4.825723e+11 3.210106e+11 2.720254e+11 1.772539e+11 1.248102e+11 6.691599e+10 3.599804e+10 1.207574e+10 1.679301e+09 4.594778e+08 5.821614e+09 1.451758e+10 2.55803e+10 3.43277e+10 4.245286e+10 4.784859e+10 4.988591e+10 4.925451e+10 5.074584e+10 4.9557e+10 4.407876e+10 3.421443e+10 3.138606e+10 2.539716e+10 1.948134e+10 1.381167e+10 0 ]
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
# configuration file for apply-cmvn-online, used in the script ../local/run_online_decoding.sh
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
--left-context=3
|
||||||
|
--right-context=3
|
||||||
Reference in New Issue
Block a user