在 Unity 中调用腾讯云机器翻译
在游戏开发中,常常需要对文本进行翻译。在游戏开发的前期,通常就是对配置表进行机翻,调用各种大模型机器翻译进行操作。
本文主要介绍如何通过 C# 代码来调用腾讯云的文本翻译功能,并介绍一个在 Unity 中实现的示例。这样能方便地让我们以后能通过代码批量调用,提高工作效率。
注意:整个解决方案我只测试了编辑器,没有测试运行时。运行时是否可用暂不清楚。
1、SDK 接入
首先去腾讯云服务的官网下载SDK:https://cloud.tencent.com/document/sdk
因为我们这里是接入 Unity ,所以下载 .Net 版本。下面两个一个是 GitHub 仓库,一个是 Gitee 仓库,东西都是一样的,按照各位的喜好下载即可。
- https://github.com/TencentCloud/tencentcloud-sdk-dotnet
- https://gitee.com/tencentcloud/tencentcloud-sdk-dotnet
之后我们准备将其接入 Unity。在接入腾讯云的 SDK 之前,我们需要先下载一个newtonsoft.json.dll
包,这个应该是 .Net 框架自带的,但是 Unity 没有内置,所以需要我们自己加进来。这里大家自己去网上找资源就行,我用的是这个:https://cn.dll-files.com/newtonsoft.json.dll.html 。
然后我们导入腾讯云的文本翻译部分,首先我们之前下载下来的仓库,里面是C#源代码,我们不是所有的都用,只需要载入部分即可,只需要如下两个文件夹的东西:
-
...\\tencentcloud-sdk-dotnet\\TencentCloud\\Common
-
...\\tencentcloud-sdk-dotnet\\TencentCloud\\Tmt
把这两个文件夹直接拷贝到我们的 Unity 工程,即完成了 SDK 的接入。
如上图所示,确保引入了上面三个东西。
2、参数获取
这里需要获取腾讯云的一些参数,主要是 SecretId、SecretKey 以及 ProjectID 这三个东西,这些都可以在控制台申请到。
-
用于管理:https://console.cloud.tencent.com/cam
-
管理项目:https://console.cloud.tencent.com/project
注意,SecretId、SecretKey 只在创建用户时候能看到一次,一定要注意保存。
3、API 调用
直接上代码:
/// /// 腾讯云翻译器/// https://cloud.tencent.com/document/product/551/15612/// public class TencentTranslator : ScriptableObject{ [Title(\"参数配置\")] public string secretId = \"\"; public string secretKey = \"\"; public string Region = \"ap-chengdu\"; // 根据实际选择地域 private TmtClient m_Client; public TextTranslateRequest m_Req = new TextTranslateRequest(); [LabelText(\"源语言\")] public string Source = \"zh\"; [LabelText(\"目标语言\")] public string Target = \"en\"; [LabelText(\"项目ID\")] public int ProjectId; public void Init() { var credential = new Credential(); credential.SecretId = secretId; credential.SecretKey = secretKey; m_Client = new TmtClient(credential, Region); m_Req.Target = Target; m_Req.Source = Source; m_Req.ProjectId = ProjectId; Debug.Log($\"TencentTranslator 初始化完成:{ProjectId}\"); } /// /// 翻译的频率,这个需要查看官方文档; /// 目前我看到的限制是每秒5次; /// [LabelText(\"每秒翻译数量\")] public int TranslateRate = 5; public async Task Translate(string context) { if (m_Client == null) Init(); try { m_Req.SourceText = context; long scecond = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); var rsp = await m_Client.TextTranslate(m_Req); long offset = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() - scecond; Debug.Log($\"【腾讯云翻译】{context}\\n翻译结果:{rsp.TargetText}\\nAPI 调用耗时:{offset} ms\"); var delayTime = (int)math.max(0, (long)((1.0f / TranslateRate) * 1000) - offset); if (delayTime > 0) await System.Threading.Tasks.Task.Delay(delayTime); return rsp.TargetText; } catch (Exception ex) { Debug.LogException(ex); return string.Empty; } } [Title(\"测试\")] [Space] [ShowInInspector, LabelText(\"测试翻译\")] private string TextContext = \"你需要我翻译什么?\"; [Button(\"翻译测试\")] public void TestTranslate() { if (ProjectId == 0) { Debug.LogError(\"项目ID必填!\"); return; } if (m_Client == null) Init(); Translate(TextContext); }}
非常简单,之后我们直接在 Unity 里就能用了: