Android | 教你如何開發一個拍照翻譯小程式

cnnbull發表於2021-09-09

引子

  想必有很多小夥伴喜歡外出旅遊,能去海外玩一圈那是更好不過了,旅遊前大家一定會對吃、穿、住、行、遊玩路線做各種攻略,然後滿懷期待的出發…

想象中的旅遊

  出發前,想象中的旅遊目的地可能有漂亮建築:
圖片描述

  好吃的美食:
圖片描述
  漂亮的小姐姐:
圖片描述
  悠閒的生活:
圖片描述

實際中的旅遊

  但現實中,大家如果到了語言不通的地方,大機率可能會遇到如下麻煩:

  讓人懵圈的地圖:
圖片描述

  夢幻選單:
圖片描述
  魔性的路標指示牌:
圖片描述
圖片描述
  商場中琳琅滿目的商品:
圖片描述
圖片描述
  太難了
圖片描述

拍照翻譯幫你忙

  有了華為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原始碼地址請戳: (工程目錄為:Photo-Translate),大家可以做參考做基於場景的最佳化。

4 Demo效果

圖片描述


結後語

  本次給大家演示的小程式APP開發同時用到了華為HMS ML Kit的兩種雲側能力,文字識別和翻譯的能力,華為的文字識別和翻譯還可以幫助開發者做很多其他有趣又強大的功能,比如:
【通用文字識別】
1、公交車牌文字識別
2、文件閱讀場景下的文字識別
【卡證類文字識別】
1、透過文字識別可以識別銀行卡的卡號,用於銀行卡繫結等場景
2、當然除了識別銀行卡,還可以識別生活中的各種卡證號,比如會員卡、優惠卡
3、此外還可以實現身份證、港澳通行證等證件類號碼的識別
【翻譯】
1、路標路牌翻譯
2、文件翻譯
3、網頁翻譯,比如識別網站評論區的語言型別並翻譯成對應國家的語言;
4、海淘商品介紹翻譯
5、餐廳點餐選單翻譯

更詳細的開發指南參考華為開發者聯盟官網


往期連結:

原作者:AI_talking

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2524/viewspace-2825392/,如需轉載,請註明出處,否則將追究法律責任。

相關文章