如何實(shí)現(xiàn)聽(tīng)寫(xiě)單詞播報(bào)芽突?超簡(jiǎn)單集成ML kit就能做到!

背景


相信我們大家在剛開(kāi)始學(xué)習(xí)一門(mén)語(yǔ)言的時(shí)候都有過(guò)聽(tīng)寫(xiě)费就,現(xiàn)在的小學(xué)生學(xué)語(yǔ)文的時(shí)候一項(xiàng)重要的課后作業(yè)就是聽(tīng)寫(xiě)課文中的生詞,很多家長(zhǎng)們都有這方面的經(jīng)歷川队。不過(guò)一方面這種讀單詞的動(dòng)作相對(duì)簡(jiǎn)單力细,另一方面家長(zhǎng)的時(shí)間也很寶貴,現(xiàn)在市場(chǎng)上出現(xiàn)了很多xx課后聽(tīng)寫(xiě)的語(yǔ)音固额,這些播講人將語(yǔ)文教材上的課后聽(tīng)寫(xiě)單詞錄好眠蚂,給家長(zhǎng)下載使用,不過(guò)這種錄音不夠靈活斗躏,如果老師今天額外留了幾道不是課后習(xí)題中的單詞逝慧,這部分的錄音就不能滿足家長(zhǎng)和孩子們的需要。本文就介紹了一個(gè)使用我們ML kit 的通用文本識(shí)別功能和語(yǔ)音合成功能共同實(shí)現(xiàn)自動(dòng)語(yǔ)音播報(bào)APP啄糙,只需要對(duì)聽(tīng)寫(xiě)的單詞或者課文拍照笛臣,然后就能自動(dòng)播報(bào)照片中的文字,播報(bào)的音色隧饼、音調(diào)都可以調(diào)整沈堡。


開(kāi)發(fā)前準(zhǔn)備

打開(kāi)AndroidStudio項(xiàng)目級(jí)build.gradle文件


在allprojects ->repositories里面配置HMS SDK的maven倉(cāng)地址

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

在buildscript->repositories里面配置HMS SDK的maven倉(cāng)地址

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

在buildscript->repositories里面配置HMS SDK的maven倉(cāng)地址

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

在buildscript->dependencies中,配置AGC插件

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

添加編譯依賴
打開(kāi)應(yīng)用級(jí)的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'
}

應(yīng)用ACG插件燕雁,添加在文件頭即可

apply plugin: 'com.huawei.agconnect'

指定權(quán)限和特性:在AndroidManifest.xml中進(jìn)行聲明

private static final int PERMISSION_REQUESTS = 1;
@Override 
public void onCreate(Bundle savedInstanceState) { 
    // Checking camera permission   
   if (!allPermissionsGranted()) {
       getRuntimePermissions();
   }
}

作業(yè)朗讀代碼關(guān)鍵步驟

主要有兩個(gè)功能诞丽,一個(gè)是識(shí)別作業(yè)文本鲸拥,一個(gè)是朗讀作業(yè),通過(guò)OCR+TTS實(shí)現(xiàn)作業(yè)朗讀僧免,拍照后點(diǎn)擊播放即可朗讀刑赶。

1.動(dòng)態(tài)權(quán)限申請(qǐng)

private static final int PERMISSION_REQUESTS = 1;
@Override 
public void onCreate(Bundle savedInstanceState) { 
    // Checking camera permission   
   if (!allPermissionsGranted()) {
       getRuntimePermissions();
   }
}

2.啟動(dòng)朗讀界面

public void takePhoto(View view) {
        Intent intent = new Intent(MainActivity.this, ReadPhotoActivity.class);
        startActivity(intent);
}

3.在onCreate()法中調(diào)用createLocalTextAnalyzer()創(chuàng)建端側(cè)文本識(shí)別器

private void createLocalTextAnalyzer() {
        MLLocalTextSetting setting = new MLLocalTextSetting.Factory()
                .setOCRMode(MLLocalTextSetting.OCR_DETECT_MODE)
                .setLanguage("zh")
                .create();
        this.textAnalyzer = MLAnalyzerFactory.getInstance().getLocalTextAnalyzer(setting);

}

4.在onCreate()法中調(diào)用createTtsEngine ()創(chuàng)建語(yǔ)音合成引擎,并構(gòu)建語(yǔ)音合成回調(diào)懂衩,用于處理語(yǔ)音合成結(jié)果撞叨,將語(yǔ)音合成回調(diào)傳入新建的語(yǔ)音合成引擎中

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);
}

5.設(shè)置讀取照片、拍照和朗讀按鈕

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);
            }
        });

6.在拍照和讀取照片的回調(diào)當(dāng)中啟動(dòng)文本識(shí)別

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;
        }
}

7.識(shí)別成功后勃痴,點(diǎn)擊播放按鈕即可開(kāi)始播放

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效果

如果你對(duì)實(shí)現(xiàn)方式感興趣谒所,可以在Github上下載源碼:https://github.com/HMS-Core/hms-ml-demo/tree/master/Homework-Reader

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市沛申,隨后出現(xiàn)的幾起案子劣领,更是在濱河造成了極大的恐慌,老刑警劉巖铁材,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尖淘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡著觉,警方通過(guò)查閱死者的電腦和手機(jī)村生,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)饼丘,“玉大人趁桃,你說(shuō)我怎么就攤上這事∫薷耄” “怎么了卫病?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)典徘。 經(jīng)常有香客問(wèn)我蟀苛,道長(zhǎng),這世上最難降的妖魔是什么逮诲? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任帜平,我火速辦了婚禮,結(jié)果婚禮上梅鹦,老公的妹妹穿的比我還像新娘裆甩。我一直安慰自己,他們只是感情好齐唆,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布淑掌。 她就那樣靜靜地躺著,像睡著了一般蝶念。 火紅的嫁衣襯著肌膚如雪抛腕。 梳的紋絲不亂的頭發(fā)上芋绸,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音担敌,去河邊找鬼摔敛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛全封,可吹牛的內(nèi)容都是我干的马昙。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼刹悴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼行楞!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起土匀,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤子房,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后就轧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體证杭,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年妒御,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了解愤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乎莉,死狀恐怖送讲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惋啃,我是刑警寧澤哼鬓,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站肥橙,受9級(jí)特大地震影響魄宏,放射性物質(zhì)發(fā)生泄漏秸侣。R本人自食惡果不足惜存筏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望味榛。 院中可真熱鬧椭坚,春花似錦、人聲如沸搏色。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)频轿。三九已至垂涯,卻和暖如春烁焙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背耕赘。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工骄蝇, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人操骡。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓九火,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親册招。 傳聞我的和親對(duì)象是個(gè)殘疾皇子岔激,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348