Initial commit

This commit is contained in:
Uttarayan Mondal
2021-05-29 21:56:42 +05:30
commit 3c79d27450
6 changed files with 536 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
/target
Generated
+283
View File
@@ -0,0 +1,283 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
[[package]]
name = "bitflags"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "ctor"
version = "0.1.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5e98e2ad1a782e33928b96fc3948e7c355e5af34ba4de7670fe8bac2a3b2006d"
dependencies = [
"quote",
"syn",
]
[[package]]
name = "ghost"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a5bcf1bbeab73aa4cf2fde60a846858dc036163c7c33bec309f8d17de785479"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "google_speech"
version = "0.1.0"
dependencies = [
"pyo3",
]
[[package]]
name = "indoc"
version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "47741a8bc60fb26eb8d6e0238bbb26d8575ff623fdc97b1a2c00c050b9684ed8"
dependencies = [
"indoc-impl",
"proc-macro-hack",
]
[[package]]
name = "indoc-impl"
version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ce046d161f000fffde5f432a0d034d0341dc152643b2598ed5bfce44c4f3a8f0"
dependencies = [
"proc-macro-hack",
"proc-macro2",
"quote",
"syn",
"unindent",
]
[[package]]
name = "instant"
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec"
dependencies = [
"cfg-if",
]
[[package]]
name = "inventory"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0f0f7efb804ec95e33db9ad49e4252f049e37e8b0a4652e3cd61f7999f2eff7f"
dependencies = [
"ctor",
"ghost",
"inventory-impl",
]
[[package]]
name = "inventory-impl"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75c094e94816723ab936484666968f5b58060492e880f3c8d00489a1e244fa51"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "libc"
version = "0.2.95"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "789da6d93f1b866ffe175afc5322a4d76c038605a1c3319bb57b06967ca98a36"
[[package]]
name = "lock_api"
version = "0.4.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0382880606dff6d15c9476c416d18690b72742aa7b605bb6dd6ec9030fbf07eb"
dependencies = [
"scopeguard",
]
[[package]]
name = "parking_lot"
version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb"
dependencies = [
"instant",
"lock_api",
"parking_lot_core",
]
[[package]]
name = "parking_lot_core"
version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018"
dependencies = [
"cfg-if",
"instant",
"libc",
"redox_syscall",
"smallvec",
"winapi",
]
[[package]]
name = "paste"
version = "0.1.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "45ca20c77d80be666aef2b45486da86238fabe33e38306bd3118fe4af33fa880"
dependencies = [
"paste-impl",
"proc-macro-hack",
]
[[package]]
name = "paste-impl"
version = "0.1.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d95a7db200b97ef370c8e6de0088252f7e0dfff7d047a28528e47456c0fc98b6"
dependencies = [
"proc-macro-hack",
]
[[package]]
name = "proc-macro-hack"
version = "0.5.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5"
[[package]]
name = "proc-macro2"
version = "1.0.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038"
dependencies = [
"unicode-xid",
]
[[package]]
name = "pyo3"
version = "0.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4837b8e8e18a102c23f79d1e9a110b597ea3b684c95e874eb1ad88f8683109c3"
dependencies = [
"cfg-if",
"ctor",
"indoc",
"inventory",
"libc",
"parking_lot",
"paste",
"pyo3-macros",
"unindent",
]
[[package]]
name = "pyo3-macros"
version = "0.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a47f2c300ceec3e58064fd5f8f5b61230f2ffd64bde4970c81fdd0563a2db1bb"
dependencies = [
"pyo3-macros-backend",
"quote",
"syn",
]
[[package]]
name = "pyo3-macros-backend"
version = "0.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87b097e5d84fcbe3e167f400fbedd657820a375b034c78bd852050749a575d66"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "quote"
version = "1.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7"
dependencies = [
"proc-macro2",
]
[[package]]
name = "redox_syscall"
version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "742739e41cd49414de871ea5e549afb7e2a3ac77b589bcbebe8c82fab37147fc"
dependencies = [
"bitflags",
]
[[package]]
name = "scopeguard"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
[[package]]
name = "smallvec"
version = "1.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e"
[[package]]
name = "syn"
version = "1.0.72"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1e8cdbefb79a9a5a65e0db8b47b723ee907b7c7f8496c76a1770b5c310bab82"
dependencies = [
"proc-macro2",
"quote",
"unicode-xid",
]
[[package]]
name = "unicode-xid"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
[[package]]
name = "unindent"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f14ee04d9415b52b3aeab06258a3f07093182b88ba0f9b8d203f211a7a7d41c7"
[[package]]
name = "winapi"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
dependencies = [
"winapi-i686-pc-windows-gnu",
"winapi-x86_64-pc-windows-gnu",
]
[[package]]
name = "winapi-i686-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
[[package]]
name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+10
View File
@@ -0,0 +1,10 @@
[package]
name = "google_speech"
version = "0.1.0"
authors = ["Uttarayan Mondal <uttarayan21@gmail.com>"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
pyo3 = "0.13.2"
+2
View File
@@ -0,0 +1,2 @@
pub mod tts;
pub use tts::{Lang, Speech};
+220
View File
@@ -0,0 +1,220 @@
use pyo3::prelude::*;
use pyo3::types::IntoPyDict;
#[derive(Debug)]
pub struct Speech {
pyobject_speech: PyObject,
}
impl Speech {
/// Create a new speech object with language
pub fn new<S: AsRef<str>>(text: S, lang: Lang) -> PyResult<Self> {
Python::with_gil(|py| {
let google_speech = PyModule::import(py, "google_speech").unwrap();
let pyobject_speech: PyObject = google_speech
.call1("Speech", (text.as_ref(), lang.to_string()))
.unwrap()
.extract()
.unwrap();
Ok(Self { pyobject_speech })
})
}
/// Play the speech object
pub fn play(&self) -> PyResult<()> {
Python::with_gil(|py| {
self.pyobject_speech.call_method0(py, "play")?;
Ok(())
})
}
/// # Safety
/// The save function is a wrapper around google_speech.Speech.save
/// which might be unsafe
pub unsafe fn save<S: AsRef<str>>(&self, path: S) -> PyResult<()> {
Python::with_gil(|py| {
self.pyobject_speech
.call_method1(py, "save", (path.as_ref(),))?;
Ok(())
})
}
// /// Change the language
// pub fn lang(&mut self, lang: Lang) -> PyResult<()> {
// Python::with_gil(|py| {
// // self.pyobject_speech.getattr
// // let globals = PyDict::
// Python::run(
// py,
// // &format!("speech.lang = \"{}\"", lang.to_string()),
// &format!("print(\"{}\")", lang.to_string()),
// Some(vec![("speech", lang.to_string().as_str())].into_py_dict(py)),
// None,
// )?;
// println!("{:?}", self.pyobject_speech);
// Ok(())
// })
// }
}
#[allow(non_camel_case_types)]
#[derive(Debug)]
#[non_exhaustive]
pub enum Lang {
af,
ar,
bn,
bs,
ca,
cs,
cy,
da,
de,
el,
en,
en_au,
en_ca,
en_gb,
en_gh,
en_ie,
en_in,
en_ng,
en_nz,
en_ph,
en_tz,
en_uk,
en_us,
en_za,
eo,
es,
es_es,
es_us,
et,
fi,
fr,
fr_ca,
fr_fr,
hi,
hr,
hu,
hy,
id,
is,
it,
ja,
jw,
km,
ko,
la,
lv,
mk,
ml,
mr,
my,
ne,
nl,
no,
pl,
pt,
pt_br,
pt_pt,
ro,
ru,
si,
sk,
sq,
sr,
su,
sv,
sw,
ta,
te,
th,
tl,
tr,
uk,
vi,
zh_cn,
zh_tw,
}
impl ToString for Lang {
fn to_string(&self) -> String {
let ret = match self {
Lang::af => "af",
Lang::ar => "ar",
Lang::bn => "bn",
Lang::bs => "bs",
Lang::ca => "ca",
Lang::cs => "cs",
Lang::cy => "cy",
Lang::da => "da",
Lang::de => "de",
Lang::el => "el",
Lang::en => "en",
Lang::en_au => "en-au",
Lang::en_ca => "en-ca",
Lang::en_gb => "en-gb",
Lang::en_gh => "en-gh",
Lang::en_ie => "en-ie",
Lang::en_in => "en-in",
Lang::en_ng => "en-ng",
Lang::en_nz => "en-nz",
Lang::en_ph => "en-ph",
Lang::en_tz => "en-tz",
Lang::en_uk => "en-uk",
Lang::en_us => "en-us",
Lang::en_za => "en-za",
Lang::eo => "eo",
Lang::es => "es",
Lang::es_es => "es-es",
Lang::es_us => "es-us",
Lang::et => "et",
Lang::fi => "fi",
Lang::fr => "fr",
Lang::fr_ca => "fr-ca",
Lang::fr_fr => "fr-fr",
Lang::hi => "hi",
Lang::hr => "hr",
Lang::hu => "hu",
Lang::hy => "hy",
Lang::id => "id",
Lang::is => "is",
Lang::it => "it",
Lang::ja => "ja",
Lang::jw => "jw",
Lang::km => "km",
Lang::ko => "ko",
Lang::la => "la",
Lang::lv => "lv",
Lang::mk => "mk",
Lang::ml => "ml",
Lang::mr => "mr",
Lang::my => "my",
Lang::ne => "ne",
Lang::nl => "nl",
Lang::no => "no",
Lang::pl => "pl",
Lang::pt => "pt",
Lang::pt_br => "pt-br",
Lang::pt_pt => "pt-pt",
Lang::ro => "ro",
Lang::ru => "ru",
Lang::si => "si",
Lang::sk => "sk",
Lang::sq => "sq",
Lang::sr => "sr",
Lang::su => "su",
Lang::sv => "sv",
Lang::sw => "sw",
Lang::ta => "ta",
Lang::te => "te",
Lang::th => "th",
Lang::tl => "tl",
Lang::tr => "tr",
Lang::uk => "uk",
Lang::vi => "vi",
Lang::zh_cn => "zh-cn",
Lang::zh_tw => "zh-tw",
};
ret.to_string()
}
}
+20
View File
@@ -0,0 +1,20 @@
use google_speech::{Lang, Speech};
#[test]
fn test_hello_play() {
let hello = Speech::new("Hello", Lang::en_us).unwrap();
hello.play().unwrap();
}
#[test]
fn test_hello_save() {
let hello = Speech::new("Hello", Lang::en_us).unwrap();
unsafe { hello.save("target/hello.mp3").unwrap() };
}
// #[test]
// fn test_hello_lang() {
// let mut hello = Speech::new("Hello", Lang::af).unwrap();
// hello.play().unwrap();
// hello.lang(Lang::en_us).unwrap();
// hello.play().unwrap();
// }