使用说明
本文介绍如何在你的项目中集成和使用微软实时语音转写&翻译(多语种)插件(以下简称“微软转写及翻译插件”)。
技术原理
微软转写及翻译插件是对微软语音 SDK 核心 API 的封装。通过声网 SDK v4.x 提供的 setExtensionProperty 方法,传入指定的 key 和 value 参数,你可以快速集成微软的语音转写能力。
setExtensionProperty 方法的 key 参数与微软的 API 名称完全对应,value 参数以 JSON 格式包装该 API 的部分或全部参数。因此,调用该方法时只要传入指定的 key 和 value,就可以调用对应的微软 API,实现语音转写的有关功能。
前提条件
Android 开发环境需满足以下要求:
- Android Studio 4.1 以上版本。
 - 运行 Android 6.0 或以上版本的真机(非模拟器)。
 
示例项目
微软转写及翻译插件提供了一个 GitHub 示例项目,你可以前往克隆或下载并进行体验。
| 平台 | 语言 | 示例项目 | 
|---|---|---|
| Android | Java | Microsoft/android | 
| iOS | Objective-C | Microsoft/ios | 
运行步骤 
参考以下步骤快速跑通示例项目:
- 
克隆仓库:
Shellgit clone https://github.com/AgoraIO-Community/AgoraMarketPlace.git - 
进入声网控制台 > 云市场页面,下载微软转写及翻译插件的 Android 插件包。解压后,将所有
.aar文件保存到Microsoft/android/app/libs路径。 - 
在 Android Studio 中打开示例项目
Microsoft/android。 - 
将项目与 Gradle 文件同步。
 - 
打开
Microsoft/android/app/src/main/java/io/agora/rte/extension/Microsoft/example/Config.java文件,进行如下修改:- 将 
<YOUR_APP_ID>替换为你的 App ID。获取 App ID 请参考开通服务。 - 将 
<YOUR_SUBSCRIPTION>和<YOUR_REGION>分别替换为你的 Azure 资源密钥和 Azure 资源所在区域。获取方式详见使用 Azure 门户创建认知服务资源。 
Javapublic interface Config {
String mAppId = "<YOUR_APP_ID>";
String mSubscription = "<YOUR_SUBSCRIPTION>";
String mRegion = "<YOUR_REGION>";
} - 将 
 - 
连接一台 Android 真机(非模拟器),运行项目。
 
预期效果
运行成功后,示例项目会安装到你的设备上。
- 启动 App,你可以在界面上看到 enableExtension 和 Start ASR 按钮
 - 点击 enableExtension 开启插件。
 - 点击 Start ASR 开始语音转写。此时 Start ASR 按钮会变成 Stop ASR 按钮。
 - 点击 Stop ASR 结束语音转写。
 - 点击 Start Translating 开始语音翻译。此时 Start Translating 按钮会变成 Stop Translating 按钮。
 - 点击 Stop Translating 结束语音翻译。
 
集成和调用流程
本节介绍如何集成声网 SDK 和插件,并调用核心 API 实现转写和翻译功能。
1. 集成 SDK 和插件
开始前,你需要在项目中分别集成声网音频 SDK 和微软转写及翻译插件。
1.1 集成声网音频 SDK
微软转写及翻译插件需要与声网音频 SDK v4.x 搭配使用。参考以下文档集成音频 SDK v4.x 并实现基础的语音通话:
1.2 获取 Azure 资源的密钥和区域
参考免费试用语音服务获取你的 Azure 资源密钥和区域。后续初始化插件时,需要传入你的密钥和区域。
1.3 集成插件 
参考以下步骤在你的项目中集成微软转写及翻译插件:
- 
进入声网控制台 > 云市场页面下载微软转写及翻译插件的 Android 插件包。
 - 
解压后,将插件包中所有的
.aar文件保存到项目文件夹的/app/libs路径。 - 
打开
app/build.gradle文件,在dependencies中添加如下行:Javaimplementation fileTree(dir: "libs", include: ["*.jar", "*.aar"]) 
1.4 升级插件
声网云市场推荐你更新插件版本前使用数据库工具 (如 SQLite) 来实现插件版本管理,从而确保插件版本与对应的资源包版本一致。因为当插件版本和资源包版本未对齐时,会出现 App 闪退、崩溃等现象。
以下是用 SQLite 来进行插件版本管理的示例:
- 使用 SQLite 数据库自行维护插件包和资源包的版本信息。
 - 每次项目初始化时,自动检测当前项目使用的资源包版本:
- 如果无记录文件或记录的资源包版本为旧,则更新资源。成功更新后,回写最新资源包版本信息到 SQLite。
 - 如果记录的资源包版本与当前匹配,则正常实现业务。
 
 
如果你的项目已经集成过声网云市场提供的第三方插件,并需要更新插件,可以参考以下步骤来保证更新后的可用性。
以下升级流程以相芯美颜特效插件为例:
- 
参考集成插件章节下载所需平台最新版本的插件包和资源包。
 - 
删除项目内旧版本的插件包及其资源包后,再将新版插件和资源包放入对应位置。或者直接在对应目录下用新版插件和资源包替换旧版。
 - 
删除设备上用老版本插件和资源包编译的 App,重新编译你的项目并运行。
 
编译 App 时,系统会优先使用连接设备上存在的资源包。请务必在删除旧版本应用程序后再进行编译和运行,否则可能会出现插件版本与资源包不匹配的情况,从而导致各种意外问题。
2. 启用插件
创建并初始化 RtcEngine 后,首先调用 enableExtension 启用插件,再调用其它 API(enableVideo、joinChannel 等)。
RtcEngineConfig config = new RtcEngineConfig();
// 监听插件事件,用于接收 onEvent 回调
config.mExtensionObserver = this;
config.addExtension("AgoraMicrosoftExtension");
mRtcEngine = RtcEngine.create(config);
// 开启插件
mRtcEngine.enableExtension("Microsoft", "Speech_Recognition", enabled);
3. 初始化语音转写
调用 setExtensionProperty 方法,指定 key 为 init_speech_recognition 并在 value 中传入 subscription 和 region 等参数。
// 方便后续多次调用 setExtensionProperty
private void setExtensionProperty(String key, String property) {
    mRtcEngine.setExtensionProperty("Microsoft", "Speech_Recognition", key, property);
}
// 初始化语音转写
try {
    JSONObject jsonObject = new JSONObject();
    // 传入 Azure 资源密钥
    jsonObject.put("subscription", "<paste-your-speech-key-here>");
    // 传入 Azure 资源所在区域
    jsonObject.put("region", "<paste-your-speech-location/region-here>");
    JSONArray jsonArray = new JSONArray();
    // 指定源语言
    jsonArray.put("en-US");
    jsonArray.put("zh-CN");
    jsonObject.put("source_languages", jsonArray);
    // 开启语种自动检测
    jsonObject.put("enable_auto_detect", true);
    setExtensionProperty("init_speech_recognition", jsonObject.toString());
} catch (JSONException e) {
    Log.e(TAG, e.toString());
}
4. 初始化语音翻译
调用 setExtensionProperty 方法,指定 key 为 init_translate_recognition 并在 value 中传入 subscription 等参数。
// 方便后续多次调用 setExtensionProperty
private void setExtensionProperty(String key, String property) {
    mRtcEngine.setExtensionProperty("Microsoft", "Speech_Recognition", key, property);
}
// 初始化语音翻译
try {
    JSONObject jsonObject = new JSONObject();
    // 传入 Azure 资源密钥
    jsonObject.put("subscription", "<paste-your-speech-key-here>");
    JSONArray jsonArray = new JSONArray();
    // 指定源语言
    jsonArray.put("en-US");
    jsonArray.put("zh-CN");
    jsonObject.put("source_languages", jsonArray);
    // 指定目标语言
    jsonArray.put("fr");
    jsonArray.put("ja");
    jsonObject.put("target_languages", jsonArray);
    // 开启语种自动检测
    jsonObject.put("enable_auto_detect", true);
    setExtensionProperty("init_speech_recognition", jsonObject.toString());
} catch (JSONException e) {
    Log.e(TAG, e.toString());
}
5. 开始转写
调用 setExtensionProperty,指定 key 为 start_continuous_recognition_async。
收到声网 SDK 的 onStarted 回调后,调用 getExtensionProperty,传入 key 为 getSpeakersInfo,获取音色列表:
setExtensionProperty("start_continuous_recognition_async", "{}");
成功开始识别后,微软转写及翻译插件会通过 onEvent 回调返回识别结果。识别结果的含义详见 onEvent 回调。
6. 开始翻译
调用 setExtensionProperty,指定 key 为 start_continuous_translate_async。
setExtensionProperty("start_continuous_translate_async", "{}");
成功开始识别后,微软转写及翻译插件会通过 onEvent 回调返回识别结果。识别结果的含义详见 onEvent 回调。
7. 结束转写和翻译
需要结束转写时,调用 setExtensionProperty方法并指定 key 为 stop_continuous_recognition_async、stop_continuous_translate_async。
setExtensionProperty("stop_continuous_recognition_async", "{}");
setExtensionProperty("stop_continuous_translate_async", "{}");