模型与部署
文件结构
apps/server/
├── src/ # 服务端主入口(CLI、Downloader、Config 加载)
│ ├── main.rs # 二进制入口
│ ├── mod.rs # run() / async_main()
│ ├── server.rs # Server 生命周期(包装 api::server::Server)
│ ├── clap.rs # CLI 参数:serve / downloader
│ └── downloader/ # 模型下载系统(manifest、checksum、mirror)
├── api/ # HTTP 路由、AI Manager、WebSocket 处理
│ └── src/
│ ├── lib.rs # start() / create_router()
│ ├── config/ # Config 定义(figment 分层加载)
│ ├── server.rs # 服务端运行时状态
│ ├── auth.rs # 认证路由(login / refresh / reset_password)
│ ├── index.rs # Health / Version 端点
│ ├── ota.rs # OTA 固件升级
│ ├── device.rs # 设备管理(admin CRUD)
│ ├── ws/ # WebSocket 处理器(核心实时管道 + filter)
│ ├── component/ # AI 引擎实现(Manager + 模型)
│ │ ├── asr/ # ASR Manager + 模型(XAsr)
│ │ ├── tts/ # TTS Manager + 模型(MatchaTTS)
│ │ ├── vad/ # VAD Manager + 模型(Earshot)
│ │ ├── llm/ # LLM Manager + 模型(Qwen3 / Echo)
│ │ ├── mcp/ # MCP Server + Client(rmcp Streamable HTTP)
│ │ └── ling/ # LingCore:LLM + MCP 编排(实现 Ling trait)
│ ├── record/ # 会话录制 REST API
│ ├── matrix/ # Matrix 聊天集成
│ └── common/ # 共享辅助(device selection、errors)
├── service/ # 业务逻辑层(trait 定义 + 编排框架)
│ └── src/
│ ├── component/ # 引擎契约(trait + 协议类型)
│ │ ├── asr.rs / tts.rs / vad.rs
│ │ ├── llm/ # Llm trait + ChatMessage / ToolDef
│ │ └── mcp/ # McpClient trait + McpRegistry
│ ├── ling/ # Ling trait(决策引擎)
│ ├── pipeline/ # Node / NodeChain / PipelineEvent(外层节点链)+ nodes/
│ ├── session/ # Session 状态机 + Round 生命周期(含 TurnEvent)
│ ├── message/ # 线协议消息定义(Hello / Abort / Audio / LLM / TTS 等)
│ ├── frame.rs # Frame / FrameResult / OutputMessage
│ └── types.rs # 共享类型(EmptyKind / Sentence / Input / OutputBlock)
├── entity/ # Sea-ORM Entity(user / session / round / round_data / frame / config)
├── migration/ # 数据库迁移
└── web/ # 静态文件服务(SPA)数据流
客户端消息经 ProtocolTranslator 转成内部 Frame、过入站过滤器后进入 Session,出站反向经过滤器与 translator 回到 WebSocket。链路图与各段职责见核心架构。
配置系统
配置使用 figment 分层加载,优先级从低到高:
VANLING_CONFIG环境变量指向的 TOML 文件- CLI
--config指定路径(可多个,会合并) VANLING_前缀环境变量(VANLING_LLM_MODEL等)- CLI
-O key=value覆盖
热重载
config::Manager 使用 AtomicPtr<Config> + 线程本地缓存(8 槽历史记录)实现无锁热重载。配置变更时旧版本仍被引用中的协程安全持有,新版本即时生效。
主要配置项
| 分类 | 键 | 默认值 | 说明 |
|---|---|---|---|
| 服务器 | address | 127.0.0.1 | 监听地址 |
| 服务器 | port | 3000 | 监听端口 |
| 数据库 | database_url | sqlite://db.sqlite?mode=rwc | SQLite 或 PostgreSQL URL |
| 认证 | auth_access_token_secret | QLjJTeVblAlM47de | JWT 签名密钥 |
| TTS | tts_model | matcha_tts | 模型选择 |
| ASR | asr_model | x_asr | 模型选择 |
| LLM | llm_provider | local_qwen3 | 模型选择 |
| VAD | vad_model | earshot | 模型选择 |
| Session | silence_voice_timeout | 1200 | 静默超时 (ms) |
| 日志 | log_console_enabled | true | 控制台日志 |
| Matrix | matrix_enable | false | Matrix 集成 |
完整配置示例见 application-example.toml。
资产安装
vanling-server downloader 按 manifest 拉取模型并校验 SHA256,安装路径再经 derive_*_path 注入配置;子命令、manifest 格式、镜像回退与交互式向导见模型下载器。
# 从 apps/server/ 目录执行
moon run server:run -- downloader install --data-dir ../../data --all
moon run server:run -- downloader wizard --data-dir ../../data模型
LLM
| 模型 | 内存 | 文件大小 | 备注 |
|---|---|---|---|
| Qwen3-0.6B (Candle-GGUF) | ~1GB | 0.6B GGUF | Qwen3-0.6B-Q4_K_M.gguf |
| Qwen3-1.7B (Candle-GGUF) | ~2.5GB | 1.11GB | Qwen3-1.7B-Q4_K_M.gguf |
| Echo | 0 | 0 | 回显(测试用) |
ASR
| 模型 | 内存 | 文件大小 | 语言 | CER (TTS 闭环) |
|---|---|---|---|---|
| XAsr (sherpa-onnx) | ~600MB | ~50MB | 中/英 | — |
| Void | 0 | 0 | — | —(测试用) |
TTS
| 模型 | 内存 | 文件大小 | 备注 |
|---|---|---|---|
| MatchaTts (sherpa-onnx) | ~500MB | 72MB + 76MB (vocoder) | 中文/中英双语 |
| Mute | 0 | 0 | 静音(测试用) |
VAD
| 模型 | 内存 | 文件大小 | 备注 |
|---|---|---|---|
| Earshot (Silero VAD) | ~10MB | 内嵌 | 纯 Rust 实现,无 ONNX |
| Void | 0 | 0 | 固定返回有声(测试用) |
Fedora 43 CUDA 安装与配置
sudo sh cuda_12.8.1_570.124.06_linux.run --toolkit --no-drm --silent --overrideexport PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/cuda/lib64conda create -n cuda
conda install conda-forge::gcc==14.3.0
conda install conda-forge::gxx==14.3.0
conda install anaconda::openssl
conda activate cuda
# 开始开发...参考规范
https://rust-lang.github.io/api-guidelines/
https://rust-coding-guidelines.github.io/rust-coding-guidelines-zh/overview.html