Initial commit
This commit is contained in:
commit
33b7959fab
9 changed files with 2333 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
/target
|
1143
Cargo.lock
generated
Normal file
1143
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
47
Cargo.toml
Normal file
47
Cargo.toml
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
[package]
|
||||||
|
name = "gst-plugin-vosk"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
authors = ["Rafael Caricio <rafael@caricio.com>"]
|
||||||
|
repository = ""
|
||||||
|
license = "MPL-2.0"
|
||||||
|
description = "plugin"
|
||||||
|
build = "build.rs"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
gst = { package = "gstreamer", version = "0.18" }
|
||||||
|
gstreamer-base = "0.18"
|
||||||
|
once_cell = "1"
|
||||||
|
atomic_refcell = "0.1"
|
||||||
|
serde = "1"
|
||||||
|
serde_derive = "1"
|
||||||
|
serde_json = "1"
|
||||||
|
futures = "0.3"
|
||||||
|
tokio = { version = "1.0", features = [ "rt-multi-thread", "time" ] }
|
||||||
|
async-tungstenite = { version = "0.17", features = ["tokio", "tokio-runtime", "tokio-native-tls"] }
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
gst-plugin-version-helper = "0.7.3"
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
name = "gstvosk"
|
||||||
|
crate-type = ["cdylib", "rlib"]
|
||||||
|
path = "src/lib.rs"
|
||||||
|
|
||||||
|
[features]
|
||||||
|
# GStreamer 1.14 is required for static linking
|
||||||
|
static = ["gst/v1_14"]
|
||||||
|
capi = []
|
||||||
|
|
||||||
|
[package.metadata.capi]
|
||||||
|
min_version = "0.8.0"
|
||||||
|
|
||||||
|
[package.metadata.capi.header]
|
||||||
|
enabled = false
|
||||||
|
|
||||||
|
[package.metadata.capi.library]
|
||||||
|
install_subdir = "gstreamer-1.0"
|
||||||
|
versioning = false
|
||||||
|
|
||||||
|
[package.metadata.capi.pkg_config]
|
||||||
|
requires_private = "gstreamer-1.0, gstreamer-base-1.0, gobject-2.0, glib-2.0, gmodule-2.0"
|
5
README.md
Normal file
5
README.md
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
Vosk Speech Recognition GStreamer Plugin
|
||||||
|
========================================
|
||||||
|
|
||||||
|
Transcription of speech using [Vosk Toolkit](https://alphacephei.com/vosk/). Can be used to generate subtitles for
|
||||||
|
videos, transcription of audio notes, etc.
|
3
build.rs
Normal file
3
build.rs
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
fn main() {
|
||||||
|
gst_plugin_version_helper::info()
|
||||||
|
}
|
29
src/lib.rs
Normal file
29
src/lib.rs
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
// Copyright (C) 2022 Rafael Caricio <rafael@caricio.com>
|
||||||
|
//
|
||||||
|
// This Source Code Form is subject to the terms of the Mozilla Public License, v2.0.
|
||||||
|
// If a copy of the MPL was not distributed with this file, You can obtain one at
|
||||||
|
// <https://mozilla.org/MPL/2.0/>.
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
|
use gst::glib;
|
||||||
|
|
||||||
|
mod transcriber;
|
||||||
|
mod vosk_client;
|
||||||
|
|
||||||
|
fn plugin_init(plugin: &gst::Plugin) -> Result<(), glib::BoolError> {
|
||||||
|
transcriber::register(plugin)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
gst::plugin_define!(
|
||||||
|
vosktranscriber,
|
||||||
|
env!("CARGO_PKG_DESCRIPTION"),
|
||||||
|
plugin_init,
|
||||||
|
concat!(env!("CARGO_PKG_VERSION"), "-", env!("COMMIT_ID")),
|
||||||
|
"MPL",
|
||||||
|
env!("CARGO_PKG_NAME"),
|
||||||
|
env!("CARGO_PKG_NAME"),
|
||||||
|
env!("CARGO_PKG_REPOSITORY"),
|
||||||
|
env!("BUILD_REL_DATE")
|
||||||
|
);
|
1042
src/transcriber/imp.rs
Normal file
1042
src/transcriber/imp.rs
Normal file
File diff suppressed because it is too large
Load diff
28
src/transcriber/mod.rs
Normal file
28
src/transcriber/mod.rs
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
// Copyright (C) 2022 Rafael Caricio <rafael@caricio.com>
|
||||||
|
//
|
||||||
|
// This Source Code Form is subject to the terms of the Mozilla Public License, v2.0.
|
||||||
|
// If a copy of the MPL was not distributed with this file, You can obtain one at
|
||||||
|
// <https://mozilla.org/MPL/2.0/>.
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
|
use glib::prelude::*;
|
||||||
|
use gst::glib;
|
||||||
|
|
||||||
|
mod imp;
|
||||||
|
|
||||||
|
glib::wrapper! {
|
||||||
|
pub struct Transcriber(ObjectSubclass<imp::Transcriber>) @extends gst::Element, gst::Object;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe impl Send for Transcriber {}
|
||||||
|
unsafe impl Sync for Transcriber {}
|
||||||
|
|
||||||
|
pub fn register(plugin: &gst::Plugin) -> Result<(), glib::BoolError> {
|
||||||
|
gst::Element::register(
|
||||||
|
Some(plugin),
|
||||||
|
"vosk_transcriber",
|
||||||
|
gst::Rank::None,
|
||||||
|
Transcriber::static_type(),
|
||||||
|
)
|
||||||
|
}
|
35
src/vosk_client/mod.rs
Normal file
35
src/vosk_client/mod.rs
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
use serde_derive::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
#[derive(Deserialize, Serialize, Debug)]
|
||||||
|
pub struct Configuration {
|
||||||
|
/// Sample rate the audio will be provided at.
|
||||||
|
sample_rate: i32,
|
||||||
|
|
||||||
|
/// Show time ranges of each word in the transcription.
|
||||||
|
words: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Configuration {
|
||||||
|
pub fn new(sample_rate: i32) -> Self {
|
||||||
|
Self {
|
||||||
|
sample_rate,
|
||||||
|
// We always want to receive the words with their time ranges.
|
||||||
|
words: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Serialize, Debug)]
|
||||||
|
pub struct Transcript {
|
||||||
|
pub result: Vec<WordInfo>,
|
||||||
|
pub text: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Serialize, Debug)]
|
||||||
|
pub struct WordInfo {
|
||||||
|
#[serde(rename = "conf")]
|
||||||
|
pub confidence: f64,
|
||||||
|
pub word: String,
|
||||||
|
pub start: f64,
|
||||||
|
pub end: f64,
|
||||||
|
}
|
Loading…
Reference in a new issue