You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
5.6 KiB
5.6 KiB
Realtime Plugin 实现总结
项目概述
基于您提供的Android原生示例,我为DeepVoice项目创建了一个realtime插件,用于通过WebSocket接入Vocode服务器实现实时语音聊天功能。该插件已完成Android和iOS双平台实现。
架构设计
插件结构
local_plugins/realtime/
├── android/ # Android实现
│ ├── build.gradle # Android构建配置
│ ├── src/main/
│ │ ├── AndroidManifest.xml # Android权限配置
│ │ └── kotlin/com/yunqiinnovation/realtime/
│ │ ├── RealtimePlugin.kt # 主插件入口
│ │ ├── RealtimeAudioManager.kt # 音频管理器(AudioRecord/AudioTrack)
│ │ └── RealtimeWebSocketManager.kt # WebSocket管理器(OkHttp)
├── ios/ # iOS实现
│ ├── Classes/ # Objective-C桥接文件
│ │ ├── RealtimePlugin.h
│ │ └── RealtimePlugin.m
│ ├── realtime/ # Swift Package
│ │ ├── Package.swift
│ │ └── Sources/realtime/
│ │ ├── RealtimePlugin.swift # 主插件入口
│ │ ├── RealtimeAudioManager.swift # 音频管理器(AVAudioEngine)
│ │ └── RealtimeWebSocketManager.swift # WebSocket管理器(URLSession)
│ └── realtime.podspec
├── lib/
│ └── realtime.dart # Flutter接口
├── pubspec.yaml
└── README.md
核心组件
-
RealtimePlugin (SwiftRealtimePlugin)
- 主插件入口,处理Flutter方法调用
- 管理各组件间的协调
- 处理事件分发
-
RealtimeAudioManager
- 使用AVAudioEngine进行音频录制
- 使用AVAudioPlayerNode进行音频播放
- 支持16kHz/16-bit/单声道格式
- 实现20ms帧长的音频处理
-
RealtimeWebSocketManager
- 使用URLSessionWebSocketTask实现WebSocket通信
- 支持音频数据和文本消息的收发
- 自动连接状态管理
技术实现对照
| 功能 | Android示例 | iOS实现 |
|---|---|---|
| 音频录制 | AudioRecord | AVAudioEngine + AVAudioInputNode |
| 音频播放 | AudioTrack | AVAudioPlayerNode |
| WebSocket | OkHttp WebSocket | URLSessionWebSocketTask |
| 线程管理 | Kotlin协程 | DispatchQueue |
| 音频格式 | 16kHz/16-bit/单声道 | 16kHz/16-bit/单声道 |
| 帧长 | 20ms (320字节) | 20ms (320字节) |
Flutter接口
主要类
RealtimeService: 主服务类RealtimeEvent: 事件类ConnectionStatus: 连接状态枚举VoiceStatus: 语音状态枚举RealtimeException: 异常类
主要方法
initialize(): 初始化服务connect(): 连接服务器disconnect(): 断开连接startRecording(): 开始录音stopRecording(): 停止录音eventStream: 事件流
使用方式
1. 在RealtimeController中集成
已更新lib/modules/realtime/controllers/realtime_controller.dart使用真实的realtime插件,取代了原来的模拟实现。
2. 事件监听
_realtimeService.eventStream.listen((event) {
switch (event.type) {
case 'connectionStatusChanged':
// 处理连接状态变化
case 'voiceStatusChanged':
// 处理语音状态变化
case 'textReceived':
// 处理文本消息
case 'error':
// 处理错误
}
});
配置要求
依赖配置
已添加到主项目的pubspec.yaml:
realtime:
path: local_plugins/realtime
权限配置
iOS的Info.plist已包含必要的麦克风权限:
<key>NSMicrophoneUsageDescription</key>
<string>需要麦克风权限用于语音识别和录音功能</string>
与Android示例的对应关系
-
初始化对应
- Android: 创建AudioRecord, AudioTrack, OkHttpClient
- iOS: 创建AVAudioEngine, AVAudioPlayerNode, URLSession
-
录音线程对应
- Android:
loopRecordSend()协程 - iOS: AVAudioInputNode的installTap回调
- Android:
-
播放线程对应
- Android:
loopPlayback()协程 + LinkedBlockingQueue - iOS: DispatchQueue + AVAudioPCMBuffer队列
- Android:
-
WebSocket对应
- Android: OkHttp WebSocketListener
- iOS: URLSessionWebSocketDelegate
特性支持
✅ 已实现
- Android和iOS双平台支持
- 实时音频录制和播放(16kHz/16-bit/单声道)
- WebSocket双向通信
- 状态管理和事件通知
- 错误处理
- 资源管理和清理
- 20ms帧长处理
- Kotlin协程和DispatchQueue线程管理
❌ 未实现(可扩展)
- 音频编码(Opus等)
- 噪声消除/回声抑制
- 自动重连机制
- 音频质量自适应
使用注意事项
-
服务器地址配置
// 需要替换为实际的Vocode服务器地址 serverUrl: 'wss://your-vocode-server/ws' -
音频格式一致性
- 确保服务器支持16kHz/16-bit/单声道格式
- 帧长固定为20ms (320字节)
-
错误处理
- 监听事件流中的错误
- 处理网络断线和重连
-
资源管理
- 及时调用dispose()释放资源
- 避免内存泄漏
测试建议
-
本地测试
- 先用echo服务器测试WebSocket连接
- 验证音频录制和播放功能
-
集成测试
- 与真实Vocode服务器集成
- 测试端到端语音交互
-
性能测试
- 测试长时间使用的稳定性
- 监控内存和CPU使用
这个实现为DeepVoice项目提供了完整的实时语音交互能力,可以直接与Vocode服务器进行通信,实现类似Android示例的功能。