使用说明
本文介绍如何在你的项目中集成和使用讯飞语音实时转写及翻译(多语种)插件(以下简称“讯飞转写及翻译插件”)。
技术原理
讯飞转写及翻译插件的工作流程如下:
- 设置源语种和目标语种。
- 声网 SDK 通过麦克风来流式录音。
- 音频传递给讯飞转写及翻译插件。
- 插件把音频上传给语音转写服务,并下载语音转写结果。
- 解析语音转写结果,得到语音转写文本。
- 把语音转写文本上传给文本翻译服务,并下载文本翻译结果。
- 解析文本翻译结果,得到文本翻译文本。
前提条件
iOS 开发环境需满足以下要求:
- Xcode 9.0 或以上版本。
- 运行 iOS 9.0 或以上版本的真机(非模拟器)。
示例项目
讯飞转写及翻译插件提供了示例项目,你可以前往克隆或下载并进行体验。
平台 | 语言 | 示例代码 |
---|---|---|
Android | Java | 点击下载 |
iOS | Objective-C | 点击下载 |
Windows | C++ | 点击下载 |
运行步骤
参考以下步骤快速跑通示例项目:
-
在 Xcode 中打开
AgoraWithHyIos/AgoraWithHyIos.xcodeproj
。 -
打开
AppID.m
文件,将#YOUR APP ID#
替换为你的声网 App ID。获取 App ID 请参考开通服务。Objective-CNSString *const appID = @"#YOUR APP ID#";
-
打开
AgoraWithHyIos/VideoChatViewController.m
文件,填入以下参数:Objective-C// "app_id"、"api_key"、"api_secret" 分别对应在声网控制台购买插件后、由讯飞提供的 APPID、APIKey 和 APISecret
NSDictionary *commonDict = @{@"app_id":@"",@"api_key":@"",@"api_secret":@""}; -
连接一台 iOS 真机(非模拟器),运行项目。
预期效果
运行成功后,示例项目会安装到你的设备上。
- 启动 App,你可以在界面上看到中译英下拉控件,start、flush、stop 按钮,以及 tip、ist_text、its_text 文本视图。
- 可以单击中译英下拉控件选择参数。
- 单击 start 按钮启动倾听。
- 对着麦克风说话,语音转写文本会显示在 ist_text 文本视图中,文本翻译文本会显示在 its_text 文本视图中。
- 单击 flush 按钮结束音频获取结果,或单击 stop 按钮停止倾听。
- tip 文本视图会显示 onEnd。
集成和调用流程
1. 集成 SDK 和插件
开始前,你需要在项目中分别集成声网音频 SDK 和讯飞转写及翻译插件。
1.1 集成声网音频 SDK
讯飞转写及翻译插件需要与声网音频 SDK v4.x 搭配使用。参考以下文档集成音频 SDK v4.x 并实现基础的语音通话:
1.2 购买和激活插件
你需要进入声网控制台 > 云市场页面,按照提示购买讯飞转写及翻译插件。购买成功后,你会收到由讯飞提供的 APPID、APIKey 和 APISecret,后续启动倾听时需要用到。
1.3 集成插件
参考以下步骤集成插件:
-
进入声网控制台 > 云市场页面下载讯飞语音实时转写及翻译(多语种)的 iOS 插件包。
-
解压文件夹,将所有
.framework
文件保存到你的项目文件夹下。以如下项目结构为例,你可以把插件保存到frameworks
路径下。Shell.
├── <ProjectName>
│ ├── frameworks
├── <ProjectName>.xcodeproj
1.4 升级插件
声网云市场推荐你更新插件版本前使用数据库工具 (如 SQLite) 来实现插件版本管理,从而确保插件版本与对应的资源包版本一致。因为当插件版本和资源包版本未对齐时,会出现 App 闪退、崩溃等现象。
以下是用 SQLite 来进行插件版本管理的示例:
- 使用 SQLite 数据库自行维护插件包和资源包的版本信息。
- 每次项目初始化时,自动检测当前项目使用的资源包版本:
- 如果无记录文件或记录的资源包版本为旧,则更新资源。成功更新后,回写最新资源包版本信息到 SQLite。
- 如果记录的资源包版本与当前匹配,则正常实现业务。
如果你的项目已经集成过声网云市场提供的第三方插件,并需要更新插件,可以参考以下步骤来保证更新后的可用性。
以下升级流程以相芯美颜特效插件为例:
-
参考集成插件章节下载所需平台最新版本的插件包和资源包。
-
删除项目内旧版本的插件包及其资源包后,再将新版插件和资源包放入对应位置。或者直接在对应目录下用新版插件和资源包替换旧版。
-
删除设备上用老版本插件和资源包编译的 App,重新编译你的项目并运行。
编译 App 时,系统会优先使用连接设备上存在的资源包。请务必在删除旧版本应用程序后再进行编译和运行,否则可能会出现插件版本与资源包不匹配的情况,从而导致各种意外问题。
2. 初始化
集成插件后,你需要先初始化插件,步骤如下:
-
开启插件。
Objective-CAgoraRtcEngineConfig *cfg = [AgoraRtcEngineConfig new];
cfg.appId = appID;
cfg.eventDelegate = self;
self.agoraKit = [AgoraRtcEngineKit sharedEngineWithConfig:cfg delegate:self];
[self.agoraKit enableExtensionWithVendor:@"Hy" extension:@"IstIts" enabled:YES]; -
实现代理方法。
Objective-C#pragma mark - AgoraMediaFilterEventDelegate (self需要实现代理方法)
- (void)onEvent:(NSString * _Nullable)vendor extension:(NSString *)extension key:(NSString * _Nullable)key value:(NSString * _Nullable)value {} -
插件设置 logcat 日志等级。
Objective-C[self.agoraKit setExtensionProviderPropertyWithVendor:@"Hy" key:@"log_lvl" value:@"4"];
3. 启动倾听
空闲时可调用,调用后会进入会话。会话最长 5 小时。
- (void)hyStart:(id)obj{
[itsDataDict removeAllObjects];
[istDataDict removeAllObjects];
NSString *type =@"中译英";
NSMutableDictionary *rootDict = [NSMutableDictionary dictionary];
// "app_id"、"api_key"、"api_secret" 分别对应在声网控制台购买插件后、由讯飞提供的 APPID、APIKey 和 APISecret
NSDictionary *commonDict = @{@"app_id":@"",@"api_key":@"",@"api_secret":@""};
[rootDict setObject:commonDict forKey:@"common"];
NSMutableDictionary *istDict = [NSMutableDictionary dictionary];
[istDict setObject:@"wss://ist-api.xfyun.cn/v2/ist" forKey:@"uri"];
NSMutableDictionary *itsDict = [NSMutableDictionary dictionary];
[itsDict setObject:@"https://itrans.xfyun.cn/v2/its" forKey:@"uri"];
if([mSelectedType isEqualToString:type]){
NSDictionary *istBusinessDict = @{@"language":@"zh_cn",@"accent":@"mandarin",@"domain":@"ist_ed_open",@"language_type":@1,@"dwa":@"wpgs"};
NSDictionary *istReqDict = @{@"business":istBusinessDict};
[istDict setObject:istReqDict forKey:@"req"];
[rootDict setObject:istDict forKey:@"ist"];
NSDictionary *itsBusinessDict = @{@"from":@"cn",@"to":@"en"};
NSDictionary *itsReqDict = @{@"business":itsBusinessDict};
[itsDict setObject:itsReqDict forKey:@"req"];
[rootDict setObject:itsDict forKey:@"its"];
}else{
NSDictionary *businessDict = @{@"language":@"zh_cn",@"accent":@"mandarin",@"domain":@"ist_ed_open",@"language_type":@3,@"dwa":@"wpgs"};
NSDictionary *reqDict = @{@"business":businessDict};
[istDict setObject:reqDict forKey:@"req"];
[rootDict setObject:istDict forKey:@"ist"];
NSDictionary *itsBusinessDict = @{@"from":@"en",@"to":@"cn"};
NSDictionary *itsReqDict = @{@"business":itsBusinessDict};
[itsDict setObject:itsReqDict forKey:@"req"];
[rootDict setObject:itsDict forKey:@"its"];
}
NSData *data=[NSJSONSerialization dataWithJSONObject:rootDict options:NSJSONWritingPrettyPrinted error:nil];
NSString *str=[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
[self.agoraKit setExtensionPropertyWithVendor:@"Hy" extension:@"IstIts" key:@"start_listening" value:str];
}
4. 结束音频获取结果
会话时可调用,调用后会先处理完音频和结果,再进入空闲,回调 "end"
。
- (void)hyFlush:(id)obj{
[self.agoraKit setExtensionPropertyWithVendor:@"Hy" extension:@"IstIts" key:@"flush_listening" value:@"{}"];
}
讯飞转写及翻译插件会通过 onEvent
回调返回语音转写和文本翻译结果。识别结果的含义详见 onEvent 回调的 key。
5. 停止倾听
会话时可调用,调用后会先丢弃音频和结果,再进入空闲,回调 "end"
。
- (void)hyStop:(id)obj{
[self.agoraKit setExtensionPropertyWithVendor:@"Hy" extension:@"IstIts" key:@"stop_listening" value:@"{}"];
}