diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..afcb428 --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,2 @@ +[target.aarch64-unknown-linux-gnu] +rustflags = ["-C", "target-feature=+fp16"] diff --git a/.github/workflows/rust_ci.yml b/.github/workflows/rust_ci.yml index c017764..a41be93 100644 --- a/.github/workflows/rust_ci.yml +++ b/.github/workflows/rust_ci.yml @@ -41,3 +41,47 @@ jobs: - name: Build binary run: cargo build --release + + build-aarch64: + name: Build (aarch64) + runs-on: ubuntu-latest + container: + image: debian:bookworm-slim + steps: + - name: Install base dependencies + shell: bash + run: | + set -euo pipefail + export DEBIAN_FRONTEND=noninteractive + dpkg --add-architecture arm64 + apt-get update + apt-get install -y --no-install-recommends \ + ca-certificates \ + pkg-config \ + libssl-dev \ + libssl-dev:arm64 \ + gcc-aarch64-linux-gnu \ + libc6-dev-arm64-cross \ + build-essential \ + git \ + curl \ + unzip \ + cmake + + - name: Check out repository + uses: actions/checkout@v4 + + - name: Set up Rust toolchain + uses: dtolnay/rust-toolchain@stable + + - name: Add Rust target + run: rustup target add aarch64-unknown-linux-gnu + + - name: Build binary + env: + CC_aarch64_unknown_linux_gnu: aarch64-linux-gnu-gcc + AR_aarch64_unknown_linux_gnu: aarch64-linux-gnu-ar + CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc + PKG_CONFIG_ALLOW_CROSS: "1" + PKG_CONFIG_PATH: /usr/lib/aarch64-linux-gnu/pkgconfig + run: cargo build --release --target aarch64-unknown-linux-gnu diff --git a/README.md b/README.md index 415132e..ceef3f6 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,12 @@ Edit `config.toml` to customize the VAD, ASR, LLM, TTS services, as well as prom cargo build --release ``` +**Note for aarch64 (ARM64) builds:** When cross-compiling for aarch64, the required `fp16` target feature is automatically enabled via `.cargo/config.toml`. If building natively on aarch64, you may need to set: + +``` +RUSTFLAGS="-C target-feature=+fp16" cargo build --release +``` + ### Configure AI services The `config.toml` can use any combination of open-source or proprietary AI services, as long as they offer OpenAI-compatible API endpoints. Here are instructions to start open source AI servers for the EchoKit server. diff --git a/src/main.rs b/src/main.rs index 97d6f4a..eea9bca 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,6 +7,7 @@ use axum::{ use clap::Parser; use config::Config; +#[allow(deprecated)] use crate::{config::ASRConfig, services::realtime_ws::StableRealtimeConfig}; pub mod ai; @@ -55,9 +56,11 @@ async fn routes( }); let mut tool_set = ai::openai::tool::ToolSet::default(); + #[allow(deprecated)] let mut real_config: Option = None; // todo: support other configs + #[allow(deprecated)] match &config.config { config::AIConfig::Stable { llm: config::LLMConfig::OpenAIChat(chat_llm), @@ -173,6 +176,7 @@ async fn routes( ))) .layer(axum::Extension(record_config.clone())); + #[allow(deprecated)] if let Some(real_config) = real_config { log::info!( "Adding realtime WebSocket handler with config: {:?}", diff --git a/src/services/realtime_ws.rs b/src/services/realtime_ws.rs index 282730f..e648f0f 100644 --- a/src/services/realtime_ws.rs +++ b/src/services/realtime_ws.rs @@ -1,3 +1,5 @@ +#![allow(deprecated)] + use axum::{ extract::{Extension, WebSocketUpgrade, ws::WebSocket}, response::IntoResponse,