飞道的博客

听不懂《创4》外籍小哥哥在说啥?是时候写个翻译器辅助女友追星了

424人阅读  评论(0)

 过年回来,程序员阿强变了。

 阿强,一个向来对外宣称只关心代码的男人,近期突然加入了办公室自发组织的追星兴趣小组,热情高涨的探讨起“饭圈文学”,对新生代的明星爱豆,虽不能做到如数家珍,却透露出十足兴味,特别是在应援话术和常见追星场景上,阿强尤为认真,甚至做起了笔记……
轮番追问,才发现这个成熟coder细腻又体贴的内心。

 原来,随着选秀节目《创4》的“突如其来”,阿强的女友阿珍,又粉上了新一代年轻爱豆,不同的是,这次粉的还是几位来自日、韩、俄、泰、乌克兰的国际选手。语言不通的阿珍,一如既往地淹没在饭圈女孩的茫茫人海中,粉得轰轰烈烈又平平无奇。
阿强深知,饭圈内卷丝毫不比开发圈轻松。会写彩虹文的比不上会p美图的,会设计灯牌的较之扛长焦的又稍显逊色……

想让女友的追星体验更佳,甚至脱颖而出,阿强很快找到了突破口——为女友开发一个追星翻译神器
说干就干,阿强迅速构思出这个翻译器的重点功能,包含但不限于:
1、支持文本和语音输入;
2、支持多国语言;
3、译文支持生成语音……

阿强想,该翻译器不仅适用于追星场景,日后出国旅游、社交交流、语言学习也能扛起大任。

实现原理

借助华为机器学习能力,任何人都可以简单便捷的使用原本复杂的机器学习能力,助力开发者更快更好地开发各类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-permission android:name="android.permission.INTERNET" /> <!-- 访问网络 -->
  2. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 获取网络状态 -->
  3. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 升级算法版本 -->
  4. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 获取Wi-Fi状态 -->
  5. <uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 通过录音机获取声音 -->

开发步骤

页面设计

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

点击“开始识别”按钮,加载ASR模块,识别用户说话的内容。
点击“合成语音”,加载TTS模块,把翻译后的内容直接朗读出来。

功能开发

1. 使用实时语音识别服务插件,快速集成ASR能力
 


  
  1. public void startAsr(View view) {
  2. // 通过intent进行识别设置。
  3. Intent intent = new Intent( 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. @Override
  12. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  13. super.onActivityResult(requestCode, resultCode, data);
  14. String text;
  15. // 100是第2步中定义的当前Activity和拾音界面Activity之间的请求码。
  16. if (requestCode == 100) {
  17. switch (resultCode) {
  18. // 返回值为MLAsrCaptureConstants.ASR_SUCCESS表示识别成功。
  19. case MLAsrCaptureConstants.ASR_SUCCESS:
  20. if ( data != null) {
  21. Bundle bundle = data.getExtras();
  22. // 获取语音识别得到的文本信息。
  23. if (bundle != null && bundle.containsKey(MLAsrCaptureConstants.ASR_RESULT)) {
  24. text = bundle.getString(MLAsrCaptureConstants.ASR_RESULT);
  25. // 识别得到的文本信息处理。
  26. textViewInput.setText(text);
  27. Translation.run( this, textViewOutput, spinnerInput.getSelectedItemPosition(),
  28. spinnerOutput.getSelectedItemPosition(), text);
  29. }
  30. }
  31. break;
  32. ...
  33. }
  34. }
  35. }

2. 新建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. private static void onDeviceTranslation( final Activity activity, final TextView textView, final int sourcePosition, final int targetPosition, final String sourceText) {
  6. Set< String> result = MLTranslateLanguage.syncGetLocalAllLanguages();
  7. Log.d(TAG, "本地离线翻译支持的语种: " + Arrays.toString(result.toArray()));
  8. ...
  9. }

新建TTS类,用于调用语音合成的能力
同Translation一样,首先暴露公共方法,根据参数判断使用在线语音合成或者离线语音合成


  
  1. public static void run(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. private static void onlineTts( String language, String person, String sourceText) {
  2. Log.d(TAG, language + ", " + person + ", " + sourceText);
  3. ...
  4. }
  5. private static void offlineTts( final Activity activity, String language, final String person, final String sourceText) {
  6. // 使用自定义参数配置创建语音合成引擎。
  7. // 发音人名称请参见“音色试听”章节。
  8. final MLTtsConfig mlTtsConfig = new MLTtsConfig().setLanguage(language)
  9. .setPerson(person)
  10. // 设置语音合成的模式为离线模式,不设置默认为在线模式。
  11. .setSynthesizeMode(MLTtsConstants.TTS_OFFLINE_MODE);
  12. ...
  13. }

 

添加自定义语言支持

1、分别在多语言的values/arrays.xml文件中,添加需要的语言(比如Italian)


  
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <string-array name="languages">
  4. ...
  5. <item>Spanish </item>
  6. <!--add next line-->
  7. <item>Italian </item>
  8. </string-array>
  9. </resources>

2、在Language枚举类中,添加ASR/Translate/TTS模块的语言代码


  
  1. public enum Language {
  2. ...
  3. ES(MLAsrConstants.LAN_ES_ES, "es", MLTtsConstants.TTS_LAN_ES_ES, MLTtsConstants.TTS_SPEAKER_FEMALE_ES,
  4. MLTtsConstants.TTS_SPEAKER_OFFLINE_ES_ES_FEMALE_BEE),
  5. // add next line
  6. IT( "it-IT", "it", MLTtsConstants.TTS_LAN_IT_IT, MLTtsConstants.TTS_SPEAKER_FEMALE_IT,
  7. MLTtsConstants.TTS_SPEAKER_OFFLINE_IT_IT_FEMALE_BEE);
  8. ...

从前往后各字段的含义分别是ASR输入语言,翻译目标语言,TTS输出语言,TTS输出语言音色。

完成以上两步,就可以在App中使用意大利语了。

最终效果

 

阿强相信,凭借此神器,女友阿珍必定能克服了语言障碍,于千篇一律的彩虹应援词中,使用爱豆母语发送问候,瞬间突出!在公演现场和见面会,用爱豆熟悉的语言呼唤他,收获了身处异国的爱豆的注意!甚至荣升爱豆国际后援团中国区团长,与全球团长共商应援大事,都指日可待!

而成就这一切背后的男人,就是深藏功与名的阿强,一个做事低调的coder而已。

 

>>访问华为开发者联盟官网,了解更多相关内容

>>获取开发指导文档

>>华为移动服务开源仓库地址:GitHubGitee

关注我们,第一时间了解华为移动服务最新技术资讯~


转载:https://blog.csdn.net/HUAWEI_HMSCore/article/details/114118282
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场