Avatar 虚拟形象
  • iOS : Objective-C
  • Android
  • Unity3D
  • 产品简介
  • 下载
  • 下载体验 App
  • 快速开始
    • 跑通示例源码
    • 集成 SDK
    • 创建虚拟形象
    • ZegoCharacterHelper 使用说明
  • 基本功能
  • 进阶功能
  • 最佳实践
  • 常见错误码
  • 客户端 API
  • 常见问题

语音驱动

更新时间:2022-11-02 21:23

功能简介

ZEGO Avatar SDK 提供了语音驱动功能,通过声音的声波信息,实时驱动当前虚拟人物的嘴形变化,使得虚拟形象能够和真人一样进行自然的情绪表达。

可广泛应用于社交互动、语聊直播等场景中。

前提条件

在实现“语音驱动”功能之前,请确保:

  • 已在项目中集成了 Avatar SDK,详情请参考 集成 SDK
  • 已参考 创建虚拟形象,完成基本的虚拟人物形象搭建。

实现流程

开发者请参考以下步骤,实现 “语音驱动” 功能。

1 开始语音检测

  • 开始语音检测前,请确认已开启麦克风权限。
  • 开发者如果使用了 ZegoCharacterHelper,则无需再调用 IZegoCharacter 的任何相关接口。

搭建出基本的虚拟人物形象后,调用 startDetectExpression 接口,设置驱动模式为 ZegoExpressionDetectModeAudio,通过麦克风,开始检测声音波动;然后可以直接通过 ZegoCharacterHelper 的 setExpression 接口设置表情,驱动当前虚拟人物的嘴形变化。

// 开始语音检测
___weak typeof(self) weakSelf = self;
BOOL ret = [[[ZegoAvatarService sharedInstance] getInteractEngine] startDetectExpression:ZegoExpressionDetectModeAudio callback:^(ZegoExpression *expression) {
    // 驱动虚拟人物的嘴形变化
    __strong typeof(self) strongSelf = weakSelf;
    [strongSelf.characterHelper setExpression: expression];
}];

2 自定义音频采集

开发者可以调用 setCustomAudioDelegate 接口,设置自定义的音频数据采集代理(需要继承 AudioDataDelegate 实现 onStartonStop 方法)。采集到音频数据后,调用 sendAudioData 接口,发送数据。

@interface ExpressAudioCaptureDelegate()<ZegoEventHandler, ZegoCustomAudioProcessHandler>
{
    BOOL _isRunning;
}
@end

@implementation ExpressAudioCaptureDelegate

- (void)onStart{
    // 启动音频采集
    _isRunning = YES;
}

- (void)onStop{
    // 停止音频采集
    _isRunning = NO;
}

// 以下为 Express SDK 的自定义音频采集的前处理回调, 将采集到的数据发送给 Avatar SDK
- (void)onProcessCapturedAudioData:(unsigned char * _Nonnull)data dataLength:(unsigned int)dataLength param:(ZegoAudioFrameParam *)param timestamp:(double)timestamp; {
    if(_isRunning){
        // data: pcm 的原始数据
        // length: data 的长度
        // dataType: data 采集的位数:0 表示 16 位,1 表示 8 位
        // timeStamp: 时间戳, 从启动采集到现在经过的时间
        // sendAudioData 是父类方法, 直接调用即可;数据透传给 Avatar SDK, RTC 的数据是 8 位的, dataType 是 1
        [super sendAudioData: (void*)data  size:dataLength dataType: 1 timeStamp: [super getDurationMs] ];
    }
}
@end

3 停止语音检测

将应用切换到后台运行、或退出当前页面时,需要调用 stopDetectExpression 接口,停止语音检测。

// 停止语音检测
[[[ZegoAvatarService sharedInstance] getInteractEngine] stopDetectExpression];