本文介绍如何在你的项目中集成和使用大饼 AI 变声插件,包括 Android 和 iOS 平台。
大饼 AI 变声插件是对实时 AI 声音转换核心 API 的封装。通过声网 SDK v4.x 提供的 setExtensionProperty 或 setExtensionPropertyWithVendor 方法,传入指定的 key
和 value
参数,你可以快速集成格子互动的实时 AI 声音转换能力。
以 setExtensionProperty
为例,其中的 key
参数与格子互动的 API 名称完全对应,value
参数以 JSON 格式包装该 API 的部分或全部参数。因此,调用 setExtensionProperty
时只要传入指定的 key
和 value
,就可以调用对应的格子互动 API,实现实时 AI 声音转换的有关功能。setExtensionPropertyWithVendor
同理。
平台 | 语言 | 示例项目 |
---|---|---|
Android | Kotlin | https://github.com/Dubbing-AI-Voice-Changer/DubbingAgoraDemo/tree/main/Android |
iOS | Objective-C | https://github.com/Dubbing-AI-Voice-Changer/DubbingAgoraDemo/tree/main/iOS |
git clone https://github.com/Dubbing-AI-Voice-Changer/DubbingAgoraDemo.git
README.md
文件完成后续步骤。大饼 AI 变声插件需要与声网音频 SDK v4.x 搭配使用。参考以下文档集成音频 SDK v4.x 并实现基础的语音通话:
参考如下步骤在你的项目中集成大饼 AI 变声插件:
Android
进入声网控制台 > 云市场页面,下载大饼 AI 变声插件的 Android 插件包。解压后,将所有 .aar
文件保存到项目文件夹的 /app/libs
路径。
获取以下资源文件并保存到项目文件夹的同一个目录(比如新建 vc_model
目录):
license 文件和音色文件:联系声网获取,其中音色文件的后缀名为 .dat
,音色文件根据 license 发放。
模型文件:根据示例项目 Readme 的说明下载所需资源。
打开 app/build.gradle
文件,在 dependencies
中添加如下行:
implementation fileTree(dir: "libs", include: ["*.jar", "*.aar"])
iOS
进入声网控制台 > 云市场页面,下载大饼 AI 变声插件的 iOS 插件包。
解压文件夹,将所有 .framework
文件导入项目,并将 Embed 修改为 Embed & Sign。
获取以下资源文件并保存到项目文件夹的同一路径(比如 Resource
路径):
license 文件和音色文件:联系声网获取,其中音色文件的后缀名为 .dat
,音色文件根据 license 发放。
模型文件:根据示例项目 Readme 的说明下载所需资源。
在项目中导入 libc++ 系统库以及第三方动态库 'MJExtension'
。
下面介绍插件相关接口的调用流程。
Android
创建并初始化 RtcEngine
后,首先调用 enableExtension
启用插件,再调用其它 API(enableVideo
、joinChannel
等)。
// 声明参数
private val EXTENSION_NAME = "dubbing_vc"
private val EXTENSION_VENDOR_NAME = "Dubbing"
private val EXTENSION_AUDIO_FILTER = "DubbingVC"
private val changeSpeaker_ = "changeSpeaker"
private val startRealTimeTranscribe_ = "startRealTimeTranscribe"
private val stopRealTimeTranscribe_ = "stopRealTimeTranscribe"
private val getSpeakersInfo_ = "getSpeakersInfo"
val config = RtcEngineConfig()
config.mContext = baseContext
config.mAppId = appId
config.mEventHandler = mRtcEventHandler
// 加载插件
config.addExtension(EXTENSION_NAME)
config.mExtensionObserver = extensionObserver
// 创建并初始化 RtcEngine
mRtcEngine = RtcEngine.create(config)
mRtcEngine.enableAudio()
// 启用插件
mRtcEngine.enableExtension(EXTENSION_VENDOR_NAME, EXTENSION_AUDIO_FILTER, enable)
iOS
创建并初始化 AgoraRtcEngineKit
后,首先调用 enableExtensionWithVendor
启用插件,再调用其它 API(enableVideo
、joinChannelByToken
等)。
AgoraRtcEngineConfig *cfg = [[AgoraRtcEngineConfig alloc] init];
cfg.appId = appId;
cfg.eventDelegate = self;
cfg.channelProfile = AgoraChannelProfileLiveBroadcasting;
cfg.audioScenario = AgoraAudioScenarioGameStreaming;
self.agoraKit = [AgoraRtcEngineKit sharedEngineWithConfig:cfg delegate:self];
[self.agoraKit setClientRole:AgoraClientRoleBroadcaster];
[self.agoraKit enableExtensionWithVendor:[EngineFilterManager vendorName] extension:@"RealTimeTranscribe" enabled:YES];
在集成插件时,你已经将 license 文件、音色文件、模型文件保存在指定目录。这一步只需要传入这些资源文件所在路径:
Android
val modelPath: String = "${context.filesDir}${File.separator}vc_model"
iOS
NSString *sourcePath = [[NSBundle mainBundle] resourcePath];
[self.agoraKit setExtensionPropertyWithVendor:[EngineFilterManager vendorName] extension:@"RealTimeTranscribe" key:@"setResourcesFilePath" value:sourcePath];
收到声网 SDK 的 onExtensionStarted
回调后,调用 getExtensionProperty
(Android)或 getExtensionPropertyWithVendor
(iOS),传入 key 为 getSpeakersInfo
,获取音色列表:
Android
val speakerList = mRtcEngine.getExtensionProperty(
EXTENSION_VENDOR_NAME,
EXTENSION_AUDIO_FILTER,
getSpeakersInfo_
)
// 将 JSON 转换为数组
val arr = JSONArray(speakerList)
iOS
NSString *voices = [self.agoraKit getExtensionPropertyWithVendor:[EngineFilterManager vendorName] extension:@"RealTimeTranscribe" key:@"getSpeakersInfo"];
// 将 JSON 转换为数组
NSData *nsData = [voices dataUsingEncoding:NSUTF8StringEncoding];
_speakerArray = [NSJSONSerialization JSONObjectWithData:nsData options:kNilOptions error:nil];
音色列表以 JSON 数据返回,你需要自行解析。
调用 setExtensionProperty
(Android)或 setExtensionPropertyWithVendor
(iOS)并传入对应的 key 和 value。
Android
mRtcEngine.setExtensionProperty(
EXTENSION_VENDOR_NAME,
EXTENSION_AUDIO_FILTER,
startRealTimeTranscribe_,
"true"
)
iOS
[self.agoraKit setExtensionPropertyWithVendor:[EngineFilterManager vendorName] extension:@"RealTimeTranscribe" key:@"startRealTimeTranscribe" value:@"startRealTimeTranscribe"];
传入第 3 步获取的音色列表中的音色 ID,即可设置成对应的音色:
Android
mRtcEngine.setExtensionProperty(
EXTENSION_VENDOR_NAME,
EXTENSION_AUDIO_FILTER,
changeSpeaker_,
id
)
[self.agoraKit setExtensionPropertyWithVendor:[EngineFilterManager vendorName] extension:@"RealTimeTranscribe" key:@"changeSpeaker" value:@“”];
Android
mRtcEngine.setExtensionProperty(
EXTENSION_VENDOR_NAME,
EXTENSION_AUDIO_FILTER,
stopRealTimeTranscribe_,
"true"
)
iOS
[self.agoraKit setExtensionPropertyWithVendor:[EngineFilterManager vendorName] extension:@"RealTimeTranscribe" key:@"stopRealTimeTranscribe" value:@"stopRealTimeTranscribe"];
关闭插件,释放插件所占用的资源。
Android
mRtcEngine.enableExtension(EXTENSION_VENDOR_NAME, EXTENSION_AUDIO_FILTER, false)
iOS
[self.agoraKit enableExtensionWithVendor:[EngineFilterManager vendorName] extension:@"RealTimeTranscribe" enabled:NO];
插件所有相关接口的参数解释详见接口说明。