mirror of https://github.com/ndarilek/tts-rs.git
parent
25f8211661
commit
153075ebab
|
@ -12,4 +12,16 @@ script = [
|
||||||
|
|
||||||
[tasks.log-android]
|
[tasks.log-android]
|
||||||
command = "adb"
|
command = "adb"
|
||||||
args = ["logcat", "RustStdoutStderr:D", "*:S"]
|
args = ["logcat", "RustStdoutStderr:D", "*:S"]
|
||||||
|
|
||||||
|
[tasks.install-trunk]
|
||||||
|
install_crate = { crate_name = "trunk", binary = "trunk", test_arg = "--help" }
|
||||||
|
|
||||||
|
[tasks.install-wasm-bindgen-cli]
|
||||||
|
install_crate = { crate_name = "wasm-bindgen-cli", binary = "wasm-bindgen", test_arg = "--help" }
|
||||||
|
|
||||||
|
[tasks.run-web-example]
|
||||||
|
dependencies = ["install-trunk", "install-wasm-bindgen-cli"]
|
||||||
|
cwd = "examples/web"
|
||||||
|
command = "trunk"
|
||||||
|
args = ["serve"]
|
|
@ -0,0 +1,2 @@
|
||||||
|
[build]
|
||||||
|
target = "wasm32-unknown-unknown"
|
|
@ -0,0 +1 @@
|
||||||
|
dist
|
|
@ -0,0 +1,11 @@
|
||||||
|
[package]
|
||||||
|
name = "web"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Nolan Darilek <nolan@thewordnerd.info>"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
seed = "0.8"
|
||||||
|
tts = { path = "../.." }
|
|
@ -0,0 +1,12 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>Example</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div id="app"></div>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
|
@ -0,0 +1,111 @@
|
||||||
|
#![allow(clippy::wildcard_imports)]
|
||||||
|
use seed::{prelude::*, *};
|
||||||
|
|
||||||
|
use tts::TTS;
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
struct Model {
|
||||||
|
text: String,
|
||||||
|
tts: TTS,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
enum Msg {
|
||||||
|
TextChanged(String),
|
||||||
|
RateChanged(String),
|
||||||
|
PitchChanged(String),
|
||||||
|
VolumeChanged(String),
|
||||||
|
Speak,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn init(_: Url, _: &mut impl Orders<Msg>) -> Model {
|
||||||
|
let tts = TTS::default().unwrap();
|
||||||
|
Model {
|
||||||
|
text: Default::default(),
|
||||||
|
tts,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn update(msg: Msg, model: &mut Model, _: &mut impl Orders<Msg>) {
|
||||||
|
use Msg::*;
|
||||||
|
match msg {
|
||||||
|
TextChanged(text) => model.text = text,
|
||||||
|
RateChanged(rate) => {
|
||||||
|
let rate = rate.parse::<f32>().unwrap();
|
||||||
|
model.tts.set_rate(rate).unwrap();
|
||||||
|
}
|
||||||
|
PitchChanged(pitch) => {
|
||||||
|
let pitch = pitch.parse::<f32>().unwrap();
|
||||||
|
model.tts.set_pitch(pitch).unwrap();
|
||||||
|
}
|
||||||
|
VolumeChanged(volume) => {
|
||||||
|
let volume = volume.parse::<f32>().unwrap();
|
||||||
|
model.tts.set_volume(volume).unwrap();
|
||||||
|
}
|
||||||
|
Speak => {
|
||||||
|
model.tts.speak(&model.text, false).unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn view(model: &Model) -> Node<Msg> {
|
||||||
|
form![
|
||||||
|
div![label![
|
||||||
|
"Text to speak",
|
||||||
|
input![
|
||||||
|
attrs! {
|
||||||
|
At::Value => model.text,
|
||||||
|
At::AutoFocus => AtValue::None,
|
||||||
|
},
|
||||||
|
input_ev(Ev::Input, Msg::TextChanged)
|
||||||
|
],
|
||||||
|
],],
|
||||||
|
div![label![
|
||||||
|
"Rate",
|
||||||
|
input![
|
||||||
|
attrs! {
|
||||||
|
At::Type => "number",
|
||||||
|
At::Value => model.tts.get_rate().unwrap(),
|
||||||
|
At::Min => model.tts.min_rate(),
|
||||||
|
At::Max => model.tts.max_rate()
|
||||||
|
},
|
||||||
|
input_ev(Ev::Input, Msg::RateChanged)
|
||||||
|
],
|
||||||
|
],],
|
||||||
|
div![label![
|
||||||
|
"Pitch",
|
||||||
|
input![
|
||||||
|
attrs! {
|
||||||
|
At::Type => "number",
|
||||||
|
At::Value => model.tts.get_pitch().unwrap(),
|
||||||
|
At::Min => model.tts.min_pitch(),
|
||||||
|
At::Max => model.tts.max_pitch()
|
||||||
|
},
|
||||||
|
input_ev(Ev::Input, Msg::PitchChanged)
|
||||||
|
],
|
||||||
|
],],
|
||||||
|
div![label![
|
||||||
|
"Volume",
|
||||||
|
input![
|
||||||
|
attrs! {
|
||||||
|
At::Type => "number",
|
||||||
|
At::Value => model.tts.get_volume().unwrap(),
|
||||||
|
At::Min => model.tts.min_volume(),
|
||||||
|
At::Max => model.tts.max_volume()
|
||||||
|
},
|
||||||
|
input_ev(Ev::Input, Msg::VolumeChanged)
|
||||||
|
],
|
||||||
|
],],
|
||||||
|
button![
|
||||||
|
"Speak",
|
||||||
|
ev(Ev::Click, |e| {
|
||||||
|
e.prevent_default();
|
||||||
|
Msg::Speak
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
App::start("app", init, update, view);
|
||||||
|
}
|
Loading…
Reference in New Issue