威服私访 發表於 2020-4-8 11:23:00

Android | 教你如何开发一个拍照翻译小程序

<h1 id="引子">引子</h1>
<p>  想必有很多小伙伴喜欢外出旅游,能去海外玩一圈那是更好不过了,旅游前大家一定会对吃、穿、住、行、游玩路线做各种攻略,然后满怀期待的出发…</p>
<h2 id="想象中的旅游">想象中的旅游</h2>
<p>  出发前,想象中的旅游目的地可能有漂亮建筑:<br>
<img src="https://img-blog.csdnimg.cn/20200408095035552.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDcwODI0MA==,size_16,color_FFFFFF,t_70#pic_center"></p>
<p>  好吃的美食:<br>
<img src="https://img-blog.csdnimg.cn/20200408095206573.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDcwODI0MA==,size_16,color_FFFFFF,t_70#pic_center"><br>
  漂亮的小姐姐:<br>
<img src="https://img-blog.csdnimg.cn/20200408095308226.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDcwODI0MA==,size_16,color_FFFFFF,t_70#pic_center"><br>
  悠闲的生活:<br>
<img src="https://img-blog.csdnimg.cn/20200408095405449.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDcwODI0MA==,size_16,color_FFFFFF,t_70#pic_center"></p>
<h2 id="实际中的旅游">实际中的旅游</h2>
<p>  但现实中,大家如果到了语言不通的地方,大概率可能会遇到如下麻烦:</p>
<p>  让人懵圈的地图:<br>
<img src="https://img-blog.csdnimg.cn/20200408095720309.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDcwODI0MA==,size_16,color_FFFFFF,t_70#pic_center"></p>
<p>  梦幻菜单:<br>
<img src="https://img-blog.csdnimg.cn/20200408095800995.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDcwODI0MA==,size_16,color_FFFFFF,t_70#pic_center"><br>
  魔性的路标指示牌:<br>
<img src="https://img-blog.csdnimg.cn/2020040809592574.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDcwODI0MA==,size_16,color_FFFFFF,t_70#pic_center"><br>
<img src="https://img-blog.csdnimg.cn/20200408095955386.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDcwODI0MA==,size_16,color_FFFFFF,t_70#pic_center"><br>
  商场中琳琅满目的商品:<br>
<img src="https://img-blog.csdnimg.cn/20200408100038756.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDcwODI0MA==,size_16,color_FFFFFF,t_70#pic_center"><br>
<img src="https://img-blog.csdnimg.cn/20200408100105146.png#pic_center"><br>
  <strong>太难了</strong><br>
<img src="https://img-blog.csdnimg.cn/20200408100230930.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDcwODI0MA==,size_16,color_FFFFFF,t_70#pic_center"></p>
<h2 id="拍照翻译帮你忙">拍照翻译帮你忙</h2>
<p>  有了华为HMS ML Kit 文本识别和翻译服务,以上这些都不是问题,今天就来给大家介绍一下,怎么样使用华为HMS ML Kit提供的SDK来开发一个拍照翻译服务。简单来讲完成拍照翻译小应用的开发只需要两大步:</p>
<h3 id="文本识别">文本识别</h3>
<p>  先拍张照片获取图片,然后把获取的图像帧送到华为HMS ML Kit文本识别服务做文本识别。<br>
  华为文本识别服务同时提供离线SDK(端侧)和云侧两种方式,端侧免费可实时检测,云侧识别种类和精度更高。本次实战我们采用云侧提供的能力。</p>
<table>
<thead>
<tr>
<th>文本识别特性</th>
<th>规格(HMS 4.0 )</th>
</tr>
</thead>
<tbody>
<tr>
<td>端侧</td>
<td>支持中日韩</td>
</tr>
<tr>
<td>云侧多语种</td>
<td>中、英、法、西、泰语等19个语种</td>
</tr>
<tr>
<td>倾斜识别</td>
<td>30度倾斜情况下依然可以识别</td>
</tr>
<tr>
<td>弯曲文字支持</td>
<td>支持45度弯曲情况下依然可以成功识别</td>
</tr>
<tr>
<td>文字跟踪</td>
<td>端侧支持跟踪</td>
</tr>
</tbody>
</table>
<p>  以上规格仅供参考,具体以华为开发者联盟官网为准</p>
<h3 id="翻译">翻译</h3>
<p>  将识别后的文字送到华为HMS MLKit 翻译服务做文本翻译,就可以获取到想要翻译后的结果了。<br>
  翻译是云侧提供的服务。</p>
<table>
<thead>
<tr>
<th>文本翻译特性</th>
<th>规格(HMS 4.0)</th>
</tr>
</thead>
<tbody>
<tr>
<td>多语种</td>
<td>7个语种 中、英、法、西、土、阿、泰</td>
</tr>
<tr>
<td>时延</td>
<td>300ms/100字</td>
</tr>
<tr>
<td>BLEU值</td>
<td>&gt;30</td>
</tr>
<tr>
<td>动态术语配置</td>
<td>支持</td>
</tr>
<tr>
<td>  以上规格仅供参考,具体以华为开发者联盟官网为准</td>
<td></td>
</tr>
</tbody>
</table>
<hr>
<h1 id="拍照翻译app开发实战">拍照翻译APP开发实战</h1>
<p>  上面说了太多的废话,直接切入正题吧</p>
<h2 id="1-开发准备">1 开发准备</h2>
<p>  由于使用了云侧的服务,需要到华为的开发者联盟注册开发者账号,并且在云端开通这些服务,这里就不细讲了,直接按照官方的的AppGallery Connect配置、开通服务部分操作步骤进行即可:</p>
<p>  注册开发者,开通服务参考请戳:</p>
<h3 id="11-在项目级gradle里添加华为maven仓">1.1 在项目级gradle里添加华为maven仓</h3>
<p>  打开AndroidStudio项目级build.gradle文件。<br>
<img src="https://img-blog.csdnimg.cn/20200408102247492.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDcwODI0MA==,size_16,color_FFFFFF,t_70#pic_center"><br>
  增量添加如下maven地址:</p>
<pre><code class="language-java">buildscript {
    repositories {      
      maven {url 'http://developer.huawei.com/repo/'}
    }    }allprojects {
    repositories {      
      maven { url 'http://developer.huawei.com/repo/'}
    }
   }
</code></pre>
<h3 id="12-在应用级的buildgradle里面加上sdk依赖">1.2 在应用级的build.gradle里面加上SDK依赖</h3>
<p><img src="https://img-blog.csdnimg.cn/20200408102345528.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDcwODI0MA==,size_16,color_FFFFFF,t_70#pic_center"><br>
  集成SDK。(由于使用云侧能力,只引入SDK基础包即可)</p>
<pre><code class="language-java">dependencies{
    implementation 'com.huawei.hms:ml-computer-vision:1.0.2.300'
    implementation 'com.huawei.hms:ml-computer-translate:1.0.2.300'
    }
</code></pre>
<h3 id="13-在androidmanifestxml文件里面申请相机和存储权限">1.3 在AndroidManifest.xml文件里面申请相机和存储权限</h3>
<p>  要使应用程序能够在用户从华为应用市场安装您的应用程序后,自动将最新的机器学习模型更新到用户设备,请将以下语句添加到该应用程序的AndroidManifest.xml文件中:</p>
<pre><code class="language-java">&lt;manifest   
   &lt;application
       &lt;meta-data                     
         android:name="com.huawei.hms.ml.DEPENDENCY"         
         android:value= "imgseg "/&gt;                      
   &lt;/application&gt;
&lt;/manifest&gt;
</code></pre>
<h3 id="14-在androidmanifestxml文件里面申请相机和存储权限">1.4 在AndroidManifest.xml文件里面申请相机和存储权限</h3>
<pre><code class="language-java">&lt;uses-permission android:name="android.permission.CAMERA" /&gt;&lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /&gt;&lt;uses-feature android:name="android.hardware.camera" /&gt;&lt;uses-feature android:name="android.hardware.camera.autofocus" /&gt;
</code></pre>
<hr>
<h2 id="2-代码开发关键步骤">2 代码开发关键步骤</h2>
<h3 id="21-动态权限申请">2.1 动态权限申请</h3>
<pre><code class="language-java">private static final int CAMERA_PERMISSION_CODE = 1; @Override
public void onCreate(Bundle savedInstanceState) {
    // Checking camera permission   
   if (!allPermissionsGranted()) {
       getRuntimePermissions();
   }}
</code></pre>
<h3 id="22-创建云侧文本分析器可以通过文本检测配置器mlremotetextsetting创建文本分析器">2.2 创建云侧文本分析器。可以通过文本检测配置器“MLRemoteTextSetting”创建文本分析器</h3>
<pre><code class="language-java">MLRemoteTextSetting setting = (new MLRemoteTextSetting.Factory()).
         setTextDensityScene(MLRemoteTextSetting.OCR_LOOSE_SCENE).create();this.textAnalyzer = MLAnalyzerFactory.getInstance().getRemoteTextAnalyzer(setting);
</code></pre>
<h3 id="23-通过androidgraphicsbitmap创建mlframe对象用于分析器检测图片">2.3 通过android.graphics.Bitmap创建“MLFrame”对象用于分析器检测图片</h3>
<pre><code class="language-java">MLFrame mlFrame = new MLFrame.Creator().setBitmap(this.originBitmap).create();
</code></pre>
<h3 id="24--调用asyncanalyseframe-方法进行文本检测">2.4调用“asyncAnalyseFrame ”方法进行文本检测</h3>
<pre><code class="language-java">Task&lt;MLText&gt; task = this.textAnalyzer.asyncAnalyseFrame(mlFrame);
            task.addOnSuccessListener(new OnSuccessListener&lt;MLText&gt;() {
                @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;
                }
            });
</code></pre>
<h3 id="25-创建文本翻译器可以通过文本翻译器自定义参数类mlremotetranslatesetting创建翻译器">2.5 创建文本翻译器。可以通过文本翻译器自定义参数类“MLRemoteTranslateSetting”创建翻译器</h3>
<pre><code class="language-java">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());
</code></pre>
<h3 id="26-调用asyncanalyseframe-方法对文本识别获取的内容进行文本翻译">2.6 调用“asyncAnalyseFrame ”方法对文本识别获取的内容进行文本翻译</h3>
<pre><code class="language-java">final Task&lt;String&gt; task = translator.asyncTranslate(this.sourceText);
      task.addOnSuccessListener(new OnSuccessListener&lt;String&gt;() {
            @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();
            }
      });
</code></pre>
<h3 id="27-翻译完成释放资源">2.7 翻译完成释放资源</h3>
<pre><code class="language-java">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();
      }
</code></pre>
<h2 id="3-源码">3 源码</h2>
<p>  老规矩,简单的小Demo源码已上传Github,github源码地址请戳: https://github.com/HMS-MLKit/HUAWEI-HMS-MLKit-Sample(工程目录为:Photo-Translate),大家可以做参考做基于场景的优化。</p>
<h2 id="4-demo效果">4 Demo效果</h2>
<p><img src="https://img-blog.csdnimg.cn/20200408103732273.gif#pic_center"></p>
<hr>
<h2 id="结后语">结后语</h2>
<p>  本次给大家演示的小程序APP开发同时用到了华为HMS ML Kit的两种云侧能力,文字识别和翻译的能力,华为的文字识别和翻译还可以帮助开发者做很多其他有趣又强大的功能,比如:<br>
【通用文本识别】<br>
1、公交车牌文字识别<br>
2、文档阅读场景下的文本识别<br>
【卡证类文本识别】<br>
1、通过文字识别可以识别银行卡的卡号,用于银行卡绑定等场景<br>
2、当然除了识别银行卡,还可以识别生活中的各种卡证号,比如会员卡、优惠卡<br>
3、此外还可以实现身份证、港澳通行证等证件类号码的识别<br>
【翻译】<br>
1、路标路牌翻译<br>
2、文档翻译<br>
3、网页翻译,比如识别网站评论区的语言类型并翻译成对应国家的语言;<br>
4、海淘商品介绍翻译<br>
5、餐厅点餐菜单翻译</p>
<p><strong>更详细的开发指南参考华为开发者联盟官网</strong><br>
华为开发者联盟机器学习服务开发指南</p>
<hr>
<p>往期链接:Android | 教你如何开发一个证件照DIY小程序</p>
<p>内容来源:(https://developer.huawei.com/consumer/cn/forum/topicview?<br>
tid=0201209905778120045&amp;fid=18)<br>
原作者:AI_talking</p><br><br>
来源:https://www.cnblogs.com/developer-huawei/p/12658789.html
頁: [1]
查看完整版本: Android | 教你如何开发一个拍照翻译小程序