# 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 ``` ### 核心组件 1. **RealtimePlugin (SwiftRealtimePlugin)** - 主插件入口,处理Flutter方法调用 - 管理各组件间的协调 - 处理事件分发 2. **RealtimeAudioManager** - 使用AVAudioEngine进行音频录制 - 使用AVAudioPlayerNode进行音频播放 - 支持16kHz/16-bit/单声道格式 - 实现20ms帧长的音频处理 3. **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. 事件监听 ```dart _realtimeService.eventStream.listen((event) { switch (event.type) { case 'connectionStatusChanged': // 处理连接状态变化 case 'voiceStatusChanged': // 处理语音状态变化 case 'textReceived': // 处理文本消息 case 'error': // 处理错误 } }); ``` ## 配置要求 ### 依赖配置 已添加到主项目的`pubspec.yaml`: ```yaml realtime: path: local_plugins/realtime ``` ### 权限配置 iOS的`Info.plist`已包含必要的麦克风权限: ```xml NSMicrophoneUsageDescription 需要麦克风权限用于语音识别和录音功能 ``` ## 与Android示例的对应关系 1. **初始化对应** - Android: 创建AudioRecord, AudioTrack, OkHttpClient - iOS: 创建AVAudioEngine, AVAudioPlayerNode, URLSession 2. **录音线程对应** - Android: `loopRecordSend()` 协程 - iOS: AVAudioInputNode的installTap回调 3. **播放线程对应** - Android: `loopPlayback()` 协程 + LinkedBlockingQueue - iOS: DispatchQueue + AVAudioPCMBuffer队列 4. **WebSocket对应** - Android: OkHttp WebSocketListener - iOS: URLSessionWebSocketDelegate ## 特性支持 ✅ **已实现** - Android和iOS双平台支持 - 实时音频录制和播放(16kHz/16-bit/单声道) - WebSocket双向通信 - 状态管理和事件通知 - 错误处理 - 资源管理和清理 - 20ms帧长处理 - Kotlin协程和DispatchQueue线程管理 ❌ **未实现(可扩展)** - 音频编码(Opus等) - 噪声消除/回声抑制 - 自动重连机制 - 音频质量自适应 ## 使用注意事项 1. **服务器地址配置** ```dart // 需要替换为实际的Vocode服务器地址 serverUrl: 'wss://your-vocode-server/ws' ``` 2. **音频格式一致性** - 确保服务器支持16kHz/16-bit/单声道格式 - 帧长固定为20ms (320字节) 3. **错误处理** - 监听事件流中的错误 - 处理网络断线和重连 4. **资源管理** - 及时调用dispose()释放资源 - 避免内存泄漏 ## 测试建议 1. **本地测试** - 先用echo服务器测试WebSocket连接 - 验证音频录制和播放功能 2. **集成测试** - 与真实Vocode服务器集成 - 测试端到端语音交互 3. **性能测试** - 测试长时间使用的稳定性 - 监控内存和CPU使用 这个实现为DeepVoice项目提供了完整的实时语音交互能力,可以直接与Vocode服务器进行通信,实现类似Android示例的功能。