基于 LLM 的实时语音对话 Android 应用,全链路流式处理,无需后端服务器。
个人项目,客户端直连 API,零运维成本。
- 🎤 长按说话 — 按住麦克风录音,松开自动识别
- 🤫 VAD 自动检测 — 静音 800ms 自动判定说话结束
- 🧠 LLM 流式对话 — 逐 token 生成,不等完整回复
- 🔊 边生成边播 — 遇到断句即送 TTS,流式播放
- 🔧 一键切换模型 — 改一行配置即可换 OpenAI / DeepSeek / 智谱 / 通义等
- 📱 纯 Android — Flutter 构建,个人使用优先
┌─────────────────────────────────────────────────┐
│ Flutter App │
│ │
│ 🎤 录音 → VAD检测 → ASR识别 → LLM流式生成 │
│ ↓ 断句 │
│ TTS合成 → 🔊 流式播放 │
└─────────────────────────────────────────────────┘
│ │ │
Whisper API LLM API(SSE) TTS API
(语音识别) (对话生成) (语音合成)
无需后端服务器,全部在客户端内完成。
| 工具 | 版本 | 安装方式 |
|---|---|---|
| Flutter SDK | ≥ 3.0 | 官方文档 |
| Android Studio | 最新版 | 官方下载 |
| Android SDK | API 33+ | Android Studio 内置 |
| JDK | 17 | Flutter 自动配置 |
首次安装 Flutter 请先运行
flutter doctor确认环境正常。
git clone https://github.com/<你的用户名>/voice_chat_app.git
cd voice_chat_appflutter pub get编辑 lib/config/app_config.dart:
class AppConfig {
// LLM 配置 — 必填
static const String llmBaseUrl = 'https://api.openai.com/v1';
static const String llmApiKey = 'sk-xxxxxxxxxxxxxxxx'; // ← 填你的 Key
static const String llmModel = 'gpt-4o-mini';
// ASR 配置 — 必填
static const String asrApiKey = 'sk-xxxxxxxxxxxxxxxx'; // ← Whisper API Key
// TTS 配置 — 用 OpenAI TTS 则必填,用 Edge TTS 可留空
static const String ttsProvider = 'edge'; // edge(免费) | openai
static const String ttsApiKey = ''; // Edge TTS 无需 Key
}# USB 调试模式连接手机,或使用模拟器
flutter devicesflutter run只需改 app_config.dart 中 3 个字段,所有服务商均兼容 OpenAI 接口格式:
| 服务商 | llmBaseUrl |
llmModel |
价格参考 |
|---|---|---|---|
| OpenAI | https://api.openai.com/v1 |
gpt-4o-mini |
$0.15/1M input |
| DeepSeek | https://api.deepseek.com/v1 |
deepseek-chat |
¥1/1M input |
| 智谱 GLM | https://open.bigmodel.cn/api/paas/v4 |
glm-4-flash |
免费额度 |
| 通义千问 | https://dashscope.aliyuncs.com/compatible-mode/v1 |
qwen-turbo |
免费额度 |
| 月之暗面 | https://api.moonshot.cn/v1 |
moonshot-v1-8k |
免费额度 |
| 零一万物 | https://api.lingyiwanwu.com/v1 |
yi-lightning |
免费额度 |
推荐:国内用户首选 DeepSeek(便宜稳定)或智谱 GLM(有免费额度)。
| 操作 | 效果 |
|---|---|
| 长按麦克风 🔴 | 开始录音,按钮变红并放大 |
| 松开 | 停止录音,自动进入 识别→对话→播报 流程 |
| 静音 800ms | VAD 自动判定说话结束(无需手动松开) |
| 处理中 ⏳ | 按钮变灰,等待当前对话完成 |
1. 用户按住麦克风说话
↓
2. VAD 检测到静音 → 自动停止录音
↓
3. 音频文件发送到 Whisper API → 返回文字
↓
4. 文字发送到 LLM API(流式 SSE)
↓
5. LLM 逐 token 返回,实时显示在聊天气泡
↓
6. 遇到句号/问号等断句 → 该句送 TTS 合成
↓
7. TTS 返回音频 → 加入播放队列
↓
8. 播放队列按顺序播放音频片段
↓
9. 全部完成,等待下一轮对话
LLM 流式输出时,遇到以下标点立即送 TTS:
。 ! ? ; . ! ? ; 换行符
这样用户在 LLM 还在生成后续内容时,就能听到前几句的语音播报,显著降低感知延迟。
voice_chat_app/
├── lib/
│ ├── main.dart # 应用入口
│ ├── config/
│ │ └── app_config.dart # ★ API 配置(改这里)
│ ├── models/
│ │ └── chat_message.dart # 消息数据模型
│ ├── core/
│ │ ├── audio/
│ │ │ ├── audio_recorder.dart # 录音器 + VAD 集成
│ │ │ └── audio_player.dart # 播放队列管理
│ │ ├── network/
│ │ │ ├── llm_service.dart # LLM 流式 SSE 调用
│ │ │ ├── asr_service.dart # Whisper 语音识别
│ │ │ └── tts_service.dart # TTS 语音合成
│ │ └── vad/
│ │ └── simple_vad.dart # 简易 VAD 检测
│ └── features/
│ └── chat/
│ └── chat_screen.dart # 对话界面
├── android/
│ └── app/src/main/
│ └── AndroidManifest.xml # Android 权限声明
├── pubspec.yaml # 依赖配置
├── README.md # 本文件
├── CHANGELOG.md # 工作日志
└── .gitignore
在 Android 设置 → 应用 → 语音助手 → 权限 → 开启麦克风。
检查网络环境,国内访问 OpenAI 需要代理。建议使用国内模型服务(DeepSeek / 智谱 / 通义)。
- 检查手机音量(媒体音量,不是铃声音量)
- 确认
ttsProvider配置正确 - Edge TTS 模式需要网络连接
flutter logsflutter build apk --release产物在 build/app/outputs/flutter-apk/app-release.apk。
- 集成 silero-vad ONNX 模型替换简易 VAD
- 全双工模式(支持说话时打断 AI)
- Edge TTS WebSocket 协议直连(完全免费 TTS)
- 对话历史本地持久化(SQLite)
- 音频可视化波形
- 多轮对话上下文管理
- 设置页面(可视化配置 API Key)
- 深色/浅色主题切换
| 层级 | 技术 |
|---|---|
| 框架 | Flutter 3.x (Dart) |
| 状态管理 | Provider |
| 音频录制 | record |
| 音频播放 | audioplayers |
| 网络请求 | http + SSE |
| ASR | OpenAI Whisper API |
| LLM | OpenAI 兼容 API(流式 SSE) |
| TTS | Edge TTS / OpenAI TTS API |
| VAD | 自研简易能量检测 |
MIT