diff --git a/Cargo.lock b/Cargo.lock index 8d6b88d..ec79b71 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -89,7 +89,7 @@ checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.77", ] [[package]] @@ -359,7 +359,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn", + "syn 2.0.77", ] [[package]] @@ -370,7 +370,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.77", ] [[package]] @@ -391,7 +391,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 2.0.77", ] [[package]] @@ -401,7 +401,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4abae7035bf79b9877b779505d8cf3749285b80c43941eda66604841889451dc" dependencies = [ "derive_builder_core", - "syn", + "syn 2.0.77", ] [[package]] @@ -537,6 +537,12 @@ dependencies = [ "log", ] +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + [[package]] name = "errno" version = "0.3.9" @@ -669,6 +675,12 @@ dependencies = [ "crunchy", ] +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + [[package]] name = "heck" version = "0.5.0" @@ -791,6 +803,17 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "indexmap" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" +dependencies = [ + "equivalent", + "hashbrown", + "serde", +] + [[package]] name = "indicatif" version = "0.17.8" @@ -1281,7 +1304,7 @@ checksum = "a7ce64b975ed4f123575d11afd9491f2e37bbd5813fbfbc0f09ae1fbddea74e0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.77", ] [[package]] @@ -1478,7 +1501,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn", + "syn 2.0.77", ] [[package]] @@ -1507,7 +1530,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.77", ] [[package]] @@ -1552,6 +1575,30 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + [[package]] name = "proc-macro2" version = "1.0.86" @@ -1609,7 +1656,7 @@ dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", - "syn", + "syn 2.0.77", ] [[package]] @@ -1622,7 +1669,7 @@ dependencies = [ "proc-macro2", "pyo3-build-config", "quote", - "syn", + "syn 2.0.77", ] [[package]] @@ -1829,6 +1876,7 @@ dependencies = [ "sbv2_core", "serde", "tokio", + "utoipa", ] [[package]] @@ -1886,7 +1934,7 @@ checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.77", ] [[package]] @@ -2025,7 +2073,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn", + "syn 2.0.77", ] [[package]] @@ -2034,6 +2082,16 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.77" @@ -2091,7 +2149,7 @@ checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.77", ] [[package]] @@ -2167,7 +2225,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.77", ] [[package]] @@ -2332,6 +2390,31 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "utoipa" +version = "4.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5afb1a60e207dca502682537fefcfd9921e71d0b83e9576060f09abc6efab23" +dependencies = [ + "indexmap", + "serde", + "serde_json", + "utoipa-gen", +] + +[[package]] +name = "utoipa-gen" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bf0e16c02bc4bf5322ab65f10ab1149bdbcaa782cba66dc7057370a3f8190be" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "regex", + "syn 2.0.77", +] + [[package]] name = "version_check" version = "0.9.5" @@ -2492,7 +2575,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.77", ] [[package]] diff --git a/sbv2_api/Cargo.toml b/sbv2_api/Cargo.toml index a49e149..01b4a3a 100644 --- a/sbv2_api/Cargo.toml +++ b/sbv2_api/Cargo.toml @@ -12,6 +12,7 @@ log = "0.4.22" sbv2_core = { version = "0.2.0-alpha", path = "../sbv2_core" } serde = { version = "1.0.210", features = ["derive"] } tokio = { version = "1.40.0", features = ["full"] } +utoipa = { version = "4.2.3", features = ["axum_extras"] } [features] coreml = ["sbv2_core/coreml"] @@ -19,4 +20,4 @@ cuda = ["sbv2_core/cuda"] cuda_tf32 = ["sbv2_core/cuda_tf32"] dynamic = ["sbv2_core/dynamic"] directml = ["sbv2_core/directml"] -tensorrt = ["sbv2_core/tensorrt"] \ No newline at end of file +tensorrt = ["sbv2_core/tensorrt"] diff --git a/sbv2_api/src/main.rs b/sbv2_api/src/main.rs index 5a82a1e..e94a625 100644 --- a/sbv2_api/src/main.rs +++ b/sbv2_api/src/main.rs @@ -11,10 +11,36 @@ use std::env; use std::sync::Arc; use tokio::fs; use tokio::sync::Mutex; +use utoipa::{OpenApi, ToSchema}; mod error; use crate::error::AppResult; +#[derive(OpenApi)] +#[openapi( + paths(openapi, models, synthesize), + components(schemas(SynthesizeRequest)) +)] +struct ApiDoc; + +#[utoipa::path( + get, + path = "/docs/openapi.json", + responses( + (status = 200, description = "JSON file", body = ()) + ) +)] +async fn openapi() -> Json { + Json(ApiDoc::openapi()) +} + +#[utoipa::path( + get, + path = "/models", + responses( + (status = 200, description = "Return model list", body = Vec), + ) +)] async fn models(State(state): State) -> AppResult { Ok(Json(state.tts_model.lock().await.models())) } @@ -27,7 +53,7 @@ fn length_default() -> f32 { 1.0 } -#[derive(Deserialize)] +#[derive(Deserialize, ToSchema)] struct SynthesizeRequest { text: String, ident: String, @@ -37,6 +63,14 @@ struct SynthesizeRequest { length_scale: f32, } +#[utoipa::path( + post, + path = "/synthesize", + request_body = SynthesizeRequest, + responses( + (status = 200, description = "Return audio/wav", body = Vec) + ) +)] async fn synthesize( State(state): State, Json(SynthesizeRequest {