Android | 教你如何用代码开发一个拍照翻译小程序
引子
想必有很多小伙伴喜欢外出旅游,能去海外玩一圈那是更好不过了,旅游前大家一定会对吃、穿、住、行、游玩路线做各种攻略,然后满怀期待的出发…
想象中的旅游
出发前,想象中的旅游目的地可能有漂亮建筑:
好吃的美食:
漂亮的小姐姐:
悠闲的生活:
实际中的旅游
但现实中,大家如果到了语言不通的地方,大概率可能会遇到如下麻烦:
让人懵圈的地图:
梦幻菜单:
魔性的路标指示牌:
商场中琳琅满目的商品:
太难了
拍照翻译帮你忙
有了华为HMS ML Kit 文本识别和翻译服务,以上这些都不是问题,今天就来给大家介绍一下,怎么样使用华为HMS ML Kit提供的SDK来开发一个拍照翻译服务。简单来讲完成拍照翻译小应用的开发只需要两大步:
文本识别
先拍张照片获取图片,然后把获取的图像帧送到华为HMS ML Kit文本识别服务做文本识别。
华为文本识别服务同时提供离线SDK(端侧)和云侧两种方式,端侧免费可实时检测,云侧识别种类和精度更高。本次实战我们采用云侧提供的能力。
文本识别特性 | 规格(HMS 4.0 ) |
---|---|
端侧 | 支持中日韩 |
云侧多语种 | 中、英、法、西、泰语等19个语种 |
倾斜识别 | 30度倾斜情况下依然可以识别 |
弯曲文字支持 | 支持45度弯曲情况下依然可以成功识别 |
文字跟踪 | 端侧支持跟踪 |
以上规格仅供参考,具体以华为开发者联盟官网为准
翻译
将识别后的文字送到华为HMS MLKit 翻译服务做文本翻译,就可以获取到想要翻译后的结果了。
翻译是云侧提供的服务。
文本翻译特性 | 规格(HMS 4.0) |
---|---|
多语种 | 7个语种 中、英、法、西、土、阿、泰 |
时延 | 300ms/100字 |
BLEU值 | >30 |
动态术语配置 | 支持 |
以上规格仅供参考,具体以华为开发者联盟官网为准
拍照翻译APP开发实战
上面说了太多的废话,直接切入正题吧
1 开发准备
由于使用了云侧的服务,需要到华为的开发者联盟注册开发者账号,并且在云端开通这些服务,这里就不细讲了,直接按照官方的的AppGallery Connect配置、开通服务部分操作步骤进行即可:
1.1 在项目级gradle里添加华为maven仓
打开AndroidStudio项目级build.gradle文件。
增量添加如下maven地址:
buildscript {
repositories {
maven {url 'http://developer.huawei.com/repo/'}
} }allprojects {
repositories {
maven { url 'http://developer.huawei.com/repo/'}
}
}
1.2 在应用级的build.gradle里面加上SDK依赖
集成SDK。(由于使用云侧能力,只引入SDK基础包即可)
dependencies{
implementation 'com.huawei.hms:ml-computer-vision:1.0.2.300'
implementation 'com.huawei.hms:ml-computer-translate:1.0.2.300'
}
1.3 在AndroidManifest.xml文件里面申请相机和存储权限
要使应用程序能够在用户从华为应用市场安装您的应用程序后,自动将最新的机器学习模型更新到用户设备,请将以下语句添加到该应用程序的AndroidManifest.xml文件中:
<manifest
<application
<meta-data
android:name="com.huawei.hms.ml.DEPENDENCY"
android:value= "imgseg "/>
</application>
</manifest>
1.4 在AndroidManifest.xml文件里面申请相机和存储权限
<uses-permission android:name="android.permission.CAMERA" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-feature android:name="android.hardware.camera" /><uses-feature android:name="android.hardware.camera.autofocus" />
2 代码开发关键步骤
2.1 动态权限申请
private static final int CAMERA_PERMISSION_CODE = 1; @Override
public void onCreate(Bundle savedInstanceState) {
// Checking camera permission
if (!allPermissionsGranted()) {
getRuntimePermissions();
}}
2.2 创建云侧文本分析器。可以通过文本检测配置器“MLRemoteTextSetting”创建文本分析器
MLRemoteTextSetting setting = (new MLRemoteTextSetting.Factory()).
setTextDensityScene(MLRemoteTextSetting.OCR_LOOSE_SCENE).create();this.textAnalyzer = MLAnalyzerFactory.getInstance().getRemoteTextAnalyzer(setting);
2.3 通过android.graphics.Bitmap创建“MLFrame”对象用于分析器检测图片
MLFrame mlFrame = new MLFrame.Creator().setBitmap(this.originBitmap).create();
2.4 调用“asyncAnalyseFrame ”方法进行文本检测
Task<MLText> task = this.textAnalyzer.asyncAnalyseFrame(mlFrame);
task.addOnSuccessListener(new OnSuccessListener<MLText>() {
@Override public void onSuccess(MLText mlText) {
// Transacting logic for segment success.
if (mlText != null) {
RemoteTranslateActivity.this.remoteDetectSuccess(mlText);
} else {
RemoteTranslateActivity.this.displayFailure();
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override public void onFailure(Exception e) {
// Transacting logic for segment failure.
RemoteTranslateActivity.this.displayFailure();
return;
}
});
2.5 创建文本翻译器。可以通过文本翻译器自定义参数类“MLRemoteTranslateSetting”创建翻译器
MLRemoteTranslateSetting.Factory factory = new MLRemoteTranslateSetting
.Factory()
// Set the target language code. The ISO 639-1 standard is used.
.setTargetLangCode(this.dstLanguage);
if (!this.srcLanguage.equals("AUTO")) {
// Set the source language code. The ISO 639-1 standard is used.
factory.setSourceLangCode(this.srcLanguage);
}
this.translator = MLTranslatorFactory.getInstance().getRemoteTranslator(factory.create());
2.6 调用“asyncAnalyseFrame ”方法对文本识别获取的内容进行文本翻译
final Task<String> task = translator.asyncTranslate(this.sourceText);
task.addOnSuccessListener(new OnSuccessListener<String>() {
@Override public void onSuccess(String text) {
if (text != null) {
RemoteTranslateActivity.this.remoteDisplaySuccess(text);
} else {
RemoteTranslateActivity.this.displayFailure();
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override public void onFailure(Exception e) {
RemoteTranslateActivity.this.displayFailure();
}
});
2.7 翻译完成释放资源
if (this.textAnalyzer != null) {
try {
this.textAnalyzer.close();
} catch (IOException e) {
SmartLog.e(RemoteTranslateActivity.TAG, "Stop analyzer failed: " + e.getMessage());
}
}
if (this.translator != null) {
this.translator.stop();
}
3 源码
老规矩,简单的小Demo源码已上传Github,github源码地址请戳: https://github.com/HMS-MLKit/HUAWEI-HMS-MLKit-Sample(工程目录为:Photo-Translate),大家可以做参考做基于场景的优化。
4 Demo效果
结后语
本次给大家演示的小程序APP开发同时用到了华为HMS ML Kit的两种云侧能力,文字识别和翻译的能力,华为的文字识别和翻译还可以帮助开发者做很多其他有趣又强大的功能,比如:
【通用文本识别】
1、公交车牌文字识别
2、文档阅读场景下的文本识别
【卡证类文本识别】
1、通过文字识别可以识别银行卡的卡号,用于银行卡绑定等场景
2、当然除了识别银行卡,还可以识别生活中的各种卡证号,比如会员卡、优惠卡
3、此外还可以实现身份证、港澳通行证等证件类号码的识别
【翻译】
1、路标路牌翻译
2、文档翻译
3、网页翻译,比如识别网站评论区的语言类型并翻译成对应国家的语言;
4、海淘商品介绍翻译
5、餐厅点餐菜单翻译
更详细的开发指南参考华为开发者联盟官网
华为开发者联盟机器学习服务开发指南
往期链接:Android | 教你如何开发一个证件照DIY小程序
内容来源:[https://developer.huawei.com/consumer/cn/forum/topicview?tid=0201209905778120045&fid=18](https://developer.huawei.com/consumer/cn/forum/topicview?
tid=0201209905778120045&fid=18)
原作者:AI_talking
Android | 教你如何用代码开发一个拍照翻译小程序的更多相关文章
- Android | 教你如何用代码一键实现银行卡绑定
前言 小编前面几期文章分别给大家介绍了用代码实现微笑抓拍.证件照DIY.拍照翻译的功能开发(链接见文章末尾),本次小编给大家带来的是用代码一键实现银行卡识别与绑定功能. 银行卡识别的应用场景 ...
- Android | 教你如何用华为HMS MLKit 图像分割 SDK开发一个证件照DIY小程序
Android | 教你如何用华为HMS MLKit 图像分割 SDK开发一个证件照DIY小程序 引子 上期给大家介绍了如何使用如何用华为HMS MLKit SDK 三十分钟在安卓上开发一个微笑抓 ...
- 「1.0」一个人开发一个App,小程序从0到1,起航了
古有,秦.齐.楚.赵.魏.韩.燕七国争雄:今有,微信.QQ.百度.支付宝.钉钉.头条.抖音七台争霸.古有,白起.李牧.王翦.孙膑.庞涓.赵奢.廉颇驰骋疆场:今有程序员1,程序员2,程序员3…编写代码. ...
- 「2.0」一个人开发一个App,小程序从0到1,文件剖析
不知你是不是见到“文件剖析”这4个大字,才点进来看一看的?如果真是的话,那我可以坦诚.真心.负责任地告诉你:你上当了,你上了贼船啦,如果你现在想跳的话,还来得及,反正茫茫大海中,鲨鱼正缺搞程序的人.说 ...
- [3.0] 一个人开发一个App,小程序从0到1,删减添加
在这个黄道吉日,咱们将要干一件,惊天地泣鬼神,妇孺皆知的大事,那就是删掉微信开发工具自动生成的源代码. 删掉pages下的index.logs目录,啥都不留: 删掉utils下的util.js,只流空 ...
- 「4.0」一个人开发一个App,小程序从0到1,布局
一提到布局这个词,我总是索索发抖,不是因为天冷,而是因为布局的目标实在太宏大.古代想雄霸天下的王,就喜欢布局这个,布局那个,结果硬生生把自己的国家给布局没了.至于是哪个君王,我倒可以非常认真,非常坦诚 ...
- Android | 教你如何用华为HMS MLKit SDK 三十分钟在安卓上开发一个微笑抓拍神器
Android | 只要三十分钟就可以在手机上开发一个微笑抓拍神器!!! 前言 前段时间Richard Yu在发布会上给大家介绍了华为HMS Core4.0,回顾发布会信息请戳: 华为面向全球发布HM ...
- php怎么做网站?如何用PHP开发一个完整的网站?
1.PHPer应具备的知识 (1)PHP知识: 熟练掌握基础函数,PHP语句(条件.循环),数组(排序.读取),函数(内部 构造),运算(数学 逻辑),面向对象(继承 接口 封装 多态静态属性)等. ...
- 40多行python代码开发一个区块链。
40多行python代码开发一个区块链?可信吗?我们将通过Python 2动手开发实现一个迷你区块链来帮你真正理解区块链技术的核心原理.python开发区块链的源代码保存在Github. 尽管有人认为 ...
随机推荐
- java中的while循环和do while循环
那么在讲解循环之前呢我们先来了解一下什么是循环 生活中的例子 车子的轮胎他就是一直在循环 马拉松跑到也是在循环 因为运动员不停的一圈一圈在跑这也是一个循环 那么我们为什么要学习循环呢? 下面看一个 ...
- Java 并发系列之一
Java 并发系列之一 简单的总结了一些 Java 常用的集合之后,发现许多集合都针对多线程提供了支持,比如 ConcurrentHashMap 使用分段锁来提高多线程环境下的性能表现与安全表现.所以 ...
- NoVNC安装部署
noVNC 是一个 HTML5 VNC 客户端,采用 HTML 5 WebSockets, Canvas 和 JavaScript 实现,noVNC 被普遍用在各大云计算.虚拟机控制面板中,比如 Op ...
- 树莓派上搭建唤醒词检测引擎 Snowboy
Snowboy 是一款高度可定制的唤醒词检测引擎,可以用于实时嵌入式系统,并且始终监听(即使离线).当前,它可以运行在 Raspberry Pi.(Ubuntu)Linux 和 Mac OS X 系统 ...
- 波兰政府在继韩国之后也增加了对 Linux 的使用
导读 前段时间, 韩国政府起草了一项战略,准备采用基于 Linux 的开源操作系统全面取代 Windows 7,以摆脱对其的依赖. 目前,波兰的社会保险公司 ZUS( Zakład Ubezpiecz ...
- 将xml处理为json对象数组
function xmlStr2js(xmlStr) { var tagNames = xmlStr.match(/<\w+>/g) tagNames = deWeightTagNames ...
- 1.JVM中的五大内存区域划分详解及快速扫盲
本博客参考<深入理解Java虚拟机>这本书 视频及电子书详见:https://shimo.im/docs/HP6qqHx38xCJwcv9/ 一.快速扫盲 1. JVM是什么 JVM是 ...
- WPF转换器之值转换器
WPF有两转转换器,一种是值转换器,另一种多值转换器,在开发过程中经常会从数据拉一些数据过来,比如存储性别的时候往往会用0或1,但在界面上肯定是要显示男或女,那么这个时候就可以用上值转换器 编写转换器 ...
- Code Index: 基于Lucene.Net的代码检索工具
目录 用途 Github地址 示例 特性 用途 维护一个拥有巨大代码量的项目, 依靠自带的代码搜索工具搜索速度缓慢, 一个快速的代码检索工具就显得极为必要, 所以自己撸了个小工具. Github地址 ...
- C#winform如何主窗口最大化最小化默认大小
this.WindowState = FormWindowState.Minimized; bool b = true; private void button2_Click(object sende ...