500 lines
10 KiB
Markdown
Executable File
500 lines
10 KiB
Markdown
Executable File
---
|
||
title: 小智手机端
|
||
description: 基于Flutter的跨平台小智客户端,支持iOS、Android、Web等多平台
|
||
---
|
||
|
||
# 小智手机客户端
|
||
|
||
<div class="project-header">
|
||
<div class="project-logo">
|
||
<img src="https://avatars.githubusercontent.com/u/196275872?s=48&v=4" alt="小智手机客户端">
|
||
</div>
|
||
<div class="project-badges">
|
||
<span class="badge platform">多平台</span>
|
||
<span class="badge language">Flutter/Dart</span>
|
||
<span class="badge status">活跃开发中</span>
|
||
</div>
|
||
</div>
|
||
|
||
## 项目简介
|
||
|
||
小智手机客户端是基于Flutter框架开发的跨平台应用,为小智AI生态系统提供了移动端接入能力。通过一套代码,实现了在iOS、Android、Web、Windows、macOS和Linux等多个平台的部署,让用户随时随地都能与小智AI进行实时语音交互和文字对话。
|
||
|
||
<div class="app-showcase">
|
||
<div class="showcase-image">
|
||
<img src="./images/界面1.jpg" alt="应用展示" onerror="this.src='./images/界面1.jpg'; this.onerror=null;">
|
||
<div class="overlay">
|
||
<a href="https://www.bilibili.com/video/BV1fgXvYqE61" target="_blank" class="watch-demo">观看演示视频</a>
|
||
</div>
|
||
</div>
|
||
<div class="showcase-description">
|
||
<p>最新版本客户端已全面升级,支持iOS与Android平台,并可自行打包为Web、PC版本。通过精心设计的UI和流畅的交互体验,为用户提供随时随地与小智AI交流的能力。</p>
|
||
</div>
|
||
</div>
|
||
|
||
## 核心功能
|
||
|
||
<div class="features-grid">
|
||
<div class="feature-card">
|
||
<div class="feature-icon">📱</div>
|
||
<h3>跨平台支持</h3>
|
||
<p>使用Flutter开发,一套代码支持iOS、Android、Web、Windows、macOS和Linux等多平台</p>
|
||
</div>
|
||
|
||
<div class="feature-card">
|
||
<div class="feature-icon">🤖</div>
|
||
<h3>多AI模型集成</h3>
|
||
<p>支持小智AI服务、Dify、OpenAI等多种AI服务,可随时切换不同模型</p>
|
||
</div>
|
||
|
||
<div class="feature-card">
|
||
<div class="feature-icon">💬</div>
|
||
<h3>丰富交互方式</h3>
|
||
<p>支持实时语音对话、文字消息、图片消息,以及通话中手动打断功能</p>
|
||
</div>
|
||
|
||
<div class="feature-card">
|
||
<div class="feature-icon">🔊</div>
|
||
<h3>语音优化技术</h3>
|
||
<p>实现安卓设备AEC+NS回音消除,提升语音交互质量</p>
|
||
</div>
|
||
|
||
<div class="feature-card">
|
||
<div class="feature-icon">🎨</div>
|
||
<h3>精美界面设计</h3>
|
||
<p>轻度拟物化设计、流畅动画效果、自适应UI布局</p>
|
||
</div>
|
||
|
||
<div class="feature-card">
|
||
<div class="feature-icon">⚙️</div>
|
||
<h3>灵活配置选项</h3>
|
||
<p>支持多种AI服务配置管理,可添加多个小智到聊天列表</p>
|
||
</div>
|
||
</div>
|
||
|
||
## 功能亮点
|
||
|
||
### 实时语音交互
|
||
|
||
<div class="feature-highlight">
|
||
<div class="highlight-image">
|
||
<img src="./images/界面1.jpg" alt="实时语音交互" onerror="this.src='./images/界面1.jpg'; this.onerror=null;">
|
||
</div>
|
||
<div class="highlight-content">
|
||
<h3>流畅的语音对话体验</h3>
|
||
<ul>
|
||
<li>实时语音识别和响应</li>
|
||
<li>支持持续对话模式</li>
|
||
<li>语音交互过程中支持手动打断</li>
|
||
<li>按住说话快捷模式</li>
|
||
<li>语音会话历史记录</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
### 多AI服务支持
|
||
|
||
<div class="feature-highlight reverse">
|
||
<div class="highlight-content">
|
||
<h3>灵活切换不同AI服务</h3>
|
||
<ul>
|
||
<li>集成小智WebSocket实时语音对话</li>
|
||
<li>支持Dify平台接入</li>
|
||
<li>支持OpenAI图文消息和流式输出</li>
|
||
<li>支持官方小智服务一键设备注册</li>
|
||
<li>可同时添加多个AI服务到对话列表</li>
|
||
</ul>
|
||
</div>
|
||
<div class="highlight-image">
|
||
<img src="./images/界面2.jpg" alt="多AI服务支持" onerror="this.src='./images/界面2.jpg'; this.onerror=null;">
|
||
</div>
|
||
</div>
|
||
|
||
## 系统要求
|
||
|
||
- **Flutter**: ^3.7.0
|
||
- **Dart**: ^3.7.0
|
||
- **iOS**: 12.0+
|
||
- **Android**: API 21+ (Android 5.0+)
|
||
- **Web**: 现代浏览器
|
||
|
||
## 安装与使用
|
||
|
||
### 安装方法
|
||
|
||
1. 克隆项目仓库:
|
||
```bash
|
||
git clone https://github.com/TOM88812/xiaozhi-android-client.git
|
||
```
|
||
|
||
2. 安装依赖:
|
||
```bash
|
||
flutter pub get
|
||
```
|
||
|
||
3. 运行应用:
|
||
```bash
|
||
flutter run
|
||
```
|
||
|
||
### 构建发布版本
|
||
|
||
```bash
|
||
# Android应用
|
||
flutter build apk --release
|
||
|
||
# iOS应用
|
||
flutter build ios --release
|
||
|
||
# Web应用
|
||
flutter build web --release
|
||
```
|
||
|
||
> **注意**: iOS编译完成后,需要在设置-APP中打开网络权限
|
||
|
||
## 配置说明
|
||
|
||
应用支持灵活的服务配置管理,包括:
|
||
|
||
### 小智服务配置
|
||
- 支持配置多个小智服务地址
|
||
- WebSocket URL设置
|
||
- Token认证
|
||
- 自定义MAC地址
|
||
|
||
### Dify API配置
|
||
- 支持配置多个Dify服务
|
||
- API密钥管理
|
||
- 服务器URL配置
|
||
|
||
### OpenAI配置
|
||
- API密钥设置
|
||
- 模型选择
|
||
- 参数调整
|
||
|
||
## 开发计划
|
||
|
||
<div class="roadmap">
|
||
<div class="roadmap-item done">
|
||
<div class="status-dot"></div>
|
||
<div class="item-content">
|
||
<h4>已实现功能</h4>
|
||
<ul>
|
||
<li>支持多种AI服务提供商</li>
|
||
<li>支持OTA自动注册设备</li>
|
||
<li>增强语音识别准确性</li>
|
||
<li>实现文字和语音混合会话</li>
|
||
<li>支持OpenAI接口图文交互</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="roadmap-item progress">
|
||
<div class="status-dot"></div>
|
||
<div class="item-content">
|
||
<h4>正在开发</h4>
|
||
<ul>
|
||
<li>深色/浅色主题适配</li>
|
||
<li>iOS平台回音消除实现</li>
|
||
<li>本地ASR语音识别支持</li>
|
||
<li>本地唤醒词功能</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="roadmap-item planned">
|
||
<div class="status-dot"></div>
|
||
<div class="item-content">
|
||
<h4>计划实现</h4>
|
||
<ul>
|
||
<li>支持IoT映射手机操作</li>
|
||
<li>本地TTS实现</li>
|
||
<li>支持MCP_Client</li>
|
||
<li>OpenAI接口联网搜索功能</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
## 项目贡献
|
||
|
||
欢迎为小智手机客户端贡献代码或提交问题反馈:
|
||
|
||
- 目前iOS端回音消除尚未实现,欢迎有经验的开发者PR
|
||
- 提交Bug、功能请求或改进建议
|
||
- 分享您使用小智手机客户端的经验和案例
|
||
|
||
## 相关链接
|
||
|
||
- [项目GitHub仓库](https://github.com/TOM88812/xiaozhi-android-client)
|
||
- [演示视频](https://www.bilibili.com/video/BV1fgXvYqE61)
|
||
- [问题反馈](https://github.com/TOM88812/xiaozhi-android-client/issues)
|
||
|
||
<style>
|
||
.project-header {
|
||
display: flex;
|
||
align-items: center;
|
||
margin-bottom: 2rem;
|
||
}
|
||
|
||
.project-logo {
|
||
width: 100px;
|
||
height: 100px;
|
||
margin-right: 1.5rem;
|
||
}
|
||
|
||
.project-logo img {
|
||
width: 100%;
|
||
height: 100%;
|
||
object-fit: contain;
|
||
}
|
||
|
||
.project-badges {
|
||
display: flex;
|
||
flex-wrap: wrap;
|
||
gap: 0.5rem;
|
||
}
|
||
|
||
.badge {
|
||
display: inline-block;
|
||
padding: 0.25rem 0.75rem;
|
||
border-radius: 1rem;
|
||
font-size: 0.85rem;
|
||
font-weight: 500;
|
||
}
|
||
|
||
.badge.platform {
|
||
background-color: var(--vp-c-brand-soft);
|
||
color: var(--vp-c-brand-dark);
|
||
}
|
||
|
||
.badge.language {
|
||
background-color: rgba(59, 130, 246, 0.2);
|
||
color: rgb(59, 130, 246);
|
||
}
|
||
|
||
.badge.status {
|
||
background-color: rgba(16, 185, 129, 0.2);
|
||
color: rgb(16, 185, 129);
|
||
}
|
||
|
||
.app-showcase {
|
||
margin: 2rem 0;
|
||
background-color: var(--vp-c-bg-soft);
|
||
border-radius: 12px;
|
||
overflow: hidden;
|
||
border: 1px solid var(--vp-c-divider);
|
||
}
|
||
|
||
.showcase-image {
|
||
position: relative;
|
||
width: 100%;
|
||
height: 300px;
|
||
}
|
||
|
||
.showcase-image img {
|
||
width: 100%;
|
||
height: 100%;
|
||
object-fit: cover;
|
||
}
|
||
|
||
.overlay {
|
||
position: absolute;
|
||
top: 0;
|
||
left: 0;
|
||
width: 100%;
|
||
height: 100%;
|
||
background: rgba(0, 0, 0, 0.3);
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
opacity: 0;
|
||
transition: opacity 0.3s ease;
|
||
}
|
||
|
||
.showcase-image:hover .overlay {
|
||
opacity: 1;
|
||
}
|
||
|
||
.watch-demo {
|
||
padding: 0.75rem 1.5rem;
|
||
/*background-color: var(--vp-c-brand);*/
|
||
color: white;
|
||
border-radius: 4px;
|
||
text-decoration: none;
|
||
font-weight: 500;
|
||
transition: background-color 0.1s ease;
|
||
}
|
||
|
||
.watch-demo:hover {
|
||
background-color: var(--vp-c-brand-dark);
|
||
}
|
||
|
||
.showcase-description {
|
||
padding: 1.5rem;
|
||
font-size: 1.1rem;
|
||
line-height: 1.6;
|
||
}
|
||
|
||
.features-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
|
||
gap: 1.5rem;
|
||
margin: 2rem 0;
|
||
}
|
||
|
||
.feature-card {
|
||
background-color: var(--vp-c-bg-soft);
|
||
border-radius: 8px;
|
||
padding: 1.5rem;
|
||
transition: transform 0.3s ease, box-shadow 0.3s ease;
|
||
border: 1px solid var(--vp-c-divider);
|
||
height: 100%;
|
||
}
|
||
|
||
.feature-card:hover {
|
||
transform: translateY(-5px);
|
||
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
|
||
}
|
||
|
||
.feature-icon {
|
||
font-size: 2rem;
|
||
margin-bottom: 1rem;
|
||
}
|
||
|
||
.feature-card h3 {
|
||
color: var(--vp-c-brand);
|
||
margin-top: 0;
|
||
margin-bottom: 0.5rem;
|
||
}
|
||
|
||
.feature-highlight {
|
||
display: flex;
|
||
margin: 3rem 0;
|
||
background-color: var(--vp-c-bg-soft);
|
||
border-radius: 12px;
|
||
overflow: hidden;
|
||
border: 1px solid var(--vp-c-divider);
|
||
}
|
||
|
||
.feature-highlight.reverse {
|
||
flex-direction: row-reverse;
|
||
}
|
||
|
||
.highlight-image {
|
||
flex: 1;
|
||
min-width: 40%;
|
||
}
|
||
|
||
.highlight-image img {
|
||
width: 100%;
|
||
height: 100%;
|
||
object-fit: cover;
|
||
}
|
||
|
||
.highlight-content {
|
||
flex: 1;
|
||
padding: 2rem;
|
||
}
|
||
|
||
.highlight-content h3 {
|
||
color: var(--vp-c-brand);
|
||
margin-top: 0;
|
||
margin-bottom: 1rem;
|
||
}
|
||
|
||
.highlight-content ul {
|
||
padding-left: 1.5rem;
|
||
}
|
||
|
||
.highlight-content li {
|
||
margin-bottom: 0.5rem;
|
||
}
|
||
|
||
.roadmap {
|
||
position: relative;
|
||
margin: 3rem 0;
|
||
padding-left: 2rem;
|
||
}
|
||
|
||
.roadmap:before {
|
||
content: "";
|
||
position: absolute;
|
||
left: 7px;
|
||
top: 0;
|
||
bottom: 0;
|
||
width: 2px;
|
||
background-color: var(--vp-c-divider);
|
||
}
|
||
|
||
.roadmap-item {
|
||
position: relative;
|
||
margin-bottom: 2rem;
|
||
}
|
||
|
||
.status-dot {
|
||
position: absolute;
|
||
left: -2rem;
|
||
top: 0;
|
||
width: 16px;
|
||
height: 16px;
|
||
border-radius: 50%;
|
||
z-index: 1;
|
||
}
|
||
|
||
.roadmap-item.done .status-dot {
|
||
background-color: rgb(16, 185, 129);
|
||
}
|
||
|
||
.roadmap-item.progress .status-dot {
|
||
background-color: rgb(245, 158, 11);
|
||
}
|
||
|
||
.roadmap-item.planned .status-dot {
|
||
background-color: rgb(99, 102, 241);
|
||
}
|
||
|
||
.item-content {
|
||
background-color: var(--vp-c-bg-soft);
|
||
border-radius: 8px;
|
||
padding: 1.5rem;
|
||
border: 1px solid var(--vp-c-divider);
|
||
}
|
||
|
||
.item-content h4 {
|
||
margin-top: 0;
|
||
margin-bottom: 1rem;
|
||
}
|
||
|
||
.roadmap-item.done h4 {
|
||
color: rgb(16, 185, 129);
|
||
}
|
||
|
||
.roadmap-item.progress h4 {
|
||
color: rgb(245, 158, 11);
|
||
}
|
||
|
||
.roadmap-item.planned h4 {
|
||
color: rgb(99, 102, 241);
|
||
}
|
||
|
||
@media (max-width: 768px) {
|
||
.feature-highlight,
|
||
.feature-highlight.reverse {
|
||
flex-direction: column;
|
||
}
|
||
|
||
.highlight-image {
|
||
height: 200px;
|
||
}
|
||
|
||
.project-header {
|
||
flex-direction: column;
|
||
align-items: flex-start;
|
||
}
|
||
|
||
.project-logo {
|
||
margin-bottom: 1rem;
|
||
}
|
||
}
|
||
</style> |