From 8199769093f4d7df97cb079108f98706a8a668cd Mon Sep 17 00:00:00 2001 From: feie9456 Date: Sun, 29 Mar 2026 01:19:51 +0800 Subject: [PATCH] Initial commit --- .gitignore | 1 + Cargo.lock | 1762 ++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 26 + README.md | 79 ++ assets/idle.ico | Bin 0 -> 91749 bytes assets/recording.ico | Bin 0 -> 113196 bytes assets/start.mp3 | Bin 0 -> 5228 bytes assets/stop.mp3 | Bin 0 -> 5612 bytes build.rs | 7 + convert_icon.py | 6 + src/audio.rs | 140 ++++ src/config.rs | 116 +++ src/input.rs | 139 ++++ src/main.rs | 679 ++++++++++++++++ src/session.rs | 99 +++ src/sound.rs | 31 + src/ws.rs | 230 ++++++ 17 files changed, 3315 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 README.md create mode 100644 assets/idle.ico create mode 100644 assets/recording.ico create mode 100644 assets/start.mp3 create mode 100644 assets/stop.mp3 create mode 100644 build.rs create mode 100644 convert_icon.py create mode 100644 src/audio.rs create mode 100644 src/config.rs create mode 100644 src/input.rs create mode 100644 src/main.rs create mode 100644 src/session.rs create mode 100644 src/sound.rs create mode 100644 src/ws.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..c8944fe --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,1762 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "alsa" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed7572b7ba83a31e20d1b48970ee402d2e3e0537dcfe0a3ff4d6eb7508617d43" +dependencies = [ + "alsa-sys", + "bitflags 2.11.0", + "cfg-if", + "libc", +] + +[[package]] +name = "alsa-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bindgen" +version = "0.72.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" +dependencies = [ + "bitflags 2.11.0", + "cexpr", + "clang-sys", + "itertools", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" + +[[package]] +name = "cc" +version = "1.2.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1e928d4b69e3077709075a938a05ffbedfa53a84c8f766efbf8220bb1ff60e1" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "claxon" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bfbf56724aa9eca8afa4fcfadeb479e722935bb2a0900c2d37e0cc477af0688" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "coreaudio-rs" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace" +dependencies = [ + "bitflags 1.3.2", + "core-foundation-sys", + "coreaudio-sys", +] + +[[package]] +name = "coreaudio-sys" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ceec7a6067e62d6f931a2baf6f3a751f4a892595bcec1461a3c94ef9949864b6" +dependencies = [ + "bindgen", +] + +[[package]] +name = "cpal" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "873dab07c8f743075e57f524c583985fbaf745602acbe916a01539364369a779" +dependencies = [ + "alsa", + "core-foundation-sys", + "coreaudio-rs", + "dasp_sample", + "jni", + "js-sys", + "libc", + "mach2", + "ndk", + "ndk-context", + "oboe", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows 0.54.0", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "dasp_sample" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" + +[[package]] +name = "data-encoding" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-core", + "futures-macro", + "futures-sink", + "futures-task", + "pin-project-lite", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[package]] +name = "hound" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62adaabb884c94955b19907d60019f4e145d091c75345379e70d1ee696f7854f" + +[[package]] +name = "http" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "indexmap" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys 0.3.1", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc4c90f45aa2e6eacbe8645f77fdea542ac97a494bcd117a67df9ff4d611f995" +dependencies = [ + "cfg-if", + "futures-util", + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "lewton" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "777b48df9aaab155475a83a7df3070395ea1ac6902f5cd062b8f2b028075c030" +dependencies = [ + "byteorder", + "ogg", + "tinyvec", +] + +[[package]] +name = "libc" +version = "0.2.183" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" + +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link 0.2.1", +] + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "mach2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d640282b302c0bb0a2a8e0233ead9035e3bed871f0b7e81fe4a1ec829765db44" +dependencies = [ + "libc", +] + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "mio" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "native-tls" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "ndk" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" +dependencies = [ + "bitflags 2.11.0", + "jni-sys 0.3.1", + "log", + "ndk-sys", + "num_enum", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.5.0+25.2.9519653" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" +dependencies = [ + "jni-sys 0.3.1", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "oboe" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8b61bebd49e5d43f5f8cc7ee2891c16e0f41ec7954d36bcb6c14c5e0de867fb" +dependencies = [ + "jni", + "ndk", + "ndk-context", + "num-derive", + "num-traits", + "oboe-sys", +] + +[[package]] +name = "oboe-sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8bb09a4a2b1d668170cfe0a7d5bc103f8999fb316c98099b6a9939c9f2e79d" +dependencies = [ + "cc", +] + +[[package]] +name = "ogg" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6951b4e8bf21c8193da321bcce9c9dd2e13c858fe078bf9054a288b419ae5d6e" +dependencies = [ + "byteorder", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "openssl" +version = "0.10.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "951c002c75e16ea2c65b8c7e4d3d51d5530d8dfa7d060b4776828c88cfb18ecf" +dependencies = [ + "bitflags 2.11.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[package]] +name = "openssl-sys" +version = "0.9.112" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d55af3b3e226502be1526dfdba67ab0e9c96fc293004e79576b2b9edb0dbdb" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" + +[[package]] +name = "rodio" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ceb6607dd738c99bc8cb28eff249b7cd5c8ec88b9db96c0608c1480d140fb1" +dependencies = [ + "claxon", + "cpal", + "hound", + "lewton", + "symphonia", +] + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags 2.11.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +dependencies = [ + "bitflags 2.11.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "socket2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "symphonia" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5773a4c030a19d9bfaa090f49746ff35c75dfddfa700df7a5939d5e076a57039" +dependencies = [ + "lazy_static", + "symphonia-bundle-mp3", + "symphonia-core", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-bundle-mp3" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4872dd6bb56bf5eac799e3e957aa1981086c3e613b27e0ac23b176054f7c57ed" +dependencies = [ + "lazy_static", + "log", + "symphonia-core", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-core" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea00cc4f79b7f6bb7ff87eddc065a1066f3a43fe1875979056672c9ef948c2af" +dependencies = [ + "arrayvec", + "bitflags 1.3.2", + "bytemuck", + "lazy_static", + "log", +] + +[[package]] +name = "symphonia-metadata" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36306ff42b9ffe6e5afc99d49e121e0bd62fe79b9db7b9681d48e29fa19e6b16" +dependencies = [ + "encoding_rs", + "lazy_static", + "log", + "symphonia-core", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tinyvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084" +dependencies = [ + "futures-util", + "log", + "native-tls", + "tokio", + "tokio-native-tls", + "tungstenite", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "1.1.0+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97251a7c317e03ad83774a8752a7e81fb6067740609f75ea2b585b569a59198f" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.25.8+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16bff38f1d86c47f9ff0647e6838d7bb362522bdf44006c7068c2b1e606f1f3c" +dependencies = [ + "indexmap", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.1.0+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2334f11ee363607eb04df9b8fc8a13ca1715a72ba8662a26ac285c98aabb4011" +dependencies = [ + "winnow", +] + +[[package]] +name = "tungstenite" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" +dependencies = [ + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "native-tls", + "rand", + "sha1", + "thiserror 2.0.18", + "utf-8", +] + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "voice-ime" +version = "0.1.0" +dependencies = [ + "base64", + "cpal", + "futures-util", + "rodio", + "serde", + "serde_json", + "tokio", + "tokio-tungstenite", + "windows 0.61.3", + "winres", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.115" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6523d69017b7633e396a89c5efab138161ed5aafcbc8d3e5c5a42ae38f50495a" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d1faf851e778dfa54db7cd438b70758eba9755cb47403f3496edd7c8fc212f0" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.115" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e3a6c758eb2f701ed3d052ff5737f5bfe6614326ea7f3bbac7156192dc32e67" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.115" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "921de2737904886b52bcbb237301552d05969a6f9c40d261eb0533c8b055fedf" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.115" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a93e946af942b58934c604527337bad9ae33ba1d5c6900bbb41c2c07c2364a93" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84cde8507f4d7cfcb1185b8cb5890c494ffea65edbe1ba82cfd63661c805ed94" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "windows" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" +dependencies = [ + "windows-core 0.54.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" +dependencies = [ + "windows-result 0.1.2", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a90e88e4667264a994d34e6d1ab2d26d398dcdca8b7f52bec8668957517fc7d8" +dependencies = [ + "memchr", +] + +[[package]] +name = "winres" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b68db261ef59e9e52806f688020631e987592bd83619edccda9c47d42cde4f6c" +dependencies = [ + "toml", +] + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" + +[[package]] +name = "zerocopy" +version = "0.8.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efbb2a062be311f2ba113ce66f697a4dc589f85e78a4aea276200804cea0ed87" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e8bc7269b54418e7aeeef514aa68f8690b8c0489a06b0136e5f57c4c5ccab89" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..e3d2949 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "voice-ime" +version = "0.1.0" +edition = "2024" + +[dependencies] +windows = { version = "0.61", features = [ + "Win32_UI_WindowsAndMessaging", + "Win32_UI_Input_KeyboardAndMouse", + "Win32_UI_Shell", + "Win32_Graphics_Gdi", + "Win32_System_LibraryLoader", + "Win32_Foundation", + "Win32_UI_Controls", +] } +cpal = "0.15" +tokio = { version = "1", features = ["rt-multi-thread", "sync", "macros", "time"] } +tokio-tungstenite = { version = "0.26", features = ["native-tls"] } +futures-util = "0.3" +serde = { version = "1", features = ["derive"] } +serde_json = "1" +base64 = "0.22" +rodio = "0.20" + +[build-dependencies] +winres = "0.1" diff --git a/README.md b/README.md new file mode 100644 index 0000000..2315abf --- /dev/null +++ b/README.md @@ -0,0 +1,79 @@ +# Voice IME 语音输入法 + +Windows 系统托盘语音输入工具。按下快捷键开始录音,通过阿里云 Qwen ASR 实时语音识别 API 将语音转为文字,自动输入到当前光标位置。 + +## 功能 + +- **快捷键切换录音**:默认 F10,按一次开始,再按一次停止 +- **流式语音识别**:使用 Qwen3 ASR Realtime API,支持 VAD 自动断句,边说边输入 +- **增量文本插入**:对识别结果做 diff,仅输入变化部分,不影响输入框已有内容 +- **系统托盘**:托盘图标显示当前状态(空闲/录音中),右键菜单提供设置 +- **音效提示**:录音开始和停止时播放提示音 +- **暂停媒体播放**:录音时可自动暂停系统媒体播放(可关闭) +- **可自定义配置**: + - 快捷键 + - API Key + - ASR 模型 + - 媒体暂停开关 + +## 使用方法 + +### 获取 API Key + +前往 [阿里云百炼](https://bailian.console.aliyun.com/) 开通 Qwen ASR 服务并获取 API Key。 + +### 运行 + +``` +cargo build --release +./target/release/voice-ime.exe +``` + +首次启动会弹窗要求输入 API Key。输入后程序最小化到系统托盘。 + +### 操作 + +| 操作 | 说明 | +|------|------| +| 按下快捷键(默认 F10) | 开始/停止录音 | +| 右键托盘图标 | 打开设置菜单 | + +### 右键菜单 + +- **设置快捷键** — 按下任意键即可更换 +- **录音时暂停媒体播放** — 勾选开关 +- **设置 API Key** — 修改 ASR 服务密钥 +- **设置模型** — 修改 ASR 模型名称 +- **退出** + +### 配置文件 + +配置保存在 `%APPDATA%\voice-ime\config.json`,格式示例: + +```json +{ + "hotkey_vk": 121, + "media_pause_enabled": true, + "api_key": "sk-xxxxxxxx", + "model": "qwen3-asr-flash-realtime-2026-02-10" +} +``` + +## 技术栈 + +- **Rust 2024 Edition** +- **windows** crate — Win32 API(托盘图标、热键、SendInput 文字输入) +- **cpal** — WASAPI 麦克风采集 +- **tokio + tokio-tungstenite** — 异步 WebSocket 客户端 +- **rodio** — 音效播放 +- **serde** — 配置序列化 + +## 系统要求 + +- Windows 10/11 +- 麦克风 +- 网络连接(用于访问阿里云 ASR API) + +## 许可证 + +MIT diff --git a/assets/idle.ico b/assets/idle.ico new file mode 100644 index 0000000000000000000000000000000000000000..d2a58732c1fdb1869bedf827c2566797373dd90f GIT binary patch literal 91749 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 literal 0 HcmV?d00001 diff --git a/assets/recording.ico b/assets/recording.ico new file mode 100644 index 0000000000000000000000000000000000000000..192bf8850d26bc41c7b0342002b5fddc007aa746 GIT binary patch literal 113196 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 z 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 Vec { + if from_rate == to_rate { + return samples.to_vec(); + } + let ratio = from_rate as f64 / to_rate as f64; + let out_len = (samples.len() as f64 / ratio) as usize; + let mut output = Vec::with_capacity(out_len); + for i in 0..out_len { + let src_pos = i as f64 * ratio; + let idx = src_pos as usize; + let frac = src_pos - idx as f64; + let s = if idx + 1 < samples.len() { + let a = samples[idx] as f64; + let b = samples[idx + 1] as f64; + (a + frac * (b - a)) as i16 + } else { + samples[idx.min(samples.len().saturating_sub(1))] + }; + output.push(s); + } + output +} + +/// Mix multi-channel i16 to mono, resample to 16kHz, return PCM bytes. +fn process_i16(data: &[i16], channels: u16, source_rate: u32) -> Vec { + let ch = channels as usize; + let mono: Vec = data + .chunks(ch) + .map(|frame| { + let sum: i32 = frame.iter().map(|&s| s as i32).sum(); + (sum / ch as i32) as i16 + }) + .collect(); + let resampled = resample(&mono, source_rate, TARGET_SAMPLE_RATE); + resampled.iter().flat_map(|s| s.to_le_bytes()).collect() +} + +/// Mix multi-channel f32 to mono, resample to 16kHz, return PCM bytes. +fn process_f32(data: &[f32], channels: u16, source_rate: u32) -> Vec { + let ch = channels as usize; + let mono: Vec = data + .chunks(ch) + .map(|frame| { + let sum: f32 = frame.iter().sum(); + let m = sum / ch as f32; + (m * 32768.0).clamp(-32768.0, 32767.0) as i16 + }) + .collect(); + let resampled = resample(&mono, source_rate, TARGET_SAMPLE_RATE); + resampled.iter().flat_map(|s| s.to_le_bytes()).collect() +} + +impl AudioCapture { + /// Start capturing audio from the default input device. + /// Audio data is always resampled to 16kHz mono PCM i16 LE. + pub fn start(tx: mpsc::UnboundedSender>) -> Result<(Self, AudioCaptureConfig), String> { + let host = cpal::default_host(); + let device = host + .default_input_device() + .ok_or_else(|| "No input device available".to_string())?; + + let default_config = device + .default_input_config() + .map_err(|e| format!("Failed to get default input config: {e}"))?; + + let source_rate = default_config.sample_rate().0; + let channels = default_config.channels(); + let sample_format = default_config.sample_format(); + let config: StreamConfig = default_config.into(); + + eprintln!("[voice-ime] Audio device: {source_rate}Hz, {channels}ch, {sample_format:?} → resampling to {TARGET_SAMPLE_RATE}Hz mono"); + + let stream = match sample_format { + SampleFormat::I16 => { + let ch = channels; + let rate = source_rate; + device + .build_input_stream( + &config, + move |data: &[i16], _: &cpal::InputCallbackInfo| { + let bytes = process_i16(data, ch, rate); + let _ = tx.send(bytes); + }, + |err| eprintln!("Audio capture error: {err}"), + None, + ) + .map_err(|e| format!("Failed to build i16 input stream: {e}"))? + } + SampleFormat::F32 => { + let ch = channels; + let rate = source_rate; + device + .build_input_stream( + &config, + move |data: &[f32], _: &cpal::InputCallbackInfo| { + let bytes = process_f32(data, ch, rate); + let _ = tx.send(bytes); + }, + |err| eprintln!("Audio capture error: {err}"), + None, + ) + .map_err(|e| format!("Failed to build f32 input stream: {e}"))? + } + _ => return Err(format!("Unsupported sample format: {sample_format:?}")), + }; + + stream + .play() + .map_err(|e| format!("Failed to start audio stream: {e}"))?; + + Ok(( + AudioCapture { stream }, + AudioCaptureConfig { + sample_rate: TARGET_SAMPLE_RATE, + }, + )) + } +} + +impl Drop for AudioCapture { + fn drop(&mut self) { + let _ = self.stream.pause(); + } +} diff --git a/src/config.rs b/src/config.rs new file mode 100644 index 0000000..fd53b1f --- /dev/null +++ b/src/config.rs @@ -0,0 +1,116 @@ +use serde::{Deserialize, Serialize}; +use std::cell::RefCell; +use std::fs; +use std::path::PathBuf; + +pub const DEFAULT_MODEL: &str = "qwen3-asr-flash-realtime-2026-02-10"; + +#[derive(Serialize, Deserialize, Clone)] +pub struct Config { + /// Virtual key code for the hotkey (default: VK_F10 = 0x79) + pub hotkey_vk: u16, + /// Whether to send media play/pause when toggling recording + pub media_pause_enabled: bool, + /// API key for Qwen3 ASR service + #[serde(default)] + pub api_key: String, + /// ASR model name + #[serde(default = "default_model")] + pub model: String, +} + +fn default_model() -> String { + DEFAULT_MODEL.to_string() +} + +impl Default for Config { + fn default() -> Self { + Config { + hotkey_vk: 0x79, // VK_F10 + media_pause_enabled: true, + api_key: String::new(), + model: DEFAULT_MODEL.to_string(), + } + } +} + +fn config_path() -> PathBuf { + let dir = std::env::var_os("APPDATA") + .map(PathBuf::from) + .unwrap_or_else(|| { + dirs_fallback_appdata() + }) + .join("voice-ime"); + let _ = fs::create_dir_all(&dir); + dir.join("config.json") +} + +/// Fallback: %USERPROFILE%\AppData\Roaming +fn dirs_fallback_appdata() -> PathBuf { + std::env::var_os("USERPROFILE") + .map(|p| PathBuf::from(p).join("AppData").join("Roaming")) + .unwrap_or_else(|| PathBuf::from(".")) +} + +thread_local! { + static CONFIG: RefCell = RefCell::new(Config::default()); +} + +pub fn load() { + let path = config_path(); + if let Ok(data) = fs::read_to_string(&path) { + if let Ok(cfg) = serde_json::from_str::(&data) { + CONFIG.with(|c| *c.borrow_mut() = cfg); + } + } +} + +pub fn save() { + let path = config_path(); + CONFIG.with(|c| { + if let Ok(json) = serde_json::to_string_pretty(&*c.borrow()) { + let _ = fs::write(&path, json); + } + }); +} + +pub fn get() -> Config { + CONFIG.with(|c| c.borrow().clone()) +} + +pub fn set_hotkey_vk(vk: u16) { + CONFIG.with(|c| c.borrow_mut().hotkey_vk = vk); + save(); +} + +pub fn set_media_pause(enabled: bool) { + CONFIG.with(|c| c.borrow_mut().media_pause_enabled = enabled); + save(); +} + +pub fn set_api_key(key: String) { + CONFIG.with(|c| c.borrow_mut().api_key = key); + save(); +} + +pub fn set_model(model: String) { + CONFIG.with(|c| c.borrow_mut().model = model); + save(); +} + +/// Return a display name for a virtual key code. +pub fn vk_name(vk: u16) -> String { + match vk { + 0x70..=0x87 => format!("F{}", vk - 0x70 + 1), + 0x21 => "PageUp".into(), + 0x22 => "PageDown".into(), + 0x23 => "End".into(), + 0x24 => "Home".into(), + 0x2D => "Insert".into(), + 0x2E => "Delete".into(), + 0x13 => "Pause".into(), + 0x91 => "ScrollLock".into(), + 0xC0 => "`".into(), + _ => format!("VK(0x{vk:02X})"), + } +} diff --git a/src/input.rs b/src/input.rs new file mode 100644 index 0000000..8e68ad0 --- /dev/null +++ b/src/input.rs @@ -0,0 +1,139 @@ +use std::mem; +use windows::Win32::UI::Input::KeyboardAndMouse::{ + SendInput, INPUT, INPUT_KEYBOARD, KEYBDINPUT, KEYEVENTF_KEYUP, KEYEVENTF_UNICODE, + VIRTUAL_KEY, VK_BACK, VK_MEDIA_PLAY_PAUSE, +}; + +fn send_inputs(inputs: &[INPUT]) { + if inputs.is_empty() { + return; + } + unsafe { + SendInput(inputs, mem::size_of::() as i32); + } +} + +fn make_unicode_key_down(scan: u16) -> INPUT { + INPUT { + r#type: INPUT_KEYBOARD, + Anonymous: windows::Win32::UI::Input::KeyboardAndMouse::INPUT_0 { + ki: KEYBDINPUT { + wVk: VIRTUAL_KEY(0), + wScan: scan, + dwFlags: KEYEVENTF_UNICODE, + time: 0, + dwExtraInfo: 0, + }, + }, + } +} + +fn make_unicode_key_up(scan: u16) -> INPUT { + INPUT { + r#type: INPUT_KEYBOARD, + Anonymous: windows::Win32::UI::Input::KeyboardAndMouse::INPUT_0 { + ki: KEYBDINPUT { + wVk: VIRTUAL_KEY(0), + wScan: scan, + dwFlags: KEYEVENTF_UNICODE | KEYEVENTF_KEYUP, + time: 0, + dwExtraInfo: 0, + }, + }, + } +} + +fn make_vk_key_down(vk: VIRTUAL_KEY) -> INPUT { + INPUT { + r#type: INPUT_KEYBOARD, + Anonymous: windows::Win32::UI::Input::KeyboardAndMouse::INPUT_0 { + ki: KEYBDINPUT { + wVk: vk, + wScan: 0, + dwFlags: windows::Win32::UI::Input::KeyboardAndMouse::KEYBD_EVENT_FLAGS(0), + time: 0, + dwExtraInfo: 0, + }, + }, + } +} + +fn make_vk_key_up(vk: VIRTUAL_KEY) -> INPUT { + INPUT { + r#type: INPUT_KEYBOARD, + Anonymous: windows::Win32::UI::Input::KeyboardAndMouse::INPUT_0 { + ki: KEYBDINPUT { + wVk: vk, + wScan: 0, + dwFlags: KEYEVENTF_KEYUP, + time: 0, + dwExtraInfo: 0, + }, + }, + } +} + +/// Send N backspace key presses. +fn send_backspaces(count: usize) { + if count == 0 { + return; + } + let mut inputs = Vec::with_capacity(count * 2); + for _ in 0..count { + inputs.push(make_vk_key_down(VK_BACK)); + inputs.push(make_vk_key_up(VK_BACK)); + } + send_inputs(&inputs); +} + +/// Type a string using SendInput with KEYEVENTF_UNICODE. +/// Handles surrogate pairs for characters outside BMP. +fn send_unicode_string(text: &str) { + if text.is_empty() { + return; + } + let mut inputs = Vec::new(); + for c in text.chars() { + let mut buf = [0u16; 2]; + let encoded = c.encode_utf16(&mut buf); + for &code_unit in encoded.iter() { + inputs.push(make_unicode_key_down(code_unit)); + inputs.push(make_unicode_key_up(code_unit)); + } + } + send_inputs(&inputs); +} + +/// Compute the common prefix length (in chars) between two strings. +fn common_prefix_chars(a: &str, b: &str) -> usize { + a.chars() + .zip(b.chars()) + .take_while(|(ca, cb)| ca == cb) + .count() +} + +/// Given the previously inserted text and the new full text from ASR, +/// send the minimal backspaces + new characters to update the input field. +/// Returns the new "last inserted" text (i.e. `current`). +pub fn apply_text_update(last: &str, current: &str) -> String { + let prefix_len = common_prefix_chars(last, current); + let last_char_count = last.chars().count(); + let backspace_count = last_char_count - prefix_len; + + // Get the byte offset where the common prefix ends in `current` + let new_suffix: String = current.chars().skip(prefix_len).collect(); + + send_backspaces(backspace_count); + send_unicode_string(&new_suffix); + + current.to_string() +} + +/// Simulate pressing the media Play/Pause key. +pub fn send_media_play_pause() { + let inputs = [ + make_vk_key_down(VK_MEDIA_PLAY_PAUSE), + make_vk_key_up(VK_MEDIA_PLAY_PAUSE), + ]; + send_inputs(&inputs); +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..30d842f --- /dev/null +++ b/src/main.rs @@ -0,0 +1,679 @@ +#![windows_subsystem = "windows"] + +mod audio; +mod config; +mod input; +mod session; +mod sound; +mod ws; + +use session::RecordingSession; +use std::cell::RefCell; +use windows::core::{w, PCWSTR}; +use windows::Win32::Foundation::{HWND, LPARAM, LRESULT, WPARAM}; +use windows::Win32::Graphics::Gdi::{GetStockObject, BLACK_BRUSH}; +use windows::Win32::System::LibraryLoader::GetModuleHandleW; +use windows::Win32::UI::Input::KeyboardAndMouse::{ + RegisterHotKey, UnregisterHotKey, HOT_KEY_MODIFIERS, +}; +use windows::Win32::UI::Shell::{ + Shell_NotifyIconW, NIF_ICON, NIF_MESSAGE, NIF_TIP, NIM_ADD, NIM_DELETE, NIM_MODIFY, + NOTIFYICONDATAW, +}; +use windows::Win32::UI::WindowsAndMessaging::*; + +static ICO_IDLE: &[u8] = include_bytes!("../assets/idle.ico"); +static ICO_RECORDING: &[u8] = include_bytes!("../assets/recording.ico"); + +/// Parse an ICO file and load the best-matching icon entry as an HICON. +fn load_icon_from_ico(data: &[u8]) -> HICON { + // ICO header: reserved(2) + type(2) + count(2) = 6 bytes + // Each entry: width(1) + height(1) + colorCount(1) + reserved(1) + // + planes(2) + bitCount(2) + bytesInRes(4) + imageOffset(4) = 16 bytes + if data.len() < 6 { + return HICON::default(); + } + let count = u16::from_le_bytes([data[4], data[5]]) as usize; + if count == 0 || data.len() < 6 + count * 16 { + return HICON::default(); + } + + // Get system small icon size for tray + let desired = unsafe { GetSystemMetrics(SM_CXSMICON) } as u32; + + // Find best entry: prefer exact match on desired size, else closest larger, else largest + let mut best_idx = 0; + let mut best_w = 0u32; + for i in 0..count { + let off = 6 + i * 16; + let w = if data[off] == 0 { 256 } else { data[off] as u32 }; + if w == desired { + best_idx = i; + best_w = w; + break; + } + if (w >= desired && (best_w < desired || w < best_w)) + || (best_w < desired && w > best_w) + { + best_idx = i; + best_w = w; + } + } + + let off = 6 + best_idx * 16; + let bytes_in_res = u32::from_le_bytes([data[off + 8], data[off + 9], data[off + 10], data[off + 11]]) as usize; + let image_offset = u32::from_le_bytes([data[off + 12], data[off + 13], data[off + 14], data[off + 15]]) as usize; + + if data.len() < image_offset + bytes_in_res { + return HICON::default(); + } + + let image_data = &data[image_offset..image_offset + bytes_in_res]; + unsafe { + CreateIconFromResourceEx( + image_data, + true, + 0x00030000, + desired as i32, + desired as i32, + LR_DEFAULTCOLOR, + ) + .unwrap_or_default() + } +} + +const WM_TRAYICON: u32 = WM_APP + 1; +const HOTKEY_ID: i32 = 1; +const IDM_EXIT: usize = 1001; +const IDM_CHANGE_HOTKEY: usize = 1002; +const IDM_TOGGLE_MEDIA_PAUSE: usize = 1003; +const IDM_SET_API_KEY: usize = 1004; +const IDM_SET_MODEL: usize = 1005; + +thread_local! { + static SESSION: RefCell> = RefCell::new(None); + static HWND_MAIN: RefCell = RefCell::new(HWND::default()); + /// When true, next key press in the dialog sets the hotkey. + static PICKING_HOTKEY: RefCell = RefCell::new(false); +} + +fn set_tray_tooltip(hwnd: HWND, tip: &str, recording: bool) { + let mut nid = NOTIFYICONDATAW { + cbSize: std::mem::size_of::() as u32, + hWnd: hwnd, + uID: 1, + uFlags: NIF_TIP | NIF_ICON, + ..Default::default() + }; + + // Set tooltip + let tip_wide: Vec = tip.encode_utf16().chain(std::iter::once(0)).collect(); + let len = tip_wide.len().min(nid.szTip.len()); + nid.szTip[..len].copy_from_slice(&tip_wide[..len]); + + nid.hIcon = if recording { + load_icon_from_ico(ICO_RECORDING) + } else { + load_icon_from_ico(ICO_IDLE) + }; + + unsafe { + let _ = Shell_NotifyIconW(NIM_MODIFY, &nid); + } +} + +fn toggle_recording(hwnd: HWND) { + SESSION.with(|s| { + let mut session = s.borrow_mut(); + let cfg = config::get(); + if session.is_some() { + // Stop recording + session.take().unwrap().stop(); + set_tray_tooltip(hwnd, "语音输入 - 空闲", false); + sound::play_stop(); + if cfg.media_pause_enabled { + input::send_media_play_pause(); + } + } else { + // Start recording + if cfg.media_pause_enabled { + input::send_media_play_pause(); + } + match RecordingSession::start() { + Ok(s) => { + *session = Some(s); + set_tray_tooltip(hwnd, "语音输入 - 录音中...", true); + sound::play_start(); + } + Err(e) => { + eprintln!("[voice-ime] Failed to start recording: {e}"); + set_tray_tooltip(hwnd, &format!("语音输入 - 错误: {e}"), false); + } + } + } + }); +} + +/// Show a generic single-line text input dialog. Returns Some(text) if confirmed, None if cancelled. +fn show_text_input_dialog(hwnd: HWND, title: &str, label: &str, initial: &str) -> Option { + unsafe { + let instance = GetModuleHandleW(None).unwrap(); + + let wc = WNDCLASSEXW { + cbSize: std::mem::size_of::() as u32, + lpfnWndProc: Some(textinput_wnd_proc), + hInstance: instance.into(), + lpszClassName: w!("VoiceIMETextInput"), + hbrBackground: std::mem::transmute(GetStockObject( + windows::Win32::Graphics::Gdi::WHITE_BRUSH, + )), + ..Default::default() + }; + RegisterClassExW(&wc); + + let screen_w = GetSystemMetrics(SM_CXSCREEN); + let screen_h = GetSystemMetrics(SM_CYSCREEN); + let dlg_w = 420; + let dlg_h = 160; + + TEXTINPUT_RESULT.with(|r| *r.borrow_mut() = None); + TEXTINPUT_LABEL.with(|r| *r.borrow_mut() = label.to_string()); + TEXTINPUT_INITIAL.with(|r| *r.borrow_mut() = initial.to_string()); + + let mut title_w: Vec = title.encode_utf16().collect(); + title_w.push(0); + + let dlg = CreateWindowExW( + WS_EX_TOPMOST | WS_EX_TOOLWINDOW, + w!("VoiceIMETextInput"), + PCWSTR(title_w.as_ptr()), + WS_POPUP | WS_CAPTION | WS_SYSMENU, + (screen_w - dlg_w) / 2, + (screen_h - dlg_h) / 2, + dlg_w, + dlg_h, + Some(hwnd), + None, + Some(instance.into()), + None, + ) + .unwrap(); + + let _ = ShowWindow(dlg, SW_SHOW); + let _ = SetForegroundWindow(dlg); + + let mut msg = MSG::default(); + while GetMessageW(&mut msg, None, 0, 0).as_bool() { + if !IsWindow(Some(dlg)).as_bool() { + break; + } + let _ = TranslateMessage(&msg); + DispatchMessageW(&msg); + } + + TEXTINPUT_RESULT.with(|r| r.borrow().clone()).filter(|s| !s.is_empty()) + } +} + +thread_local! { + static TEXTINPUT_RESULT: RefCell> = RefCell::new(None); + static TEXTINPUT_LABEL: RefCell = RefCell::new(String::new()); + static TEXTINPUT_INITIAL: RefCell = RefCell::new(String::new()); + static TEXTINPUT_EDIT_HWND: RefCell = RefCell::new(HWND::default()); +} + +const IDC_TEXTINPUT_EDIT: i32 = 3001; +const IDC_TEXTINPUT_OK: i32 = 3002; + +unsafe extern "system" fn textinput_wnd_proc( + hwnd: HWND, + msg: u32, + wparam: WPARAM, + lparam: LPARAM, +) -> LRESULT { + match msg { + WM_CREATE => { + let instance = unsafe { GetModuleHandleW(None).unwrap() }; + + let label_text = TEXTINPUT_LABEL.with(|r| r.borrow().clone()); + let mut label_w: Vec = label_text.encode_utf16().collect(); + label_w.push(0); + unsafe { + let _ = CreateWindowExW( + WINDOW_EX_STYLE::default(), + w!("STATIC"), + PCWSTR(label_w.as_ptr()), + WS_CHILD | WS_VISIBLE, + 15, 15, 380, 20, + Some(hwnd), None, Some(instance.into()), None, + ); + } + + let init_text = TEXTINPUT_INITIAL.with(|r| r.borrow().clone()); + let mut init_w: Vec = init_text.encode_utf16().collect(); + init_w.push(0); + let edit = unsafe { + CreateWindowExW( + WS_EX_CLIENTEDGE, + w!("EDIT"), + PCWSTR(init_w.as_ptr()), + WS_CHILD | WS_VISIBLE | WINDOW_STYLE(0x0080), + 15, 42, 375, 25, + Some(hwnd), Some(HMENU(IDC_TEXTINPUT_EDIT as _)), + Some(instance.into()), None, + ).unwrap() + }; + TEXTINPUT_EDIT_HWND.with(|h| *h.borrow_mut() = edit); + + unsafe { + let _ = CreateWindowExW( + WINDOW_EX_STYLE::default(), + w!("BUTTON"), + w!("确定"), + WS_CHILD | WS_VISIBLE | WINDOW_STYLE(0x0001), + 160, 80, 90, 30, + Some(hwnd), Some(HMENU(IDC_TEXTINPUT_OK as _)), + Some(instance.into()), None, + ); + } + + unsafe { + let _ = SendMessageW(edit, 0x00B1, Some(WPARAM(0)), Some(LPARAM(-1))); + let _ = windows::Win32::UI::Input::KeyboardAndMouse::SetFocus(Some(edit)); + } + LRESULT(0) + } + WM_COMMAND => { + let id = (wparam.0 & 0xFFFF) as i32; + if id == IDC_TEXTINPUT_OK { + let edit = TEXTINPUT_EDIT_HWND.with(|h| *h.borrow()); + let len = unsafe { GetWindowTextLengthW(edit) } as usize; + let mut buf = vec![0u16; len + 1]; + unsafe { GetWindowTextW(edit, &mut buf) }; + let text = String::from_utf16_lossy(&buf[..len]); + TEXTINPUT_RESULT.with(|r| *r.borrow_mut() = Some(text.trim().to_string())); + unsafe { let _ = DestroyWindow(hwnd); } + } + LRESULT(0) + } + WM_CLOSE => { + TEXTINPUT_RESULT.with(|r| *r.borrow_mut() = Some(String::new())); + unsafe { let _ = DestroyWindow(hwnd); } + LRESULT(0) + } + WM_DESTROY => { + unsafe { PostQuitMessage(0); } + LRESULT(0) + } + _ => unsafe { DefWindowProcW(hwnd, msg, wparam, lparam) }, + } +} + +/// Show API key input dialog. Returns true if user provided a key. +fn show_api_key_dialog(hwnd: HWND) -> bool { + let current = config::get().api_key; + if let Some(key) = show_text_input_dialog(hwnd, "设置 API Key", "请输入 Qwen ASR API Key:", ¤t) { + config::set_api_key(key); + true + } else { + false + } +} + +/// Show model input dialog. +fn show_model_dialog(hwnd: HWND) { + let current = config::get().model; + if let Some(model) = show_text_input_dialog(hwnd, "设置模型", "请输入 ASR 模型名称:", ¤t) { + config::set_model(model); + } +} + +fn show_context_menu(hwnd: HWND) { + unsafe { + let cfg = config::get(); + let menu = CreatePopupMenu().unwrap(); + + // Hotkey item + let hotkey_label: Vec = format!("设置快捷键 (当前: {})\0", config::vk_name(cfg.hotkey_vk)) + .encode_utf16() + .collect(); + AppendMenuW(menu, MF_STRING, IDM_CHANGE_HOTKEY, PCWSTR(hotkey_label.as_ptr())).unwrap(); + + // Media pause toggle + let pause_label: Vec = "录音时暂停媒体播放\0".encode_utf16().collect(); + let flags = if cfg.media_pause_enabled { + MF_STRING | MF_CHECKED + } else { + MF_STRING | MF_UNCHECKED + }; + AppendMenuW(menu, flags, IDM_TOGGLE_MEDIA_PAUSE, PCWSTR(pause_label.as_ptr())).unwrap(); + + // API Key + let api_key_label: Vec = "设置 API Key...\0".encode_utf16().collect(); + AppendMenuW(menu, MF_STRING, IDM_SET_API_KEY, PCWSTR(api_key_label.as_ptr())).unwrap(); + + // Model + let model_label: Vec = format!("设置模型 ({})...\0", cfg.model).encode_utf16().collect(); + AppendMenuW(menu, MF_STRING, IDM_SET_MODEL, PCWSTR(model_label.as_ptr())).unwrap(); + + // Separator + AppendMenuW(menu, MF_SEPARATOR, 0, None).unwrap(); + + // Exit + let exit_label: Vec = "退出\0".encode_utf16().collect(); + AppendMenuW(menu, MF_STRING, IDM_EXIT, PCWSTR(exit_label.as_ptr())).unwrap(); + + let mut pt = windows::Win32::Foundation::POINT::default(); + let _ = GetCursorPos(&mut pt); + + // Required for the menu to disappear when clicking outside + let _ = SetForegroundWindow(hwnd); + + let _ = TrackPopupMenu(menu, TPM_BOTTOMALIGN | TPM_LEFTALIGN, pt.x, pt.y, Some(0), hwnd, None); + let _ = DestroyMenu(menu); + } +} + +/// Register the global hotkey using the current config. +fn register_configured_hotkey(hwnd: HWND) -> bool { + let vk = config::get().hotkey_vk; + unsafe { + RegisterHotKey( + Some(hwnd), + HOTKEY_ID, + HOT_KEY_MODIFIERS(0), + vk as u32, + ) + .is_ok() + } +} + +/// Show a small dialog that captures the next key press as the new hotkey. +fn show_hotkey_picker(hwnd: HWND) { + // Create a small popup window for key capture + unsafe { + let instance = GetModuleHandleW(None).unwrap(); + + // Register class for picker window (once is fine, re-register is harmless) + let wc = WNDCLASSEXW { + cbSize: std::mem::size_of::() as u32, + lpfnWndProc: Some(picker_wnd_proc), + hInstance: instance.into(), + lpszClassName: w!("VoiceIMEPicker"), + hbrBackground: std::mem::transmute(GetStockObject( + windows::Win32::Graphics::Gdi::WHITE_BRUSH, + )), + ..Default::default() + }; + RegisterClassExW(&wc); + + // Get screen center + let screen_w = GetSystemMetrics(SM_CXSCREEN); + let screen_h = GetSystemMetrics(SM_CYSCREEN); + let dlg_w = 320; + let dlg_h = 120; + + let picker = CreateWindowExW( + WS_EX_TOPMOST | WS_EX_TOOLWINDOW, + w!("VoiceIMEPicker"), + w!("设置快捷键"), + WS_POPUP | WS_CAPTION | WS_SYSMENU, + (screen_w - dlg_w) / 2, + (screen_h - dlg_h) / 2, + dlg_w, + dlg_h, + Some(hwnd), + None, + Some(instance.into()), + None, + ) + .unwrap(); + + // Unregister current hotkey so the key can be captured + let _ = UnregisterHotKey(Some(hwnd), HOTKEY_ID); + PICKING_HOTKEY.with(|p| *p.borrow_mut() = true); + + let _ = ShowWindow(picker, SW_SHOW); + let _ = SetForegroundWindow(picker); + + // Run a modal message loop for the picker + let mut msg = MSG::default(); + while GetMessageW(&mut msg, None, 0, 0).as_bool() { + let _ = TranslateMessage(&msg); + DispatchMessageW(&msg); + if !PICKING_HOTKEY.with(|p| *p.borrow()) { + break; + } + } + + // Re-register hotkey with (possibly new) config + if !register_configured_hotkey(hwnd) { + let text: Vec = format!( + "无法注册快捷键 {},可能被其他程序占用。\0", + config::vk_name(config::get().hotkey_vk) + ) + .encode_utf16() + .collect(); + let title: Vec = "语音输入\0".encode_utf16().collect(); + MessageBoxW( + Some(hwnd), + PCWSTR(text.as_ptr()), + PCWSTR(title.as_ptr()), + MB_OK | MB_ICONWARNING, + ); + } + } +} + +unsafe extern "system" fn picker_wnd_proc( + hwnd: HWND, + msg: u32, + wparam: WPARAM, + lparam: LPARAM, +) -> LRESULT { + match msg { + WM_CREATE => { + // Create a static label + let text: Vec = "请按下新的快捷键...\0".encode_utf16().collect(); + let instance = unsafe { GetModuleHandleW(None).unwrap() }; + unsafe { + let _ = CreateWindowExW( + WINDOW_EX_STYLE::default(), + w!("STATIC"), + PCWSTR(text.as_ptr()), + WS_CHILD | WS_VISIBLE | WINDOW_STYLE(0x01), + 0, + 25, + 320, + 40, + Some(hwnd), + None, + Some(instance.into()), + None, + ); + } + LRESULT(0) + } + WM_KEYDOWN | WM_SYSKEYDOWN => { + let vk = (wparam.0 & 0xFF) as u16; + // Ignore modifier-only keys + if !matches!(vk, 0x10 | 0x11 | 0x12 | 0xA0..=0xA5) { + config::set_hotkey_vk(vk); + PICKING_HOTKEY.with(|p| *p.borrow_mut() = false); + unsafe { let _ = DestroyWindow(hwnd); } + } + LRESULT(0) + } + WM_CLOSE => { + PICKING_HOTKEY.with(|p| *p.borrow_mut() = false); + unsafe { let _ = DestroyWindow(hwnd); } + LRESULT(0) + } + WM_DESTROY => { + PICKING_HOTKEY.with(|p| *p.borrow_mut() = false); + LRESULT(0) + } + _ => unsafe { DefWindowProcW(hwnd, msg, wparam, lparam) }, + } +} + +unsafe extern "system" fn wnd_proc( + hwnd: HWND, + msg: u32, + wparam: WPARAM, + lparam: LPARAM, +) -> LRESULT { + match msg { + WM_HOTKEY => { + if wparam.0 == HOTKEY_ID as usize { + toggle_recording(hwnd); + } + LRESULT(0) + } + WM_COMMAND => { + let id = (wparam.0 & 0xFFFF) as usize; + if id == IDM_EXIT { + // Clean up and exit + SESSION.with(|s| { + let mut session = s.borrow_mut(); + if let Some(mut sess) = session.take() { + sess.stop(); + } + }); + unsafe { DestroyWindow(hwnd).unwrap() }; + } else if id == IDM_CHANGE_HOTKEY { + show_hotkey_picker(hwnd); + // Update tray tooltip with new hotkey name + set_tray_tooltip(hwnd, &format!("语音输入 ({})", config::vk_name(config::get().hotkey_vk)), false); + } else if id == IDM_TOGGLE_MEDIA_PAUSE { + let enabled = config::get().media_pause_enabled; + config::set_media_pause(!enabled); + } else if id == IDM_SET_API_KEY { + show_api_key_dialog(hwnd); + } else if id == IDM_SET_MODEL { + show_model_dialog(hwnd); + } + LRESULT(0) + } + x if x == WM_TRAYICON => { + let event = (lparam.0 & 0xFFFF) as u32; + if event == WM_RBUTTONUP { + show_context_menu(hwnd); + } + LRESULT(0) + } + WM_DESTROY => { + // Remove tray icon + let nid = NOTIFYICONDATAW { + cbSize: std::mem::size_of::() as u32, + hWnd: hwnd, + uID: 1, + ..Default::default() + }; + unsafe { let _ = Shell_NotifyIconW(NIM_DELETE, &nid); }; + + // Unregister hotkey + unsafe { let _ = UnregisterHotKey(Some(hwnd), HOTKEY_ID); }; + + unsafe { PostQuitMessage(0) }; + LRESULT(0) + } + _ => unsafe { DefWindowProcW(hwnd, msg, wparam, lparam) }, + } +} + +fn create_hidden_window() -> HWND { + unsafe { + let instance = GetModuleHandleW(None).unwrap(); + + let wc = WNDCLASSEXW { + cbSize: std::mem::size_of::() as u32, + lpfnWndProc: Some(wnd_proc), + hInstance: instance.into(), + lpszClassName: w!("VoiceIMEWindow"), + hbrBackground: std::mem::transmute(GetStockObject(BLACK_BRUSH)), + ..Default::default() + }; + + RegisterClassExW(&wc); + + let hwnd = CreateWindowExW( + WINDOW_EX_STYLE::default(), + w!("VoiceIMEWindow"), + w!("Voice IME"), + WS_OVERLAPPEDWINDOW, + 0, + 0, + 0, + 0, + Some(HWND_MESSAGE), // Message-only window + None, + Some(instance.into()), + None, + ) + .unwrap(); + + hwnd + } +} + +fn create_tray_icon(hwnd: HWND) { + let mut nid = NOTIFYICONDATAW { + cbSize: std::mem::size_of::() as u32, + hWnd: hwnd, + uID: 1, + uFlags: NIF_MESSAGE | NIF_ICON | NIF_TIP, + uCallbackMessage: WM_TRAYICON, + ..Default::default() + }; + + nid.hIcon = load_icon_from_ico(ICO_IDLE); + + let tip = "语音输入 - 空闲 (F10)"; + let tip_wide: Vec = tip.encode_utf16().chain(std::iter::once(0)).collect(); + let len = tip_wide.len().min(nid.szTip.len()); + nid.szTip[..len].copy_from_slice(&tip_wide[..len]); + + unsafe { + let _ = Shell_NotifyIconW(NIM_ADD, &nid); + } +} + +fn main() { + config::load(); + + let hwnd = create_hidden_window(); + + HWND_MAIN.with(|h| *h.borrow_mut() = hwnd); + + // Prompt for API key if not configured + if config::get().api_key.is_empty() { + if !show_api_key_dialog(hwnd) { + return; + } + } + + // Register global hotkey from config + if !register_configured_hotkey(hwnd) { + eprintln!("[voice-ime] Failed to register hotkey. Is another instance running?"); + return; + } + + create_tray_icon(hwnd); + + let hotkey_name = config::vk_name(config::get().hotkey_vk); + set_tray_tooltip(hwnd, &format!("语音输入 ({})", hotkey_name), false); + + eprintln!("[voice-ime] Running. Press {} to toggle recording.", hotkey_name); + + // Message loop + unsafe { + let mut msg = MSG::default(); + while GetMessageW(&mut msg, None, 0, 0).as_bool() { + let _ = TranslateMessage(&msg); + DispatchMessageW(&msg); + } + } + + eprintln!("[voice-ime] Exiting."); +} diff --git a/src/session.rs b/src/session.rs new file mode 100644 index 0000000..ace94ad --- /dev/null +++ b/src/session.rs @@ -0,0 +1,99 @@ +use std::sync::{Arc, Mutex}; +use std::thread; +use tokio::sync::mpsc; + +use crate::audio::AudioCapture; +use crate::config; +use crate::input; +use crate::ws; + +/// Tracks text state across multiple speech segments in a VAD session. +struct TextState { + /// Concatenation of all completed segment transcripts. + completed_text: String, + /// Current segment's partial preview (text + stash from latest .text event). + current_partial: String, + /// The full text we last typed into the input field. + last_displayed: String, +} + +pub struct RecordingSession { + stop_tx: Option>, + thread_handle: Option>, + _capture: Option, +} + +impl RecordingSession { + pub fn start() -> Result { + let (stop_tx, stop_rx) = mpsc::channel::<()>(1); + let (audio_tx, audio_rx) = mpsc::unbounded_channel::>(); + + let (capture, _audio_cfg) = AudioCapture::start(audio_tx)?; + + let cfg = config::get(); + let api_key = cfg.api_key.clone(); + let model = cfg.model.clone(); + + let thread_handle = thread::spawn(move || { + let rt = tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + .expect("Failed to create tokio runtime"); + + let state = Arc::new(Mutex::new(TextState { + completed_text: String::new(), + current_partial: String::new(), + last_displayed: String::new(), + })); + + let on_event = { + let state = state.clone(); + move |event: ws::AsrEvent| { + let mut st = state.lock().unwrap(); + match event { + ws::AsrEvent::Partial { text, stash } => { + st.current_partial = format!("{text}{stash}"); + let full = format!("{}{}", st.completed_text, st.current_partial); + st.last_displayed = input::apply_text_update(&st.last_displayed, &full); + } + ws::AsrEvent::SegmentCompleted { transcript } => { + st.completed_text.push_str(&transcript); + st.current_partial.clear(); + let full = st.completed_text.clone(); + st.last_displayed = input::apply_text_update(&st.last_displayed, &full); + } + } + } + }; + + let result = rt.block_on(ws::run_ws_session(&api_key, &model, audio_rx, stop_rx, on_event)); + + if let Err(e) = result { + eprintln!("[voice-ime] Recording session error: {e}"); + } + }); + + Ok(RecordingSession { + stop_tx: Some(stop_tx), + thread_handle: Some(thread_handle), + _capture: Some(capture), + }) + } + + pub fn stop(&mut self) { + self._capture.take(); + + if let Some(tx) = self.stop_tx.take() { + let _ = tx.blocking_send(()); + } + if let Some(handle) = self.thread_handle.take() { + let _ = handle.join(); + } + } +} + +impl Drop for RecordingSession { + fn drop(&mut self) { + self.stop(); + } +} diff --git a/src/sound.rs b/src/sound.rs new file mode 100644 index 0000000..7dd2682 --- /dev/null +++ b/src/sound.rs @@ -0,0 +1,31 @@ +use rodio::{Decoder, OutputStream, Sink}; +use std::io::Cursor; + +static SND_START: &[u8] = include_bytes!("../assets/start.mp3"); +static SND_STOP: &[u8] = include_bytes!("../assets/stop.mp3"); + +/// Play an embedded sound in a background thread (non-blocking). +fn play_bytes(data: &'static [u8]) { + std::thread::spawn(move || { + let Ok((_stream, handle)) = OutputStream::try_default() else { + return; + }; + let Ok(sink) = Sink::try_new(&handle) else { + return; + }; + let cursor = Cursor::new(data); + let Ok(source) = Decoder::new(cursor) else { + return; + }; + sink.append(source); + sink.sleep_until_end(); + }); +} + +pub fn play_start() { + play_bytes(SND_START); +} + +pub fn play_stop() { + play_bytes(SND_STOP); +} diff --git a/src/ws.rs b/src/ws.rs new file mode 100644 index 0000000..2f91187 --- /dev/null +++ b/src/ws.rs @@ -0,0 +1,230 @@ +use base64::{engine::general_purpose::STANDARD, Engine as _}; +use futures_util::{SinkExt, StreamExt}; +use serde_json::Value; +use tokio::sync::mpsc; +use tokio_tungstenite::{ + connect_async_tls_with_config, + tungstenite::{http::Request, Message}, +}; + +const WS_BASE_URL: &str = "wss://dashscope.aliyuncs.com/api-ws/v1/realtime?model="; + +/// Events emitted by the ASR WebSocket session. +pub enum AsrEvent { + /// Partial result for current speech segment. Full preview = text + stash. + Partial { text: String, stash: String }, + /// Final result for a completed speech segment. + SegmentCompleted { transcript: String }, +} + +/// Run a WebSocket ASR session using the Qwen3 ASR Realtime API. +pub async fn run_ws_session( + api_key: &str, + model: &str, + mut audio_rx: mpsc::UnboundedReceiver>, + mut stop_rx: mpsc::Receiver<()>, + on_event: impl Fn(AsrEvent) + Send + 'static, +) -> Result<(), String> { + let ws_url = format!("{WS_BASE_URL}{model}"); + // Build request with auth headers + let request = Request::builder() + .uri(&ws_url) + .header("Authorization", format!("Bearer {api_key}")) + .header("OpenAI-Beta", "realtime=v1") + .header("Host", "dashscope.aliyuncs.com") + .header("Connection", "Upgrade") + .header("Upgrade", "websocket") + .header("Sec-WebSocket-Version", "13") + .header( + "Sec-WebSocket-Key", + tokio_tungstenite::tungstenite::handshake::client::generate_key(), + ) + .body(()) + .map_err(|e| format!("Build request failed: {e}"))?; + + let (ws_stream, _) = connect_async_tls_with_config(request, None, false, None) + .await + .map_err(|e| format!("WebSocket connect failed: {e}"))?; + + let (mut write, mut read) = ws_stream.split(); + + // 1. Wait for session.created + wait_for_type(&mut read, "session.created").await?; + eprintln!("[voice-ime] WS: session.created"); + + // 2. Send session.update (VAD mode) + let session_update = serde_json::json!({ + "event_id": "evt_session_update", + "type": "session.update", + "session": { + "modalities": ["text"], + "input_audio_format": "pcm16", + "sample_rate": 16000, + "input_audio_transcription": { + "language": "zh" + }, + "turn_detection": { + "type": "server_vad", + "threshold": 0.0, + "silence_duration_ms": 400 + } + } + }); + write + .send(Message::Text(session_update.to_string().into())) + .await + .map_err(|e| format!("Send session.update failed: {e}"))?; + + // 3. Wait for session.updated + wait_for_type(&mut read, "session.updated").await?; + eprintln!("[voice-ime] WS: session.updated, streaming audio..."); + + // 4. Spawn sender task: forwards audio as base64 JSON events + let (finish_tx, mut finish_rx) = mpsc::channel::<()>(1); + + let send_task = tokio::spawn(async move { + let mut seq = 0u64; + loop { + tokio::select! { + biased; + _ = stop_rx.recv() => { + // Drain remaining audio + while let Ok(chunk) = audio_rx.try_recv() { + let _ = send_audio(&mut write, &chunk, &mut seq).await; + } + // Send session.finish + let finish = serde_json::json!({ + "event_id": "evt_finish", + "type": "session.finish" + }); + let _ = write.send(Message::Text(finish.to_string().into())).await; + let _ = finish_tx.send(()).await; + break; + } + chunk = audio_rx.recv() => { + match chunk { + Some(data) => { + if send_audio(&mut write, &data, &mut seq).await.is_err() { + break; + } + } + None => { + // Audio channel closed + let finish = serde_json::json!({ + "event_id": "evt_finish", + "type": "session.finish" + }); + let _ = write.send(Message::Text(finish.to_string().into())).await; + let _ = finish_tx.send(()).await; + break; + } + } + } + } + } + }); + + // 5. Receive task: process server events + let recv_task = tokio::spawn(async move { + let mut finish_sent = false; + loop { + tokio::select! { + biased; + _ = finish_rx.recv(), if !finish_sent => { + finish_sent = true; + // Keep reading until session.finished + } + msg = read.next() => { + match msg { + Some(Ok(Message::Text(text))) => { + let v: Value = match serde_json::from_str(&text) { + Ok(v) => v, + Err(_) => continue, + }; + let event_type = v["type"].as_str().unwrap_or(""); + match event_type { + "conversation.item.input_audio_transcription.text" => { + let text_part = v["text"].as_str().unwrap_or("").to_string(); + let stash = v["stash"].as_str().unwrap_or("").to_string(); + on_event(AsrEvent::Partial { text: text_part, stash }); + } + "conversation.item.input_audio_transcription.completed" => { + let transcript = v["transcript"].as_str().unwrap_or("").to_string(); + eprintln!("[voice-ime] Segment completed: {transcript}"); + on_event(AsrEvent::SegmentCompleted { transcript }); + } + "session.finished" => { + eprintln!("[voice-ime] WS: session.finished"); + return; + } + "error" => { + let msg = v["error"]["message"].as_str().unwrap_or("unknown"); + eprintln!("[voice-ime] ASR error: {msg}"); + return; + } + _ => {} // ignore speech_started, speech_stopped, committed, etc. + } + } + Some(Ok(_)) => {} // ping/pong/binary + Some(Err(e)) => { + eprintln!("[voice-ime] WS read error: {e}"); + return; + } + None => return, + } + } + } + } + }); + + let _ = send_task.await; + let _ = recv_task.await; + + Ok(()) +} + +/// Send a PCM audio chunk as a base64-encoded input_audio_buffer.append event. +async fn send_audio(write: &mut S, pcm_bytes: &[u8], seq: &mut u64) -> Result<(), String> +where + S: futures_util::Sink + Unpin, + S::Error: std::fmt::Display, +{ + let encoded = STANDARD.encode(pcm_bytes); + *seq += 1; + let event = serde_json::json!({ + "event_id": format!("evt_audio_{seq}"), + "type": "input_audio_buffer.append", + "audio": encoded + }); + write + .send(Message::Text(event.to_string().into())) + .await + .map_err(|e| format!("Send audio failed: {e}")) +} + +/// Read messages until one matches the expected type. +async fn wait_for_type(read: &mut S, expected: &str) -> Result +where + S: futures_util::Stream> + Unpin, +{ + loop { + match read.next().await { + Some(Ok(Message::Text(text))) => { + let v: Value = serde_json::from_str(&text) + .map_err(|e| format!("Parse JSON failed: {e}"))?; + let t = v["type"].as_str().unwrap_or(""); + if t == expected { + return Ok(v); + } + if t == "error" { + let msg = v["error"]["message"].as_str().unwrap_or("unknown"); + return Err(format!("Server error: {msg}")); + } + // Ignore other event types while waiting + } + Some(Ok(_)) => {} // ignore non-text + Some(Err(e)) => return Err(format!("WS read error: {e}")), + None => return Err("Connection closed unexpectedly".to_string()), + } + } +}