過年回來,程式員阿強變了,
阿強,一個向來對外宣稱只關心代碼的男人,近期突然加入了辦公室自發組織的追星興趣小組,熱情高漲的探討起“飯圈文學”,對新生代的明星愛豆,雖不能做到如數家珍,卻透露出十足興味,特別是在應援話術和常見追星場景上,阿強尤為認真,甚至做起了筆記……
輪番追問,才發現這個成熟coder細膩又體貼的內心,
原來,隨著選秀節目《創4》的“突如其來”,阿強的女友阿珍,又粉上了新一代年輕愛豆,不同的是,這次粉的還是幾位來自日、韓、俄、泰、烏克蘭的國際選手,語言不通的阿珍,一如既往地淹沒在飯圈女孩的茫茫人海中,粉得轟轟烈烈又平平無奇,
阿強深知,飯圈內卷絲毫不比開發圈輕松,會寫彩虹文的比不上會p美圖的,會設計燈牌的較之扛長焦的又稍顯遜色……
想讓女友的追星體驗更佳,甚至脫穎而出,阿強很快找到了突破口——為女友開發一個追星翻譯神器,
說干就干,阿強迅速構思出這個翻譯器的重點功能,包含但不限于:
1、支持文本和語音輸入;
2、支持多國語言;
3、譯文支持生成語音……
阿強想,該翻譯器不僅適用于追星場景,日后出國旅游、社交交流、語言學習也能扛起大任,

實作原理
借助華為機器學習能力,任何人都可以簡單便捷的使用原本復雜的機器學習能力,助力開發者更快更好地開發各類AI應用,
開發準備
1、配置華為Maven倉地址
2、添加編譯SDK依賴
打開應用級的“build.gradle”檔案
dependencies {
...
// 引入實時語音識別服務插件
implementation 'com.huawei.hms:ml-computer-voice-asr-plugin:2.0.3.300'
// 引入文本翻譯服務SDK
implementation 'com.huawei.hms:ml-computer-translate:2.0.4.300'
// 引入文本翻譯演算法包
implementation 'com.huawei.hms:ml-computer-translate-model:2.0.4.300'
// 引入語音合成服務SDK
implementation 'com.huawei.hms:ml-computer-voice-tts:2.0.4.300'
// 引入離線語音合成bee語音包
implementation 'com.huawei.hms:ml-computer-voice-tts-model-bee:2.0.4.300'
}
上述步驟可以參考開發者網站中的應用開發介紹
https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides-V5/config-agc-0000001050990353-V5
3、在AndroidManifest.xml中添加權限
打開main中的AndroidManifest.xml檔案,在<application 前添加所需的權限
<uses-permission android:name="android.permission.INTERNET" /> <!-- 訪問網路 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 獲取網路狀態 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!-- 升級演算法版本 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><!-- 獲取Wi-Fi狀態 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" /><!-- 通過錄音機獲取聲音 -->
開發步驟
頁面設計
參考activity_main.xml布局檔案,設計專屬自己好用的頁面app頁面

點擊“開始識別”按鈕,加載ASR模塊,識別用戶說話的內容,
點擊“合成語音”,加載TTS模塊,把翻譯后的內容直接朗讀出來,
功能開發
1. 使用實時語音識別服務插件,快速集成ASR能力
public void startAsr(View view) {
// 通過intent進行識別設定,
Intent intent = new Intent(this, MLAsrCaptureActivity.class)
// 設定識別語言為英語,若不設定,則默認識別英語,支持設定:"zh-CN":中文;"en-US":英語;"fr-FR":法語;"es-ES":西班牙語;"de-DE":德語;"it-IT":意大利語,
.putExtra(MLAsrCaptureConstants.LANGUAGE, Constants.ASR_SOURCE[spinnerInput.getSelectedItemPosition()])
// 設定拾音界面是否顯示識別結果,MLAsrCaptureConstants.FEATURE_ALLINONE為不顯示,MLAsrCaptureConstants.FEATURE_WORDFLUX為顯示,
.putExtra(MLAsrCaptureConstants.FEATURE, MLAsrCaptureConstants.FEATURE_WORDFLUX);
// 100表示當前Activity和拾音界面Activity之間的請求碼,通過該碼可以在當前Activity中獲取拾音界面的處理結果,
startActivityForResult(intent, 100);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
String text;
// 100是第2步中定義的當前Activity和拾音界面Activity之間的請求碼,
if (requestCode == 100) {
switch (resultCode) {
// 回傳值為MLAsrCaptureConstants.ASR_SUCCESS表示識別成功,
case MLAsrCaptureConstants.ASR_SUCCESS:
if (data != null) {
Bundle bundle = data.getExtras();
// 獲取語音識別得到的文本資訊,
if (bundle != null && bundle.containsKey(MLAsrCaptureConstants.ASR_RESULT)) {
text = bundle.getString(MLAsrCaptureConstants.ASR_RESULT);
// 識別得到的文本資訊處理,
textViewInput.setText(text);
Translation.run(this, textViewOutput, spinnerInput.getSelectedItemPosition(),
spinnerOutput.getSelectedItemPosition(), text);
}
}
break;
...
}
}
}
2. 新建Translation類,用于呼叫文本翻譯的能力
首先暴露公共方法,根據引數判斷使用在線翻譯或者離線翻譯
public static void run(Activity activity, TextView textView, int sourcePosition, int targetPosition, String sourceText) {
Log.d(TAG, Constants.TRANSLATE[sourcePosition] + ", " + Constants.TRANSLATE[targetPosition] + ", " + sourceText);
if (isOffline) {
onDeviceTranslation(activity, textView, sourcePosition, targetPosition, sourceText);
} else {
realTimeTranslation(textView, sourcePosition, targetPosition, sourceText);
}
}
接著分別引入在線和離線翻譯的具體方法
private static void realTimeTranslation(final TextView textView, int sourcePosition, final int targetPosition, String sourceText) {
Log.d(TAG, "realTimeTranslation");
...
}
private static void onDeviceTranslation(final Activity activity, final TextView textView, final int sourcePosition, final int targetPosition, final String sourceText) {
Set<String> result = MLTranslateLanguage.syncGetLocalAllLanguages();
Log.d(TAG, "本地離線翻譯支持的語種: " + Arrays.toString(result.toArray()));
...
}
新建TTS類,用于呼叫語音合成的能力
同Translation一樣,首先暴露公共方法,根據引數判斷使用在線語音合成或者離線語音合成
public static void run(Activity activity, int targetPosition, String sourceText) {
Log.d(TAG, sourceText);
if (isNotAuto || sourceText.isEmpty()) {
return;
}
if (isOffline) {
if (0 == targetPosition) {
Toast.makeText(activity, "暫不支持離線中文發音", Toast.LENGTH_SHORT).show();
return;
}
offlineTts(activity, Constants.TTS_TARGET[targetPosition],
Constants.TTS_TARGET_SPEAKER_OFFLINE[targetPosition], sourceText);
} else {
onlineTts(Constants.TTS_TARGET[targetPosition], Constants.TTS_TARGET_SPEAKER[targetPosition], sourceText);
}
}
接著,分別引入在線和離線語音合成的具體實作
private static void onlineTts(String language, String person, String sourceText) {
Log.d(TAG, language + ", " + person + ", " + sourceText);
...
}
private static void offlineTts(final Activity activity, String language, final String person, final String sourceText) {
// 使用自定義引數配置創建語音合成引擎,
// 發音人名稱請參見“音色試聽”章節,
final MLTtsConfig mlTtsConfig = new MLTtsConfig().setLanguage(language)
.setPerson(person)
// 設定語音合成的模式為離線模式,不設定默認為在線模式,
.setSynthesizeMode(MLTtsConstants.TTS_OFFLINE_MODE);
...
}
添加自定義語言支持
1、分別在多語言的values/arrays.xml檔案中,添加需要的語言(比如Italian)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="languages">
...
<item>Spanish</item>
<!--add next line-->
<item>Italian</item>
</string-array>
</resources>
2、在Language列舉類中,添加ASR/Translate/TTS模塊的語言代碼
public enum Language {
...
ES(MLAsrConstants.LAN_ES_ES, "es", MLTtsConstants.TTS_LAN_ES_ES, MLTtsConstants.TTS_SPEAKER_FEMALE_ES,
MLTtsConstants.TTS_SPEAKER_OFFLINE_ES_ES_FEMALE_BEE),
// add next line
IT("it-IT", "it", MLTtsConstants.TTS_LAN_IT_IT, MLTtsConstants.TTS_SPEAKER_FEMALE_IT,
MLTtsConstants.TTS_SPEAKER_OFFLINE_IT_IT_FEMALE_BEE);
...
從前往后各欄位的含義分別是ASR輸入語言,翻譯目標語言,TTS輸出語言,TTS輸出語言音色,
完成以上兩步,就可以在App中使用意大利語了,
最終效果

阿強相信,憑借此神器,女友阿珍必定能克服了語言障礙,于千篇一律的彩虹應援詞中,使用愛豆母語發送問候,瞬間突出!在公演現場和見面會,用愛豆熟悉的語言呼喚他,識訓了身處異國的愛豆的注意!甚至榮升愛豆國際后援團中國區團長,與全球團長共商應援大事,都指日可待!
而成就這一切背后的男人,就是深藏功與名的阿強,一個做事低調的coder而已,
>>訪問華為開發者聯盟官網,了解更多相關內容
>>獲取開發指導檔案
>>華為移動服務開源倉庫地址:GitHub、Gitee
關注我們,第一時間了解華為移動服務最新技術資訊~
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/264189.html
標籤:其他
上一篇:SDK開發基本規范
