超簡單整合ML kit 實現聽寫單詞播報

華為開發者論壇發表於2020-06-30

背景

  相信我們大家在剛開始學習一門語言的時候都有過聽寫,現在的小學生學語文的時候一項重要的課後作業就是聽寫課文中的生詞,很多家長們都有這方面的經歷。不過一方面這種讀單詞的動作相對簡單,另一方面家長的時間也很寶貴,現在市場上出現了很多xx課後聽寫的語音,這些播講人將語文教材上的課後聽寫單詞錄好,給家長下載使用,不過這種錄音不夠靈活,如果老師今天額外留了幾道不是課後習題中的單詞,這部分的錄音就不能滿足家長和孩子們的需要。本文就介紹了一個使用我們ML kit 的通用文字識別功能和語音合成功能共同實現自動語音播報APP,只需要對聽寫的單詞或者課文拍照,然後就能自動播報照片中的文字,播報的音色、音調都可以調整。

在這裡插入圖片描述


開發前準備

開啟AndroidStudio專案級build.gradle檔案

在這裡插入圖片描述
  在allprojects ->repositories裡面配置HMS SDK的maven倉地址

allprojects { 
    repositories { 
        google() 
        jcenter() 
        maven {url 'http://developer.huawei.com/repo/'} 
    } 
 }

  在buildscript->repositories裡面配置HMS SDK的maven倉地址

buildscript { 
    repositories { 
        google() 
        jcenter() 
        maven {url 'http://developer.huawei.com/repo/'} 
    } 
 }

  在buildscript->repositories裡面配置HMS SDK的maven倉地址

buildscript { 
    repositories { 
        google() 
        jcenter() 
        maven {url 'http://developer.huawei.com/repo/'} 
    } 
 }

  在buildscript->dependencies中,配置AGC外掛

dependencies {
    classpath 'com.huawei.agconnect:agcp:1.2.1.301'
}

新增編譯依賴

  開啟應用級的build.gradle檔案

在這裡插入圖片描述

  整合SDK

dependencies{  
    implementation 'com.huawei.hms:ml-computer-voice-tts:1.0.4.300'
    implementation 'com.huawei.hms:ml-computer-vision-ocr:1.0.4.300'
    implementation 'com.huawei.hms:ml-computer-vision-ocr-cn-model:1.0.4.300'
}

  應用ACG外掛,新增在檔案頭即可

apply plugin: 'com.huawei.agconnect'

  指定許可權和特性:在AndroidManifest.xml中進行宣告

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

  作業朗讀程式碼關鍵步驟

  主要有兩個功能,一個是識別作業文字,一個是朗讀作業,通過OCR+TTS實現作業朗讀,拍照後點選播放即可朗讀。

  1. 動態許可權申請
private static final int PERMISSION_REQUESTS = 1;
@Override 
public void onCreate(Bundle savedInstanceState) { 
    // Checking camera permission   
   if (!allPermissionsGranted()) {
       getRuntimePermissions();
   }
}
  1. 啟動朗讀介面
public void takePhoto(View view) {
        Intent intent = new Intent(MainActivity.this, ReadPhotoActivity.class);
        startActivity(intent);
}
  1. 在onCreate()法中呼叫createLocalTextAnalyzer()建立端側文字識別器
private void createLocalTextAnalyzer() {
        MLLocalTextSetting setting = new MLLocalTextSetting.Factory()
                .setOCRMode(MLLocalTextSetting.OCR_DETECT_MODE)
                .setLanguage("zh")
                .create();
        this.textAnalyzer = MLAnalyzerFactory.getInstance().getLocalTextAnalyzer(setting);
 
}
  1. 在onCreate()法中呼叫createTtsEngine ()建立語音合成引擎,並構建語音合成回撥,用於處理語音合成結果,將語音合成回撥傳入新建的語音合成引擎中
private void createTtsEngine() {
        MLTtsConfig mlConfigs = new MLTtsConfig()
                .setLanguage(MLTtsConstants.TTS_ZH_HANS)
                .setPerson(MLTtsConstants.TTS_SPEAKER_FEMALE_ZH)
                .setSpeed(0.2f)
                .setVolume(1.0f);
        this.mlTtsEngine = new MLTtsEngine(mlConfigs);
        MLTtsCallback callback = new MLTtsCallback() {
            @Override
            public void onError(String taskId, MLTtsError err) {
            }
 
            @Override
            public void onWarn(String taskId, MLTtsWarn warn) {
            }
 
            @Override
            public void onRangeStart(String taskId, int start, int end) {
            }
 
            @Override
            public void onEvent(String taskId, int eventName, Bundle bundle) {
                if (eventName == MLTtsConstants.EVENT_PLAY_STOP) {
                    if (!bundle.getBoolean(MLTtsConstants.EVENT_PLAY_STOP_INTERRUPTED)) {
                        Toast.makeText(ReadPhotoActivity.this.getApplicationContext(), R.string.read_finish, Toast.LENGTH_SHORT).show();
                    }
                }
            }
        };
        mlTtsEngine.setTtsCallback(callback);
}
  1. 設定讀取照片、拍照和朗讀按鈕
this.relativeLayoutLoadPhoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
ReadPhotoActivity.this.selectLocalImage(ReadPhotoActivity.this.REQUEST_CHOOSE_ORIGINPIC);
            }
        });
this.relativeLayoutTakePhoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
ReadPhotoActivity.this.takePhoto(ReadPhotoActivity.this.REQUEST_TAKE_PHOTO);
            }
        });
  1. 在拍照和讀取照片的回撥當中啟動文字識別startTextAnalyzer()
private void startTextAnalyzer() {
        if (this.isChosen(this.originBitmap)) {
            MLFrame mlFrame = new MLFrame.Creator().setBitmap(this.originBitmap).create();
            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) {
                        ReadPhotoActivity.this.remoteDetectSuccess(mlText);
                    } else {
                        ReadPhotoActivity.this.displayFailure();
                    }
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(Exception e) {
                    // Transacting logic for segment failure.
                    ReadPhotoActivity.this.displayFailure();
                    return;
                }
            });
        } else {
            Toast.makeText(this.getApplicationContext(), R.string.please_select_picture, Toast.LENGTH_SHORT).show();
            return;
        }
}
  1. 識別成功後,點選播放按鈕即可開始播放
this.relativeLayoutRead.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (ReadPhotoActivity.this.sourceText == null) {
                    Toast.makeText(ReadPhotoActivity.this.getApplicationContext(), R.string.please_select_picture, Toast.LENGTH_SHORT).show();
                } else {
                    ReadPhotoActivity.this.mlTtsEngine.speak(sourceText, MLTtsEngine.QUEUE_APPEND);
                    Toast.makeText(ReadPhotoActivity.this.getApplicationContext(), R.string.read_start, Toast.LENGTH_SHORT).show();
                }
            }
        });

Demo效果

在這裡插入圖片描述


往期連結:超簡單整合HMS Scan Kit掃碼SDK,輕鬆實現掃碼購
原文連結:https://developer.huawei.com/consumer/cn/forum/topicview?tid=0201283755975150303&fid=18
原作者:littlewhite

相關文章