阿里云 AI 通话 Flutter 插件,支持实时语音对话、语音识别、声纹识别等功能。
- AI 语音通话
- 声纹识别
- 实时语音识别(ASR)
- 语音合成(TTS)
- 网络质量监控
- 麦克风/扬声器控制
- AI语音打断
- 多角色支持
- 多音色支持
- Flutter: >=3.3.0
- iOS: >= 12.0
- Android: minSdkVersion 19
- 添加依赖到
pubspec.yaml
:
dependencies:
ali_ai_call: ^1.0.0
- iOS 配置:
在 ios/Runner/Info.plist
添加以下权限:
<key>NSMicrophoneUsageDescription</key>
<string>需要访问麦克风进行语音通话</string>
<key>NSCameraUsageDescription</key>
<string>需要访问相机进行视频通话</string>
- Android 配置:
在 android/app/src/main/AndroidManifest.xml
添加权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
await AliAiCall.initEngine(userId: "your_user_id");
AliAiCall.setEngineEventHandler(
onCallBegin: () {
print('通话开始');
},
onCallEnd: () {
print('通话结束');
},
onError: (error) {
print('发生错误: $error');
},
onUserAsrSubtitleNotify: (Map<String, dynamic> data) {
// 用户语音识别结果
String text = data['text'];
bool isSentenceEnd = data['isSentenceEnd'];
int sentenceId = data['sentenceId'];
VoicePrintStatusCode voicePrintStatus = data['voicePrintStatus'];
switch (voicePrintStatus) {
case VoicePrintStatusCode.speakerRecognized:
print('说话人已识别');
break;
case VoicePrintStatusCode.speakerNotRecognized:
print('说话人未识别');
break;
case VoicePrintStatusCode.disable:
print('声纹识别已禁用');
break;
case VoicePrintStatusCode.enableWithoutRegister:
print('声纹识别已启用但未注册');
break;
case VoicePrintStatusCode.unknown:
print('未知状态');
break;
}
print('用户语音识别: $text');
},
onAIAgentSubtitleNotify: (Map<String, dynamic> data) {
// AI回复文本
String text = data['text'];
bool isSentenceEnd = data['isSentenceEnd'];
int userAsrSentenceId = data['userAsrSentenceId'];
print('AI回复: $text');
},
onVolumeChanged: (Map<String, dynamic> data) {
// 音量变化
String uid = data['uid'];
int volume = data['volume'];
print('音量变化: $volume');
},
);
await AliAiCall.call(
rtcToken: "your_rtc_token",
aiAgentInstanceId: "your_instance_id",
aiAgentUserId: "your_agent_user_id",
channelId: "your_channel_id",
);
await AliAiCall.hangup();
// 切换麦克风
await AliAiCall.switchMicrophone(true/false);
// 切换扬声器
await AliAiCall.enableSpeaker(true/false);
// 打断 AI 说话
await AliAiCall.interruptSpeaking();
// 启用语音打断
await AliAiCall.enableVoiceInterrupt(true/false);
// 切换 AI 音色
await AliAiCall.switchRobotVoice("voice_id");
// 设置 AI 角色
await AliAiCall.setAIRole("role_id", "role_name");
参数 | 类型 | 说明 |
---|---|---|
text | String | 识别到的文本内容 |
isSentenceEnd | bool | 是否是句子结束 |
sentenceId | int | 句子ID |
voicePrintStatus | VoicePrintStatusCode | 声纹状态,可能的值: - disable: 禁用 - enableWithoutRegister: 启用但未注册 - speakerRecognized: 说话人已识别 - speakerNotRecognized: 说话人未识别 - unknown: 未知状态 |
参数 | 类型 | 说明 |
---|---|---|
text | String | AI回复的文本内容 |
isSentenceEnd | bool | 是否是句子结束 |
userAsrSentenceId | int | 对应的用户语音ID |
参数 | 类型 | 说明 |
---|---|---|
uid | String | 用户ID |
volume | int | 音量大小 (0-255) |
插件会通过 onError
回调返回错误信息,建议在使用时做好错误处理:
onError: (error) {
switch(error) {
case "NETWORK_ERROR":
// 处理网络错误
break;
case "PERMISSION_DENIED":
// 处理权限错误
break;
// 处理其他错误...
}
}
-
初始化时机
- 建议在应用启动时就完成初始化
- 确保在调用其他方法前完成初始化
-
资源释放
- 在页面销毁时调用 hangup()
- 注意清理回调避免内存泄漏
-
错误处理
- 对网络错误进行重试
- 对权限错误给予用户提示
- 记录错误日志便于问题排查
-
性能优化
- 避免频繁切换音色和角色
- 合理使用语音打断功能
- 注意控制录音文件大小
-
Q: 初始化失败怎么办? A: 检查网络连接和参数配置是否正确
-
Q: 没有声音怎么办? A: 检查音量设置和权限是否正确
-
Q: 语音识别不准确怎么办? A: 建议在安静环境使用,说话清晰度也重要
-
Q: 遇到 "Multiple commands produce xxx-umbrella.h" 错误怎么办? A: 这是 Xcode 构建冲突导致的问题,解决步骤如下:
- 确保 podspec 文件中正确配置了 source_files 和 public_header_files
- 删除 ios/Classes 目录下的重复 umbrella header 文件
- 清理并重新安装 pods:
cd example/ios pod deintegrate pod cache clean --all rm -rf Pods rm -rf .symlinks rm Podfile.lock pod install
- 重新构建项目:
flutter clean flutter pub get cd example/ios pod install cd .. flutter build ios
- 初始版本发布
- 支持基础语音通话功能
- 支持语音识别和合成
- 支持音量控制和监控
如有问题请提交 Issue
MIT License