Moltis - 语音交互一站式方案
约 1274 字大约 4 分钟
2026-03-07
语音交互一站式方案 - 集成语音识别、语音合成、记忆管理的完整 AI Agent,本地语音处理无需云端 API。
核心特性
本地语音处理
- 内置 C++ TTS/STT 引擎绑定
- 无需云端语音 API
- 隐私数据不上传
- 离线可用
完整语音链路
- 语音识别 (STT)
- 自然语言理解 (NLU)
- 对话管理 (DM)
- 自然语言生成 (NLG)
- 语音合成 (TTS)
嵌入式数据库
- SQLite 持久化存储
- 对话历史记录
- 用户偏好管理
- 快速检索
MCP 协议支持
- 标准 MCP 接口
- 工具调用能力
- 插件扩展机制
- 与其他系统集成
快速开始
系统要求
- Rust 1.70+
- CMake 3.15+
- C++ 编译器 (GCC 9+ / Clang 10+)
- 4GB+ RAM
- 麦克风和扬声器
安装
# 克隆仓库
git clone https://github.com/moltis-org/moltis.git
cd moltis
# 安装依赖
# Ubuntu/Debian
sudo apt-get install libasound2-dev portaudio19-dev
# macOS
brew install portaudio
# 构建
cargo build --release配置
创建 config.toml:
[audio]
input_device = "default"
output_device = "default"
sample_rate = 16000
[stt]
model = "vosk-model-small-cn-0.22"
language = "zh-CN"
[tts]
engine = "piper"
voice = "zh_CN-huayan-medium"
speed = 1.0
[llm]
provider = "anthropic"
model = "claude-3-5-sonnet-20241022"
api_key = "your_api_key"
[database]
path = "./data/moltis.db"启动
# 启动服务
./target/release/moltis --config config.toml
# 交互模式
./target/release/moltis --interactive技术架构
语音识别 (STT)
Vosk 引擎
use vosk::{Model, Recognizer};
let model = Model::new("model")?;
let mut recognizer = Recognizer::new(&model, 16000.0)?;
// 识别音频
recognizer.accept_waveform(&audio_data);
let result = recognizer.result();Whisper 引擎
use whisper_rs::{WhisperContext, FullParams};
let ctx = WhisperContext::new("ggml-base.bin")?;
let params = FullParams::new(SamplingStrategy::Greedy { best_of: 1 });
// 转录音频
ctx.full(params, &audio_data)?;
let text = ctx.full_get_segment_text(0)?;语音合成 (TTS)
Piper 引擎
use piper::{PiperConfig, PiperVoice};
let config = PiperConfig::from_file("voice.json")?;
let voice = PiperVoice::new(config)?;
// 合成语音
let audio = voice.synthesize("你好,我是 Moltis")?;eSpeak-NG 引擎
use espeak_ng_sys::*;
unsafe {
espeak_Initialize(AUDIO_OUTPUT_PLAYBACK, 0, null(), 0);
espeak_Synth("Hello, I am Moltis",
strlen("Hello, I am Moltis"),
0, POS_CHARACTER, 0,
espeakCHARS_AUTO, null_mut(), null_mut());
}音频处理
use cpal::{Device, Stream, StreamConfig};
// 音频输入流
let input_stream = device.build_input_stream(
&config,
move |data: &[f32], _: &cpal::InputCallbackInfo| {
// 处理音频数据
process_audio(data);
},
|err| eprintln!("Error: {}", err),
)?;
// 音频输出流
let output_stream = device.build_output_stream(
&config,
move |data: &mut [f32], _: &cpal::OutputCallbackInfo| {
// 输出音频数据
output_audio(data);
},
|err| eprintln!("Error: {}", err),
)?;对话管理
pub struct DialogueManager {
context: Vec<Message>,
state: DialogueState,
db: SqliteConnection,
}
impl DialogueManager {
pub async fn process(&mut self, text: &str) -> Result<String> {
// 更新上下文
self.context.push(Message::user(text));
// 调用 LLM
let response = self.call_llm().await?;
// 存储历史
self.save_to_db(&response)?;
Ok(response)
}
}功能特性
唤醒词检测
use porcupine::Porcupine;
let porcupine = Porcupine::new(
access_key,
&["嘿,小助手"],
&[0.5],
)?;
// 检测唤醒词
let keyword_index = porcupine.process(&audio_frame)?;
if keyword_index >= 0 {
println!("唤醒词检测到!");
}语音活动检测 (VAD)
use webrtc_vad::Vad;
let mut vad = Vad::new();
vad.set_mode(webrtc_vad::Mode::VeryAggressive);
// 检测语音活动
let is_speech = vad.is_voice_segment(&audio_data)?;噪声抑制
use rnnoise::DenoiseState;
let mut denoiser = DenoiseState::new();
// 降噪处理
denoiser.process_frame(&mut audio_frame);回声消除
use speexdsp::echo::EchoCanceller;
let mut canceller = EchoCanceller::new(frame_size, filter_length);
// 消除回声
canceller.cancellation(&input, &output, &mut result);适用场景
家庭语音中控
- 智能家居控制
- 家庭助手
- 儿童陪伴机器人
智能音箱
- 音乐播放控制
- 天气查询
- 新闻播报
车载系统
- 导航控制
- 电话拨打
- 信息查询
无障碍辅助
- 视障人士助手
- 语音输入法
- 语音阅读器
性能指标
| 指标 | 数值 |
|---|---|
| STT 延迟 | < 500ms |
| TTS 延迟 | < 300ms |
| 端到端延迟 | < 2s |
| 内存占用 | ~500MB |
| CPU 占用 | 10-30% |
| 识别准确率 | > 95% (安静环境) |
支持的语言
语音识别
- 中文 (普通话)
- 英语
- 日语
- 韩语
- 法语
- 德语
- 西班牙语
语音合成
- 中文 (多种音色)
- 英语 (多种口音)
- 其他主流语言
开发指南
自定义唤醒词
// 训练自定义唤醒词
let trainer = WakeWordTrainer::new();
trainer.add_samples("你的唤醒词", &samples);
let model = trainer.train()?;
model.save("custom_wakeword.ppn")?;添加自定义 TTS 音色
// 加载自定义音色
let voice = PiperVoice::from_file("custom_voice.onnx")?;
let config = VoiceConfig {
speed: 1.0,
pitch: 1.0,
volume: 1.0,
};集成外部工具
// MCP 工具注册
let tool = Tool::new("weather")
.description("查询天气")
.parameter("city", ParameterType::String)
.handler(|params| {
let city = params.get("city")?;
get_weather(city)
});
moltis.register_tool(tool);与其他版本对比
vs 官方版
- 官方版无语音能力,Moltis 专注语音
- 官方版需要接第三方 API,Moltis 本地处理
- Moltis 是官方版的语音增强版
vs ClawWork
- ClawWork 专注任务交付,Moltis 专注语音交互
- ClawWork 无语音能力,Moltis 是语音优先
- 两者可以结合使用
vs VisionClaw
- VisionClaw 专注视觉,Moltis 专注语音
- 两者都是多模态方向的探索
- 可以融合成视觉+语音的完整方案
相关链接
- GitHub: moltis-org/moltis
- 文档: 完整文档
- 语音模型: 模型下载
- 问题反馈: Issues
贡献
欢迎语音技术相关的贡献!
# 克隆仓库
git clone https://github.com/moltis-org/moltis.git
# 运行测试
cargo test
# 运行语音测试
cargo test --features audio-test许可证
Apache 2.0 License - 详见 LICENSE