本文介绍如何在你的项目中集成和使用云上曲率实时语音识别&翻译插件(以下简称曲率识别及翻译插件),包括Android和iOS平台。 注意:本文内容主要针对使用声网视频 SDK v4.0.0 Beta 并需要进行音频前+后处理操作使用。如果不需要在RTC音频传输过程中,接收端对音频进行识别和翻译,请忽略本文。
曲率识别及翻译插件是对云上曲率实时语音识别和实时翻译核心 API 的封装。通过调用声网视频 SDK v4.0.0 Beta 的 setExtensionProperty 或 setExtensionPropertyWithVendor方法,传入指定的 key
和 value
参数,你可以快速集成云上曲率的实时语音识别和翻译的能力。支持的 key 和 value 详见插件的 key-value 列表
- Android 开发环境需满足以下要求:
- Android Studio 4.1 以上版本。
- 运行 Android 5.0 或以上版本的真机(非模拟器)。
- iOS 开发环境需满足以下要求:
- Xcode 15.0 或以上版本。
- 运行 iOS 12.0 或以上版本的真机(非模拟器)。
曲率识别及翻译插件需要与声网视频 SDK v4.0.0 Beta 搭配使用。参考以下文档集成视频 SDK v4.0.0 Beta 并实现基础的视频通话:
在声网控制台购买和激活曲率识别及翻译插件,保存好获取到的 appKey
和 appSecret
,后续初始化插件时需要用到。
参考如下步骤在你的项目中集成曲率识别及翻译插件:
Android
-
在声网云市场下载页面下载曲率识别及翻译插件的 Android 插件包。解压后,将所有
.aar
文件保存到项目文件夹的/app/libs
路径。 -
打开
app/build.gradle
文件,在dependencies
中添加如下行:implementation fileTree(dir: "libs", include: ["*.jar", "*.aar"])
iOS
- 在声网云市场下载页面下载曲率识别及翻译插件的 iOS 插件包。解压后,将所有
.framework
库文件保存到你的项目文件夹下。 - 在 Xcode 中添加动态库,确保 Embed 属性设置为 Embed & Sign。
以如下项目结构为例,你可以把库文件保存到 <ProjectName>
路径下。
.
├── <ProjectName>
├── <ProjectName>.xcodeproj
本节介绍插件相关接口的调用流程。接口的参数解释详见接口说明。 注意:插件的使用是在接收端实现。
Android
初始化声网 AgoraRtcEngine
时,调用 enableExtension
启用插件。
tips:如果so库确定存在 调用addExtension返回-3 请尝试使用系统System.loadLibrary加载动态库
RtcEngineConfig config = new RtcEngineConfig();
config.addExtension("agora-iLiveData-filter-pre"); //添加前处理插件
config.addExtension("agora-iLiveData-filter-post"); //添加后处理插件(翻译远端用户)
engine = RtcEngine.create(config);
engine.enableExtension("iLiveDataPre", "RTVT_PRE", true); //开启前处理插件
engine.enableExtension("iLiveDataPost", "RTVT_POST", true);//开启后处理插件
iOS
初始化声网 AgoraRtcEngine
时,调用 enableExtensionWithVendor
启用插件。
AgoraRtcEngineConfig *config = [AgoraRtcEngineConfig new];
// 监听插件事件,用于接收 onEvent 回调
config.eventDelegate = self;
self.agoraKit = [AgoraRtcEngineKit sharedEngineWithConfig:config
delegate:self];
// 开启后处理插件
[self.kit enableExtensionWithVendor:[iLiveDataPost]
extension:[RTVT_POST]
enabled:YES];
//开启前处理插件
[self.kit enableExtensionWithVendor:[iLiveDataPre]
extension:[RTVT_PRE]
enabled:YES];
在使用插件时,除了在音频前处理的使用方法中一些必填参数以外,还需要由业务侧自行在AgoraExtensionInfo
方法中填入remoteUid
(远端用户ID,即音频发送端ID)、channelId
(音频通话频道ID)和localUid
(本端用户ID,即音频接收端ID),用于音频后处理的需要。
Android
调用setExtensionProperty
指定 key 为 startAudioTranslation_post
(后处理) 、 startAudioTranslation_pre
(前处理),并在value中以json格式传入appkey
appsecret
等参数。
JSONObject jsonObject = new JSONObject();
jsonObject.put("appKey", "");
jsonObject.put("appSecret", "");
jsonObject.put("srcLang", "zh");
jsonObject.put("dstLang", "en");
jsonObject.addProperty("asrResult", true);
jsonObject.addProperty("transResult", true);
jsonObject.addProperty("tempResult", false);
ExtensionInfo extensionInfo = new ExtensionInfo();
extensionInfo.localUid = ;
extensionInfo.channelId = ;
extensionInfo.remoteUid = ;
- 后处理
engine.setExtensionProperty("iLiveDataPost", "RTVT_POST", extensionInfo, "startAudioTranslation_post", jsonObject.toString());
- 前处理
engine.setExtensionProperty("iLiveDataPre", "RTVT_PRE", "startAudioTranslation_pre", jsonObject.toString());
iOS
调用setExtensionPropertyWithVendor
,指定 key 为 startAudioTranslation_post
(后处理) 、 startAudioTranslation_pre
(前处理),并在 value 中传入 appKey
和 appSecret
等参数。
- 后处理
NSDictionary * startDic = @{
//传入appkey
@"appKey":<YOUR_APP_KEY>,
//传入appsecret
@"appSecret":<YOUR_APP_SECRET>,
//传入源语言
@"srcLanguage":@"zh",
//传入目标语言
@"destLanguage":@"en",
//设置识别结果
@"asrResult":@(YES),
//设置翻译结果
@"transResult":@(YES),
//设置临时结果
@"tempResult":@(NO),
};
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:startDic options:NSJSONWritingPrettyPrinted error:nil];
NSString * jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
-(BOOL)_setProperty:(NSString*)key value:(NSString*)value type:(int)type{
AgoraExtensionInfo * info = [[AgoraExtensionInfo alloc] init];
info.remoteUid = ;
info.channelId = ;
info.localUid = ;
return [self.kit setExtensionPropertyWithVendor:[iLiveDataPost]
extension:[RTVT_POST]
extensionInfo:info
key:"startAudioTranslation_post"
value:value];
}
- 前处理
NSDictionary * startDic = @{
//传入appkey
@"appKey":<YOUR_APP_KEY>,
//传入appsecret
@"appSecret":<YOUR_APP_SECRET>,
//传入源语言
@"srcLanguage":@"zh",
//传入目标语言
@"destLanguage":@"en",
//设置识别结果
@"asrResult":@(YES),
//设置翻译结果
@"transResult":@(YES),
//设置临时结果
@"tempResult":@(NO),
};
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:startDic options:NSJSONWritingPrettyPrinted error:nil];
NSString * jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
[self.kit setExtensionPropertyWithVendor:[iLiveDataPre]
extension:[RTVT_PRE]
key:"startAudioTranslation_pre"
value:jsonStr];
注意:
- 调用使用插件接口时,需要保证channel中至少有2人在才可以调用,否则调用失败,插件无法使用。
- 进入channel后,插件会触发房间人员进入事件监听(onRemoteAudioStateChanged),并自动使用插件。如果不需要自动使用插件,请开发者自行进行设置。
- 如果需要回调临时结果,需要设置
tempResult
为YES,默认为NO。默认识别结果和翻译结果的回调都为YES,如果又不需要,请设置为NO。
Android
调用 setExtensionProperty
方法并指定 key 为 closeAudioTranslation_post
(后处理)、closeAudioTranslation_pre
(前处理), 来结束曲率识别和翻译插件的使用。
- 后处理
engine.setExtensionProperty("iLiveDataPost", "RTVT_POST", "closeAudioTranslation_post", "{}");
- 前处理
engine.setExtensionProperty("iLiveDataPre", "RTVT_PRE", "closeAudioTranslation_pre", "{}");
iOS
调用 setExtensionPropertyWithVendor
方法并指定 key 为 closeAudioTranslation_post
(后处理)、closeAudioTranslation_pre
(前处理), 来结束曲率识别和翻译插件的使用。
- 后处理
[self.kit setExtensionPropertyWithVendor:[iLiveDataPost]
extension:[RTVT_POST]
key:"closeAudioTranslation_post"
value:"end"];
- 前处理
[self.kit setExtensionPropertyWithVendor:[iLiveDataPre]
extension:[RTVT_PRE ]
key:"closeAudioTranslation_pre"
value:"end"];
注意:有以下两种情况需要开发者关注:
- P2P通话时,如果某方出现断线情况,那么在重连成功后,需要开发者主动调用使用插件
- P2P通话时,如果某方离开频道,那么另一方在监听到离开事件后,自动结束使用插件。如果此时再进入到其他房间,需要开发者主动调用使用插件。
Android
初始化成功后,曲率识别及翻译插件会通过 onEvent
回调返回识别结果。识别结果的含义详见 onEvent
回调。
- 后处理
@Override
public void onEvent(String vendor, String extension, String key, String value) {
vendor:"iLiveData"
key: "recognizeResult"识别结果标识 "translateResult"翻译结果标识 "recognizedTempResult"临时识别结果标识 "translatedTempResult"临时翻译结果标识
extension: "RTVT_POST"
value: 对应key分别为 识别结果 和 翻译结果 和 临时识别结果 和 临时翻译结果
}
- 前处理
@Override
public void onEvent(String vendor, String extension, String key, String value) {
vendor:"iLiveData"
key: "recognizeResult"识别结果标识 "translateResult"翻译结果标识 "recognizedTempResult"临时识别结果标识 "translatedTempResult"临时翻译结果标识
extension: "RTVT_PRE"
value: 对应key分别为 识别结果 和 翻译结果 和 临时识别结果 和 临时翻译结果
}
iOS
初始化成功后,曲率识别及翻译插件会通过 onEvent
回调返回识别结果。识别结果的含义详见 onEvent 回调。
- 后处理
-(void)onEvent:(NSString *)provider extension:(NSString *)extension key:(NSString *)key value:(NSString *)value{
provider:"iLiveDataPost"
extension:"RTVT_POST"
key: "recognizeResult"识别结果标识 "translateResult"翻译结果标识 "recognizedTempResult"临时识别结果标识 "translatedTempResult"临时翻译结果标识
value: 对应key分别为 识别结果 和 翻译结果 和 临时识别结果 和 临时翻译结果
}
- 前处理
-(void)onEvent:(NSString *)provider extension:(NSString *)extension key:(NSString *)key value:(NSString *)value{
provider:"iLiveDataPre"
extension:"RTVT_PRE"
key: "recognizeResult"识别结果标识 "translateResult"翻译结果标识 "recognizedTempResult"临时识别结果标识 "translatedTempResult"临时翻译结果标识
value: 对应key分别为 识别结果 和 翻译结果 和 临时识别结果 和 临时翻译结果
}
平台 | 语言 | 示例项目 |
---|---|---|
Android | Java | 项目示例 |
iOS | Objective-C | 项目示例 |
Android
- 克隆仓库:
git clone (https://github.com/highras/rtvt-shengwang-marketplace)
- 将项目的\app\src\main\res\values\string_configs.xml 文件中的"agora_app_id" 和"agora_access_token"替换成你自己声网的appid和apptoken 获取 App ID 请参考开始使用 Agora 平台; 将"livedata_translate_pid" 和 "livedata_translate_key"替换成云上曲率项目id和key 获取方式详见购买和激活插件。
- 连接一台 Android 真机(非模拟器),运行项目。 输入频道号 点击“加入频道” 加入成功后 点击"开始翻译" 界面可以看见翻译结果
iOS
- 从声网云市场下载页面下载曲率识别及翻译插件的 iOS 插件包并解压。
- 将 iLiveData_Agora.framework 拖入项目。
- 项目设置 在TARGETS->Build Settings->Other Linker Flags (选中ALL视图)中添加-ObjC,字母O和C大写,符号“-”请勿忽略。
- 静态库中采用Objective-C++实现,因此需要您保证您工程中至少有一个.mm后缀的源文件( 您可以将任意一个.m后缀的文件改名为.mm )。
- 打开 ViewController,进行如下修改:
- 将
agora_appId
替换为你的 App ID。获取 App ID 请参考开始使用 Agora 平台。 - 将
appKey
和appSecret
分别替换为你的appKey
和appSecret
。获取方式详见购买和激活插件。
- 将
- 执行 初始化 + 启用插件 步骤
- 连接一台 iOS 真机(非模拟器),运行项目。
运行成功后,示例项目会安装到你的 Android 或 iOS 设备上。
- 启动 app,你可以在界面上看到
disableExtension
和Start ASR
按钮 - 点击
Start RTVT
开始语音识别。 - 点击
End ASR
结束语音识别。
插件所有相关接口的参数解释详见接口说明。