audio_cpp/lib.rs
1//! # audio-cpp
2//!
3//! audio.cpp(基于 ggml 的本地音频推理引擎)的高层安全 Rust 封装。
4//!
5//! 底层 FFI 位于 [`audio_cpp_sys`];本 crate 在其之上提供类型安全的
6//! 注册表 / 模型 / 会话 API,并将所有跨 C 边界的资源管理(句柄释放、
7//! 字符串所有权、事件回调)封装在安全的 `Drop` 与类型系统中。
8//!
9//! ## 快速上手
10//!
11//! 枚举引擎能力:
12//! ```no_run
13//! use audio_cpp::Registry;
14//! let registry = Registry::new()?;
15//! println!("模型族: {:?}", registry.families()?);
16//! println!("设备: {:?}", Registry::devices()?);
17//! # Ok::<(), audio_cpp::Error>(())
18//! ```
19//!
20//! 加载模型并做一次离线 VAD(需 silero 权重与 wav 文件):
21//! ```no_run
22//! use audio_cpp::{Backend, Registry, Request, RunMode, TaskKind};
23//!
24//! let registry = Registry::new()?;
25//! let model = registry.load("./silero_vad_16k.safetensors", None, None)?;
26//! let session = model.create_task_session(
27//! TaskKind::Vad,
28//! RunMode::Offline,
29//! Backend::Cpu,
30//! 0,
31//! 4,
32//! None,
33//! )?;
34//! let result = session.run_offline(
35//! Request::vad("./sample.wav").option(audio_cpp::options::request::THRESHOLD, 0.5),
36//! )?;
37//! for seg in &result.speech_segments {
38//! println!("语音: {:?}..{:?} 置信度={}", seg.span.start_sample, seg.span.end_sample, seg.confidence);
39//! }
40//! # Ok::<(), audio_cpp::Error>(())
41//! ```
42//!
43//! ## 资源生命周期
44//!
45//! - [`Registry`]、[`Model`]、[`Session`] 各自持有 C 句柄并在 `Drop` 中释放;
46//! - 所有权内部共享:[`Model`] 共享持有 C 注册表,[`Session`] 亦然。
47//! 因此加载/建会话之后即可释放上游持有者,无需 `_registry` / `_model`
48//! 三件套:
49//! ```no_run
50//! use audio_cpp::{Backend, Registry, Request, RunMode, TaskKind};
51//! // 会话创建后,model / registry 可被释放
52//! let session = {
53//! let registry = Registry::new()?;
54//! let model = registry.load("./model.gguf", None, None)?;
55//! model.create_task_session(
56//! TaskKind::Asr, RunMode::Offline, Backend::Cpu, 0, 4, None,
57//! )?
58//! };
59//! let _ = session.run_offline(Request::asr("./sample.wav"))?;
60//! # Ok::<(), audio_cpp::Error>(())
61//! ```
62//! - **`Session` 独立于 `Model` 存活**(已验证族):上游会话持有权重/资产的共享所有权
63//! (`shared_ptr`,如 silero_vad 与 spec_backed 系列;本轮升级新增的 `yue2` /
64//! `sheetsage2` 同样自持资产,已核对源码确认)。
65//! 注意这是各上游 loader 的实现选择而非类型系统保证:若未来某 loader
66//! 返回借用模型内存的会话,本签名无法在编译期拦截。升级上游 loader 时须
67//! 确认新会话自持资产(见 AGENTS.md 升级检查清单)。
68//! - 流式会话的事件回调要求 `Send` 闭包,回调可来自 C++ 侧线程。
69//!
70//! ## 便捷封装
71//!
72//! - [`StreamingSession`]:流式会话的一体化封装,自动收集事件回调,
73//! [`Session::process_audio`] 的逐事件返回与回调重复问题由它消除
74//! (`push_audio` 直接返回 `Vec<StreamEvent>`)。
75//! - [`ModelFamily::from_path`]:按文件名关键词推断模型族,GGUF 加载时
76//! 无需再手写家族匹配表;也支持 `#family=xxx` 片段显式覆盖。
77//! - [`Request::align`]:强制对齐请求(音频 + 文本 + 语言),结果的逐词
78//! 时间戳在 [`TaskResult::word_timestamps`]。
79//! - [`options`]:源码级核实过的选项键常量(`request` 随请求走,`session`
80//! 随会话走)与 [`options::SessionOptions`] 会话选项构造器;键名拼错在
81//! 编译期暴露,避免无类型字符串键被上游静默忽略。
82
83pub use audio_cpp_sys;
84
85mod error;
86pub use error::Error;
87
88mod ffi;
89
90mod request;
91pub use request::{
92 AlignRequest, AudioInput, AudioRequest, IntoRequest, Request, TtsRequest, VoiceCondition,
93};
94
95pub mod options;
96
97mod types;
98pub use types::{
99 AudioBufferInfo, Backend, Capabilities, CliInterface, CliOption, Device, LoaderInfo,
100 ModelFamily, ModelInspection, ModelMetadata, NamedAsset, NamedAudioOutput, RunMode,
101 SpeakerTurn, SpeechSegment, StreamEvent, StreamingPolicy, SupportedTask, TaskKind, TaskResult,
102 TextOutput, TimeSpan, VoiceActivityEvent, VoiceArtifact, WordTimestamp,
103};
104
105mod registry;
106pub use registry::Registry;
107
108mod model;
109pub use model::Model;
110
111pub mod session;
112pub use session::{Session, StreamingSession};
113
114mod audio;
115pub use audio::{WavAudio, load_wav};