Duix Mobile for iOS
是一套轻量级的本地部署 2D 虚拟人解决方案,适用于 iOS 端,支持通过语音实时驱动虚拟人形象进行口型播报和动作响应。
术语 | 含义 |
---|---|
PCM | 原始音频流格式(16kHz,16bit,Mono) |
WAV | 音频文件格式,适用于短语音播放,内部仍为 PCM 编码 |
Session | 一次完整播报流程(推送→响应→结束) |
DUIX-PRO | 本地渲染与驱动管理器,实现模型加载、渲染控制、播报驱动等功能 |
GJLPCMManager | 提供的 PCM 管理类,用于处理音频文件和推送逻辑 |
GJLocalDigitalSDK.framework
拖入 Xcode 项目中,设置为:Embed & Sign。Build Phases > Link Binary With Libraries
中添加:AVFoundation.framework
。<key>NSMicrophoneUsageDescription</key>
<string>App需要使用麦克风权限驱动数字人语音播报</string>
项目 | 要求 |
---|---|
系统版本 | iOS 12.0 及以上 |
开发工具 | Xcode 12 及以上 |
支持设备 | iPhone 8 及以上 |
运行环境 | 支持离线,无需联网 |
CPU 与内存 | 推荐 A12 芯片及以上,内存 ≥ 3GB |
1.检查配置与模型
2.构建 DUIX 实例
3.调用 init 授权初始化
4.展示形象 / 渲染
5.PCM 或 WAV 音频驱动
6.播放控制与动作触发
7.资源释放
[[GJLDigitalManager manager] initWithAppId:self.appId appKey:self.appKey conversationId:self.conversationId block:^(BOOL isSuccess, NSString *errorMsg) {
if(isSuccess)
{
NSInteger result= [[GJLDigitalManager manager] initBaseModel:weakSelf.basePath digitalModel:weakSelf.digitalPath showView:weakSelf.showView];
if(result==1)
{
[[GJLDigitalManager manager] toStart:^(BOOL isSuccess, NSString *errorMsg) {
if(isSuccess)
{
dispatch_async(dispatch_get_main_queue(), ^{
weakSelf.questionLabel.hidden=NO;
weakSelf.answerLabel.hidden=NO;
[[GJLDigitalManager manager] toStartRuning];
[weakSelf initASR];
[[GJLASRManager manager] toOpenAsr];
});
}
else
{
[SVProgressHUD showInfoWithStatus:errorMsg];
}
}];
}
else
{
[SVProgressHUD showInfoWithStatus:@"模型初始化失败"];
}
}
else
{
[SVProgressHUD showInfoWithStatus:errorMsg];
}
}];
注意:basePath 为基础资源目录,digitalPath 为模型目录
/*
*授权
*appId 对应应用的APPID
*appKey 对应应用的密钥
*conversationId 会话ID
*isSuccess YES 返回成功 NO返回失败
*errorMsg 错误原因
*/
- (void)initWithAppId:(NSString *)appId appKey:(NSString *)appKey conversationId:(NSString*)conversationId block:(void (^) (BOOL isSuccess, NSString *errorMsg))block;
/**
* 初始化数字人服务
* @param basePath 基础模型路径(固定不变)
* @param digitalPath 数字人模型路径(替换数字人时更新此路径)
* @param showView 数字人渲染视图
* @return 状态码 1=成功, 0=未授权, -1=失败
*/
-(NSInteger)initBaseModel:(NSString*)basePath digitalModel:(NSString*)digitalPath showView:(UIView*)showView;
/*
*启动数字人渲染
*/
-(void)toStart:(void (^) (BOOL isSuccess, NSString *errorMsg))block;
/*
*停止渲染并释放资源
*/
-(void)toStop;
/*
*恢复播放(暂停后调用)
*/
-(void)toPlay;
/*
*暂停数字人播放
*/
-(void)toPause;
/**
* 动态替换背景
* @param bbgPath JPG格式背景图路径
*/
-(void)toChangeBBGWithPath:(NSString*)bbgPath;
/*
*audioData播放音频流 ,参考demo里面GJLPCMManager类里toSpeakWithPath 转换成pcm的代码
*驱动数字人播报(PCM流)
*/
-(void)toWavPcmData:(NSData*)audioData;
/*
* 开始音频流播放
*/
- (void)startPlaying;
/*
* 结束音频流播放
*/
- (void)stopPlaying:(void (^)( BOOL isSuccess))success;
/*
*设置静音模式
*/
-(void)toMute:(BOOL)isMute;
/*
*清空音频缓冲区
*/
-(void)clearAudioBuffer;
/*
*暂停播放音频流
*/
-(void)toPausePcm;
/*
*恢复播放音频流
*/
-(void)toResumePcm;
/*
* 是否启用录音
*/
-(void)toEnableRecord:(BOOL)isEnable;
/*
*启动流式会话
*/
-(void)toStartRuning;
/*
*开始新会话(单句/段落)
*/
-(void)newSession;
/*
*结束当前会话
*/
-(void)finishSession;
/*
*继续会话(finish后调用)
*/
-(void)continueSession;
/*
* 启用随机动作(建议在首段音频开始时调用)
* 返回:0=不支持, 1=成功
*/
-(NSInteger)toRandomMotion;
/*
* 启用开始动作(首段音频开始时调用)
* 返回:0=不支持, 1=成功
*/
-(NSInteger)toStartMotion;
/*
* 结束动作(末段音频结束时调用)
*isQuickly: YES=立即结束, NO=等待动作完成
*返回:0=不支持, 1=成功
*/
-(NSInteger)toSopMotion:(BOOL)isQuickly;
/*
*获取数字人模型尺寸(需初始化后调用)
*/
-(CGSize)getDigitalSize;
/*
*检查授权状态(1=已授权)
*/
-(NSInteger)isGetAuth;
/*
*初始化ASR
*asr 语言和平台在创建会话在网页端配置
*/
-(void)initASR;
/*
*开始识别
*/
-(void)toOpenAsr;
/*
*停止识别
*/
-(void)toCloseAsr;
/*
*数字人渲染报错
*错误码说明:
* 0 = 未授权
* -1 = 未初始化
* 50009 = 资源超时/未配置
*/
@property (nonatomic, copy) void (^playFailed)(NSInteger code,NSString *errorMsg);
/*
*音频播放结束回调
*/
@property (nonatomic, copy) void (^audioPlayEnd)(void);
/*
*音频播放进度回调
/
@property (nonatomic, copy) void (^audioPlayProgress)(float current,float total);
/*
*asrText 识别文字
*isFinish 一句话是否结束
*/
@property (nonatomic, copy) void (^asrBlock)(NSString * asrText,BOOL isFinish);
/*
*data 录音返回 单声道 1 采样率 16000
*/
@property (nonatomic, copy) void (^recordDataBlock)(NSData * data);
/*
* 服务端开始推送音频流
*/
@property (nonatomic, copy) void (^startPushBlock)(void);
/*
*data 服务端返回音频流 单声道 1 采样率 16000
*/
@property (nonatomic, copy) void (^pushDataBlock)(NSData * data);
/*
*服务端停止推送音频流
*/
@property (nonatomic, copy) void (^stopPushBlock)(void);
/*
*大模型返回文字
*/
@property (nonatomic, copy) void (^speakTextBlock)(NSString * speakText);
/*
*返回动作标记
*/
@property (nonatomic, copy) void (^motionBlock)(NSString * motionText);
问题现象 | 可能原因 | 建议处理方式 |
---|---|---|
初始化返回 -1 | SDK 授权失败 | 检查 info.plist 是否包含授权字段 |
无法渲染画面 | showView 为空或未添加 | 确保 viewController 中已渲染视图挂载 |
播报无响应 | 音频格式错误或路径无效 | 确保 PCM 格式正确 / 路径有效 |
播放提前中断 | 会话未续接 / 缓冲区溢出 | 检查是否正确调用 continueSession |
模块 | 描述 |
---|---|
ONNX (opens new window) | 通用 AI 模型标准格式 |
ncnn (opens new window) | 高性能神经网络推理框架(腾讯) |
如需更多集成帮助,请联系技术支持。