隨心譯——無廣告的專屬實時翻譯神器


前言


隨心譯是一款集語音識別、文本翻譯和語音合成於一體的實時翻譯應用,支持多國語言間的實時對話翻譯與文本翻譯,適用於出國旅行、社交交流、語言學習等等場合。

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

原作者:胡椒


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM