Flutter 中有多个本地 HMS ML Kit 翻译器模型?

Multiple local HMS ML Kit translator models in Flutter?

我定义了一个 class 来包装 HMS ML Kit 设备内翻译器。 这个 class 有两个翻译器实例,有两个不同的设置:

MLLocalTranslator translatorSend = new MLLocalTranslator();
MLLocalTranslator translatorReceive = new MLLocalTranslator();
MLTranslateSetting settingSend = new MLTranslateSetting();
MLTranslateSetting settingReceive = new MLTranslateSetting();

translatorSend 将请求从一种语言(例如 it)翻译成英语(en)。 translatorReceive 将请求的响应从 en 转换为 it
但是,prepare 方法只下载用于 en_it 翻译的模型,而不是 it_en 模型(如果存在)。

HMSTranslator(String languageCode) {
  settingSend.sourceLangCode = languageCode;
  settingSend.targetLangCode = "en";
  settingReceive.sourceLangCode = "en";
  settingReceive.targetLangCode = languageCode;
}

Future<bool> prepare() async {
  if(settingSend.sourceLangCode != settingSend.targetLangCode) {
    bool isSendPrepared = await translatorSend.prepareModel(setting: settingSend)
    bool isReceivePrepared = await translatorReceive.prepareModel(setting: settingReceive);
    isPrepared = isSendPrepared && isReceivePrepared;
  }
  else {
    isPrepared = false;
  }
  return isPrepared;
}

当我用 translatorSend.

翻译字符串时出现问题
Future<String> translateString(String stringToTranslate) async {
  if(settingSend.sourceLangCode != settingSend.targetLangCode) {
    String result;
    if (isPrepared) {
      result = await translatorSend.asyncTranslate(sourceText: stringToTranslate);
    }
    else {
      settingSend.sourceTextOnRemote = stringToTranslate;
      result = await sendRemoteTranslator.asyncTranslate(setting: settingSend);
    }
    return result;
  }
  else {
    return stringToTranslate;
  }
}

此方法应将 it 字符串转换为 en 字符串。但是,它似乎调用了 en_it 模型并且翻译失败:

I/flutter (28228): TRANSLATOR: it to en
I/flutter (28228): TRANSLATOR: PREPARED
I/MLLocalTranslator(28228): translate sourceLanguage: en targetLanguage: it
WHAT: vestiti usati -> vestiti usati  - WHERE applicazione -> applicazione 

响应的翻译,从 enit 有效。
我已经测试了其他语言,fr.
也会发生这种情况 进一步的测试表明该过程适用于 es:

WHAT: ropa usada -> Used clothing  - WHERE aplicación -> application 

我们可以使用 HMS ML 套件将文本翻译成不同的语言。以下是资料。可以参考。

ML 服务目前可以在 12 种语言之间翻译文本:简体中文、英语、法语、阿拉伯语、泰语、西班牙语、土耳其语、葡萄牙语、日语、德语、意大利语和俄语。

第 1 步:从 UI 获取文本并提供给 ML 模型

第 2 步:在 API 调用服务器

之前设置参数

‍‍‍‍· 源语言代码

‍‍‍‍· 所需语言代码

‍‍‍‍· 需要翻译的字符串。

第 3 步:API 数据到达服务器后,ML 模型将文本转换为所需的输出

第 4 步:服务器 returns 将翻译输出到应用程序。

第 5 步:应用程序将输出显示到 UI。

注意事项:机器学习模型存储在云端。进行了 Internet 调用,因此需要其许可。

为了 运行 构建和 运行 项目

,您必须进行以下更改

打开 App.gradle 文件并将此行添加到顶部。

应用插件:'com.huawei.agconnect'

要使用文本翻译服务,请将此依赖项添加到 pro

实施'com.huawei.hms:ml-computer-translate:1.0.3.300'

正在创建 MLRemoteTranslateSetting 对象,它将源语言作为 setSourceLangCode() 并将输出语言作为 setTargetLangCode()

MLRemoteTranslator 对象是通过将先前创建的 MLRemoteTranslateSetting 对象传递给它而创建的。

您可以创建一个任务,其中 mlRemoteTranslator 将通过 asyncTranslate() 进行异步调用,我们将提供用户字符串作为此方法的输入。

此任务将产生 2 个回调

addOnSuccessListener

addOnFailureListener

顾名思义,您可以在成功侦听器中添加代码,也可以在失败侦听器中添加 notification/Log。

对于 Flutter:

首先: 在 initState 中创建 MlTranslatorSettings 对象和实例

第二: 为翻译器设置设置,例如,翻译的初始语言和最终语言,请参见下面的示例。

属性中可以自定义地图类型、控件、相机位置、初始位置等

这里还有一些详细信息。关于如何将 HMS ML kit 与 Flutter 结合使用: Link希望对你有所帮助

请检查您是否使用了新版本的Flutter插件

语言包可以双向使用。例如,en-it 可用于 enititen

以下内容供您参考:

根据官网插件Demo修改

同一个实例多次调用双向翻译

//Entry function
_translationMake() async {
  try {
    await _prepareModel_run("it","en","vestiti usati");
    await _prepareModel_run("en","it","application");
  } on Exception catch (e) {
    print(e.toString());
  }
}

_prepareModel_run(String srcLang, String dstLang, String content) async {
  setting.sourceLangCode = srcLang;
  setting.targetLangCode = dstLang;
  try {
    final bool res = await translator.prepareModel(setting: setting); 
    if (res) {
      final String s = await _localTranslate_run(content);
      if (s != null) {
        print("_prepareModel_run " + content + " translate to "+s);
      }
    }else {
      print("_prepareModel_run res false");
    }
  } on Exception catch (e) {
    print(e.toString());
  }
}


Future<String> _localTranslate_run(String Content) async {
  try {
    final String s =
    await translator.syncTranslate(sourceText: Content);
    if (s != null) {
      _stopLocalTranslate();
      
      setState(() => _translateResult = s);
      return s;
    } else {
      print("no Translation");
      setState(() => _translateResult = "no translation");
      return "no translation";
    }
  } on Exception catch (e) {
    print(e.toString());
  }
}

并且日志打印结果如下:

_prepareModel_run vestiti usati translate to Used clothes
_prepareModel_run application translate to applicazione