前言
随心译是一款集语音辨认、文本翻译和语音合成于一体的实时翻译利用,反对多国语言间的实时对话翻译与文本翻译,实用于出国旅行、社交交换、语言学习等等场合。
借助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模块,把翻译后的内容间接朗诵进去。
性能开发
- 应用实时语音辨认服务插件,疾速集成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 }
- 新建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
原作者:胡椒