乐趣区

关于android:随心译无广告的专属实时翻译神器

前言


随心译是一款集语音辨认、文本翻译和语音合成于一体的实时翻译利用,反对多国语言间的实时对话翻译与文本翻译,实用于出国旅行、社交交换、语言学习等等场合。

借助 Huawei HMS Core ML Kit,任何人都能够简略便捷的应用本来十分复杂的机器学习能力,助力开发者更快更好地开发各类 AI 利用。

场景


当你在工作中遇到翻译问题而无奈解决,当你想要出国游览却因为语言问题而迟迟做不出决定。

开发筹备


1. 配置华为 Maven 仓地址
2. 增加编译 SDK 依赖

关上利用级的“build.gradle”文件

1    dependencies {    
2    ...    
3       // 引入实时语音辨认服务插件    
4        implementation 'com.huawei.hms:ml-computer-voice-asr-plugin:2.0.3.300'    
5       // 引入文本翻译服务 SDK    
6       implementation 'com.huawei.hms:ml-computer-translate:2.0.4.300'    
7       // 引入文本翻译算法包    
8       implementation 'com.huawei.hms:ml-computer-translate-model:2.0.4.300'    
9       // 引入语音合成服务 SDK    
10       implementation 'com.huawei.hms:ml-computer-voice-tts:2.0.4.300'    
11       // 引入离线语音合成 bee 语音包    
12       implementation 'com.huawei.hms:ml-computer-voice-tts-model-bee:2.0.4.300'    
13    }

上述步骤能够参考开发者网站中的利用开发介绍
https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides-V5/config-agc-0000001050990353-V5

3. 在 AndroidManifest.xml 中增加权限
关上 main 中的 AndroidManifest.xml 文件,在 <application 前增加所需的权限

1    <uses-permissionandroid:name="android.permission.INTERNET"/><!-- 拜访网络 -->    
2    <uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/><!-- 获取网络状态 -->    
3    <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/><!-- 降级算法版本 -->    
4    <uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/><!-- 获取 Wi-Fi 状态 -->    
5    <uses-permissionandroid:name="android.permission.RECORD_AUDIO"/><!-- 通过录音机获取声音 -->

开发步骤


页面设计

参考 activity_main.xml 布局文件,设计本人专属好用的页面 app 页面

点击“开始辨认”按钮,加载 ASR 模块,辨认用户谈话的内容。
点击“合成语音”,加载 TTS 模块,把翻译后的内容间接朗诵进去。

性能开发

  1. 应用实时语音辨认服务插件,疾速集成 ASR 能力
1    publicvoidstartAsr(View view){    
2       // 通过 intent 进行辨认设置。3       Intent intent =newIntent(this,MLAsrCaptureActivity.class)    
4           // 设置辨认语言为英语,若不设置,则默认辨认英语。反对设置:"zh-CN": 中文;"en-US": 英语;"fr-FR": 法语;"es-ES": 西班牙语;"de-DE": 德语;"it-IT": 意大利语。5           .putExtra(MLAsrCaptureConstants.LANGUAGE,Constants.ASR_SOURCE[spinnerInput.getSelectedItemPosition()])    
6           // 设置拾音界面是否显示辨认后果,MLAsrCaptureConstants.FEATURE_ALLINONE 为不显示,MLAsrCaptureConstants.FEATURE_WORDFLUX 为显示。7           .putExtra(MLAsrCaptureConstants.FEATURE,MLAsrCaptureConstants.FEATURE_WORDFLUX);    
8       // 100 示意以后 Activity 和拾音界面 Activity 之间的申请码,通过该码能够在以后 Activity 中获取拾音界面的处理结果。9       startActivityForResult(intent,100);    
10    }    
11    
12    @Override    
13    protectedvoidonActivityResult(int requestCode,int resultCode,Intent data){14       super.onActivityResult(requestCode, resultCode, data);    
15       String text;    
16       // 100 是第 2 步中定义的以后 Activity 和拾音界面 Activity 之间的申请码。17       if(requestCode ==100){18           switch(resultCode){    
19               // 返回值为 MLAsrCaptureConstants.ASR_SUCCESS 示意辨认胜利。20               caseMLAsrCaptureConstants.ASR_SUCCESS:    
21                   if(data !=null){22                       Bundle bundle = data.getExtras();    
23                       // 获取语音辨认失去的文本信息。24                       if(bundle !=null&& bundle.containsKey(MLAsrCaptureConstants.ASR_RESULT)){25                           text = bundle.getString(MLAsrCaptureConstants.ASR_RESULT);    
26                           // 辨认失去的文本信息处理。27                           textViewInput.setText(text);    
28                           Translation.run(this, textViewOutput, spinnerInput.getSelectedItemPosition(),    
29                               spinnerOutput.getSelectedItemPosition(), text);    
30                       }    
31                   }    
32                   break;    
33    ...    
34           }    
35       }    
36    }
  1. 新建 Translation 类,用于调用文本翻译的能力

首先裸露公共办法,依据参数判断应用在线翻译或者离线翻译

1 public static void run(Activity activity, TextView textView, int sourcePosition, int targetPosition, String sourceText) {2       Log.d(TAG, Constants.TRANSLATE[sourcePosition] + "," + Constants.TRANSLATE[targetPosition] + "," + sourceText);    
3       if (isOffline) {4           onDeviceTranslation(activity, textView, sourcePosition, targetPosition, sourceText);    
5       } else {6           realTimeTranslation(textView, sourcePosition, targetPosition, sourceText);    
7       }    
8    }

接着别离引入在线和离线翻译的具体方法

1    private static void realTimeTranslation(final TextView textView, int sourcePosition, final int targetPosition, String sourceText) {2       Log.d(TAG, "realTimeTranslation");    
3        ...    
4    }    
5    
6    private static void onDeviceTranslation(final Activity activity, final TextView textView, final int sourcePosition, final int targetPosition, final String sourceText) {7        Set<String> result = MLTranslateLanguage.syncGetLocalAllLanguages();    
8        Log.d(TAG, "本地离线翻译反对的语种:" + Arrays.toString(result.toArray()));    
9        ...    
10    }

3. 新建 TTS 类,用于调用语音合成的能力
同 Translation 一样,首先裸露公共办法,依据参数判断应用在线语音合成或者离线语音合成

1    publicstaticvoidrun(Activity activity,int targetPosition,String sourceText){2       Log.d(TAG, sourceText);    
3       if(isNotAuto || sourceText.isEmpty()){    
4           return;    
5       }    
6       if(isOffline){7           if(0== targetPosition){8               Toast.makeText(activity,"暂不反对离线中文发音",Toast.LENGTH_SHORT).show();    
9               return;    
10           }    
11           offlineTts(activity,Constants.TTS_TARGET[targetPosition],    
12               Constants.TTS_TARGET_SPEAKER_OFFLINE[targetPosition], sourceText);    
13       }else{14           onlineTts(Constants.TTS_TARGET[targetPosition],Constants.TTS_TARGET_SPEAKER[targetPosition], sourceText);    
15       }    
16    }

接着,别离引入在线和离线语音合成的具体实现

1    privatestaticvoidonlineTts(String language,String person,String sourceText){2    Log.d(TAG, language +","+ person +","+ sourceText);    
3    ...    
4    }    
5    
6    privatestaticvoidofflineTts(finalActivity activity,String language,finalString person,finalString sourceText){    
7    // 应用自定义参数配置创立语音合成引擎。8    // 发音人名称请参见“音色试听”章节。9    finalMLTtsConfig mlTtsConfig =newMLTtsConfig().setLanguage(language)    
10    .setPerson(person)    
11    // 设置语音合成的模式为离线模式,不设置默认为在线模式。12    .setSynthesizeMode(MLTtsConstants.TTS_OFFLINE_MODE);    
13    ...    
14    }

最终成果


源码


参加开发者探讨请到 Reddit 社区:
https://www.reddit.com/r/HMSCore/
下载 demo 和示例代码请到 Git:
https://github.com/HMS-Core
解决集成问题请到 Stack Overflow:
https://stackoverflow.com/questions/tagged/huawei-mobile-services?tab=Newest


原文链接:https://developer.huawei.com/consumer/cn/forum/topic/0201445556538420539?fid=18

原作者:胡椒

退出移动版