Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
ed54ed8
feat(voice): extract reusable voice session runtime
johnmatthewtennant Aug 29, 2026
21d8de9
feat(voice): add shared outbound playback coordinator
johnmatthewtennant Aug 29, 2026
2153ef7
refactor(voice): share OpenAI outbound playback
johnmatthewtennant Aug 29, 2026
a7ecd2f
refactor(voice): share Pocket outbound playback
johnmatthewtennant Aug 29, 2026
1be7ce0
fix(voice): snapshot Pocket playback rate
johnmatthewtennant Aug 29, 2026
321fef6
refactor(voice): share Siri outbound playback
johnmatthewtennant Aug 29, 2026
01f7ae9
feat(voice): enforce shared playback admission
johnmatthewtennant Aug 29, 2026
e5febf9
feat(voice): add device-free TTS benchmarks
johnmatthewtennant Aug 29, 2026
f49a8eb
feat(voice): add device-free STT benchmarks
johnmatthewtennant Aug 29, 2026
60ccb99
fix(voice): enter runtime for OpenAI STT timers
johnmatthewtennant Aug 29, 2026
cfd2994
fix(voice): distinguish TTS benchmark cache scenarios
johnmatthewtennant Aug 29, 2026
8f1a7ab
feat(voice): measure sustained TTS signal onset
johnmatthewtennant Aug 30, 2026
d5270d4
fix(voice): default sessions to native engines
johnmatthewtennant Aug 31, 2026
04232ea
fix(voice): clarify macOS speech availability
johnmatthewtennant Aug 31, 2026
c959134
feat(voice): support live TTS configuration
johnmatthewtennant Aug 31, 2026
fc1bb1e
feat(voice): own input policy during speech
johnmatthewtennant Aug 31, 2026
eb28dcd
feat(voice): share Siri voice management
johnmatthewtennant Aug 31, 2026
85f2e57
feat(voice): add management CLI
johnmatthewtennant Sep 1, 2026
19728c6
refactor(voice): share local asset catalogs
johnmatthewtennant Sep 1, 2026
fc7561d
feat(voice): share local model installation
johnmatthewtennant Sep 1, 2026
b7ba49d
feat(voice): expose local model management
johnmatthewtennant Sep 1, 2026
64ebe22
Move session playback to host PCM
johnmatthewtennant Sep 1, 2026
dd73433
Add standalone WAV synthesis
johnmatthewtennant Sep 1, 2026
098cd4a
Contain voice input shutdown races
johnmatthewtennant Sep 1, 2026
20da6a7
Decouple Parakeet inference from capture
johnmatthewtennant Sep 1, 2026
8cd20bc
Fix remote voice playback truncation
johnmatthewtennant Sep 1, 2026
6ab3934
Resume speech after false barge-in
johnmatthewtennant Sep 1, 2026
919532c
feat(voice): report interrupted speech progress
johnmatthewtennant Sep 2, 2026
cfc182f
Fix prepared speech wire field
johnmatthewtennant Sep 2, 2026
57e8840
Validate prepared speech wire contract
johnmatthewtennant Sep 3, 2026
9f5c30f
fix(voice): address landing review
johnmatthewtennant Sep 3, 2026
c6d5c3a
fix(voice): bound startup and inert speech
johnmatthewtennant Sep 3, 2026
fc65676
fix(voice): retire inert held speech
johnmatthewtennant Sep 3, 2026
3688a91
fix(voice): preserve portable host modules
johnmatthewtennant Sep 3, 2026
7b04159
fix(voice): keep shared speech policy portable
johnmatthewtennant Sep 3, 2026
57404e2
fix(voice): expose portable sensitivity mapping
johnmatthewtennant Sep 3, 2026
c368a90
fix(voice): gate playback claims by target
johnmatthewtennant Sep 3, 2026
5cba371
refactor(voice): make runtime boundary self-contained
johnmatthewtennant Sep 3, 2026
9a67183
fix(voice): bound external session startup
johnmatthewtennant Sep 3, 2026
9fbcecc
style(voice): stabilize startup formatting
johnmatthewtennant Sep 3, 2026
0e50fb4
Fix voice runtime lifecycle edge cases
johnmatthewtennant Sep 3, 2026
f7448d1
style(voice): stabilize OpenAI lifecycle formatting
johnmatthewtennant Sep 3, 2026
ab682e5
style(voice): avoid platform rustfmt drift
johnmatthewtennant Sep 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion scripts/test-siri-tts-stream-regression.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ clang \
-framework AVFoundation \
-framework AudioToolbox \
-framework CoreAudio \
"$repo_root/src-tauri/native/tests/siri_tts_stream_regression.m" \
"$repo_root/src-tauri/crates/berd-voice/native/tests/siri_tts_stream_regression.m" \
-o "$test_binary"

"$test_binary"
41 changes: 33 additions & 8 deletions src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 0 additions & 21 deletions src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ exclude = ["plugins/app-test-driver"]

[build-dependencies]
tauri-build = { version = "2", features = [] }
cc = "1"

[target.'cfg(target_os = "macos")'.build-dependencies]
swift-rs = { version = "1.0.7", features = ["build"] }
Expand All @@ -34,7 +33,6 @@ anyhow = "1"
base64 = "0.22"
builderbot-auth = { path = "../crates/builderbot-auth", features = ["blocking-client"] }
bytes = "1"
bzip2 = "0.6"
berd-voice = { path = "crates/berd-voice", features = ["static"] }
chrono = { version = "0.4", features = ["serde"] }
dirs = "6.0.0"
Expand All @@ -58,24 +56,7 @@ plist = "1"
portable-pty = "0.9.0"
reqwest = { version = "0.13.3", default-features = false, features = ["json", "multipart", "rustls", "stream"] }
rodio = { version = "0.22", default-features = false }
audioadapter-buffers = "3.0"
earshot = "1.0"
rubato = "3.0"
tar = "0.4"
# Held below 1.13: sherpa-onnx-sys downloads prebuilt native libs into a
# version-stamped dir under the target dir, and rust-cache strips the files out
# of it when saving. The restored empty skeleton defeats the build script's
# `lib_dir.is_dir()` early return, so it never re-downloads and linking fails
# with "could not find native static library `sherpa-onnx-c-api`". CI's Linux
# cache is poisoned for v1.13.5; this pin resolves to a path the cache has
# never gutted. Tilde, not caret — `^1.12` floats back to 1.13.5.
#
# NOTE: sherpa-onnx-sys is the crate whose version actually names that path,
# and it declares `^1.12.40`, so nothing in this manifest constrains it — it is
# held at 1.12.40 by Cargo.lock alone. A bare `cargo update` floats it back to
# 1.13.5 and reintroduces the CI failure; re-pin it with
# `cargo update -p sherpa-onnx-sys --precise 1.12.40`.
sherpa-onnx = "~1.12.40"
semver = "1"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
Expand All @@ -100,8 +81,6 @@ tauri-plugin-updater = "2"
tauri-plugin-window-state = "2"
time = { version = "0.3", features = ["formatting"] }
tokio = { version = "1.50.0", features = ["full"] }
tokio-tungstenite = { version = "0.27", features = ["rustls-tls-webpki-roots"] }
rustls = { version = "0.23", default-features = false, features = ["aws_lc_rs", "std", "tls12"] }
url = "2"
uuid = { version = "1", features = ["v4", "serde"] }
zip = { version = "2", default-features = false, features = ["deflate"] }
Expand Down
9 changes: 0 additions & 9 deletions src-tauri/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,6 @@ fn main() {

#[cfg(target_os = "macos")]
{
println!("cargo:rerun-if-changed=native/siri_tts_bridge.h");
println!("cargo:rerun-if-changed=native/siri_tts_bridge.m");
cc::Build::new()
.file("native/siri_tts_bridge.m")
.flag("-fobjc-arc")
.compile("berd_siri_tts_bridge");
for framework in ["Foundation", "AVFoundation", "AudioToolbox", "CoreAudio"] {
println!("cargo:rustc-link-lib=framework={framework}");
}
if std::env::var("CARGO_CFG_TARGET_OS").as_deref() == Ok("macos") {
swift_rs::SwiftLinker::new("14.0")
.with_package("BerdAirPodsBridge", "swift/BerdAirPodsBridge")
Expand Down
46 changes: 45 additions & 1 deletion src-tauri/crates/berd-voice/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,65 @@
name = "berd-voice"
version = "0.1.0"
edition = "2021"
license = "Apache-2.0"
# Rust sources are Apache-2.0; the embedded LibriSpeech benchmark fixture is
# CC-BY-4.0 and carries its attribution notice in every benchmark report.
license = "Apache-2.0 AND CC-BY-4.0"
repository = "https://github.com/block/berd"
description = "Device-local voice primitives for Berd"

[[bin]]
name = "berd-voice"
path = "src/main.rs"

[features]
default = ["static"]
static = ["sherpa-onnx/static"]
shared = ["sherpa-onnx/shared"]

[dependencies]
audioadapter-buffers = "3.0"
base64 = "0.22"
bzip2 = "0.6"
claxon = "0.4.3"
earshot = "1.0"
fs2 = "0.4"
futures-util = "0.3"
hound = "3.5"
libc = "0.2"
ort = { version = "=2.0.0-rc.12", default-features = false, features = ["api-24", "ndarray", "std"] }
ort-sys = { version = "=2.0.0-rc.12", features = ["disable-linking"] }
rand = "0.10"
reqwest = { version = "0.13.3", default-features = false, features = ["json", "rustls", "stream"] }
rubato = "3.0"
rustls = { version = "0.23", default-features = false, features = ["aws_lc_rs", "std", "tls12"] }
sentencepiece-model = "0.1"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
sha2 = "0.10"
tar = "0.4"
tempfile = "3"
# Held below 1.13: sherpa-onnx-sys downloads prebuilt native libs into a
# version-stamped dir under the target dir, and rust-cache strips the files out
# of it when saving. The restored empty skeleton defeats the build script's
# `lib_dir.is_dir()` early return, so it never re-downloads and linking fails
# with "could not find native static library `sherpa-onnx-c-api`". CI's Linux
# cache is poisoned for v1.13.5; this pin resolves to a path the cache has
# never gutted. Tilde, not caret — `^1.12` floats back to 1.13.5.
#
# NOTE: sherpa-onnx-sys is the crate whose version actually names that path,
# and it declares `^1.12.40`, so nothing in this manifest constrains it — it is
# held at 1.12.40 by Cargo.lock alone. A bare `cargo update` floats it back to
# 1.13.5 and reintroduces the CI failure; re-pin it with
# `cargo update -p sherpa-onnx-sys --precise 1.12.40`.
sherpa-onnx = { version = "~1.12.40", default-features = false }
tokenizers = { version = "0.22", default-features = false, features = ["fancy-regex"] }
tokio = { version = "1", features = ["fs", "io-util", "rt-multi-thread", "macros", "net", "sync", "time"] }
tokio-tungstenite = { version = "0.27", features = ["rustls-tls-webpki-roots"] }
uuid = { version = "1", features = ["v4"] }

[target.'cfg(target_os = "macos")'.dependencies]
coreaudio-rs = "0.14.2"

[target.'cfg(target_os = "macos")'.build-dependencies]
cc = "1"
swift-rs = { version = "1.0.7", features = ["build"] }
Loading