Vosk
Safe FFI bindings around the Vosk API Speech Recognition Toolkit.
Usage
// Simplified version of examples/read_wav.rs
// Normally you would not want to hardcode the audio samples
let samples = vec!;
let model_path = "/path/to/model";
let model = new.unwrap;
let mut recognizer = new.unwrap;
recognizer.set_max_alternatives;
recognizer.set_words;
recognizer.set_partial_words;
for sample in samples.chunks
println!;
Setup
Compilation
The Vosk-API libraries have to be discoverable by the rust linker. Download the zip file containing the dynamic libraries for your platform here. For iOS development you have to use static libraries. Get the static libraries from the vosk-api team.
Using dynamic libraries
Do either of the following:
- Recommended: Create a build script and provide cargo with the path to the libraries
- Use the
RUSTFLAGSenvironment variable to provide the path to the variables like so:RUSTFLAGS=-L/path/to/the/librarieswithcargo:rustc-link-searchorcargo:rustc-link-lib. - Make the vosk library accessible system or user-wide:
- Windows: Move the libraries to a directory in your
PATHenvironment variable. - Linux: Move them to
/usr/local/lib,/usr/libor set theLIBRARY_PATHenvironment variable to the directory containing the libraries.
- Windows: Move the libraries to a directory in your
Although the approaches are equivalent, using a build script is more convenient because it does not require the developer to remember a terminal command or change anything outside the project scope.
Using static libraries (macOS-only, targeting iOS)
- Extract the correct non-fat file (also called thin file) from the static fat file (libvosk.a) for each architecture you would like to support.
- Mark your crate type as
staticlib. - Create a build script and provide cargo with the path to the libraries with
cargo:rustc-link-search=andcargo:rustc-link-lib=static=.
Troubleshooting
In real-world scenarios, one will use Rust to cross compile a library (e.g. Android and iOS). Therefore, we need both cdylib as well as the staticlib as crate-type. If you compile as usual with cargo build (e.g.: cargo build --target aarch64-apple-ios --release) it will not work, because cargo tries to build the dylib as well. Fortunately, since rust 1.64. there is a new option for rustc in the stable channel. Because of this, the following will work: cargo rustc --crate-type staticlib --lib --target aarch64-apple-ios --release
Execution
Executables compiled with a dynamic lib must have access to the vosk library at runtime. Executables compiled with a statically compiled library do not.
Using dynamic libraries
Do either of the following:
- Recommended: Copy the libraries to the root of the executable
(
target/<cargo profile name>by default). It is recommended that you use a tool such as cargo-make to automate moving the libraries from another, more practical, directory to the destination during build. - Make the vosk library accessible system or user-wide:
- Windows: Move the libraries to a directory in your
PATHenvironment variable. - Linux: Move them to
/usr/local/lib,/usr/libor set theLD_LIBRARY_PATHenvironment variable to the directory containing the libraries. Note:LD_LIBRARY_PATHis not the same asLIBRARY_PATHmentioned in the compilation step.
- Windows: Move the libraries to a directory in your
Using static libraries (iOS-only)
- Add the compiled .a library (or libraries if you would like to support more than one architecture) to your iOS project
- Set
Enable Bitcodeto no for your target - Add the
Accelerate Frameworkfrom the iOS SDK to your project - Depending on your library and use case, you have to write some C -> Objective-C -> Swift glue code.