• 随心译——无广告的专属实时翻译神器


    前言


    随心译是一款集语音识别、文本翻译和语音合成于一体的实时翻译应用,支持多国语言间的实时对话翻译与文本翻译,适用于出国旅行、社交交流、语言学习等等场合。

    借助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

    原作者:胡椒

  • 相关阅读:
    windows下python-nmap运行过程中出现的问题及解决办法
    命令行下cl.exe编译链接的问题及解决方法
    httrack: error while loading shared libraries: libhttrack.so.2的解决方法
    AES加解密非固定长度文本的用法
    John the Ripper password cracker试用
    ubuntu12.04使用root登陆的简单设置
    map按value查找相应元素
    ListCtrl添加右键菜单(ListCtrl类里编辑,给ListCtrl 发送NM_RCLICK消息)
    今天发现里一个非常好用的Listbox自绘类,带不同文字字体和图片,觉得很有必要记下来
    自绘listCtrl控件选中该行高亮(模拟windows)
  • 原文地址:https://www.cnblogs.com/developer-huawei/p/14376257.html
Copyright © 2020-2023  润新知