天天看點

一文教你如何快速實作聲音識别

在一些應用項目開發的過程中,有時需要用到語音檢測的功能,即識别敲門聲、門鈴聲、汽車喇叭聲等功能,對于中小開發者來說,單獨開發建構該能力,不免耗時耗力,而華為機器學習服務中的聲音識别服務SDK,隻需簡單內建,端側就能實作這個功能。

一、 華為聲音識别服務簡介:

聲音識别服務支援通過線上(實時錄音)的模式檢測聲音事件,基于檢測到的聲音事件能夠幫助開發者進行後續指令動作。目前支援13個種類的聲音事件,包括:笑聲、嬰兒或小孩哭聲、打鼾聲、噴嚏聲、叫喊聲、貓叫聲、狗叫聲、流水聲(包括水龍頭流水聲、溪流聲、海浪聲)、汽車喇叭聲、門鈴聲、敲門聲、火災報警聲(包括火災報警器警報聲、煙霧報警器警報聲)、警報聲(包括消防車警報聲、救護車警報聲、警車警報聲、防空警報聲)。

二、內建準備:

開發環境配置

1、需要在華為開發者聯盟上建立應用:

一文教你如何快速實作聲音識别

此步驟具體可以詳見下方的連結:

https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-get-started#createproject?ha__source=hms1

2、打開機器學習服務:

一文教你如何快速實作聲音識别

具體開啟步驟可以檢視下方的連結:

https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides-V5/enable-service-0000001050038078-V5?ha__source=hms1

2、建立完應用之後,會自動生成agconnect-services.json檔案, 需要手動将agconnect-services.json檔案拷貝到應用級根目錄下

一文教你如何快速實作聲音識别
一文教你如何快速實作聲音識别

3、配置HMS Core SDK的Maven倉位址。

關于Maven倉的配置可以檢視下方的連結:

https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/config-maven-0000001050040031?ha__source=hms1

4、內建聲音識别服務SDK

1. 推薦使用Full SDK方式內建,在build.gradle檔案中配置相應的sdk

// 引入聲音識别集合包
implementation 'com.huawei.hms:ml-speech-semantics-sounddect-sdk:2.1.0.300'
implementation 'com.huawei.hms:ml-speech-semantics-sounddect-model:2.1.0.300'      

2. 根據實際情況聲明AGC插件配置,有兩種方式

apply plugin: 'com.android.application'
apply plugin: 'com.huawei.agconnect'
或
plugins {    id 'com.android.application'    
id 'com.huawei.agconnect'
}      

3. 自動更新機器學習模型

添加如下語句到AndroidManifest.xml檔案中,使用者從華為應用市場安裝您的應用後,将自動更新機器學習模型到裝置:

<meta-data    
android:name="com.huawei.hms.ml.DEPENDENCY"  
android:value= "sounddect"/>      

4. 更詳細的步驟可以通過下方的連結檢視:

https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/sound-detection-sdk-0000001055602754?ha__source=hms1

三、應用開發編碼階段

1.取得 麥克風 權限, 如果沒有麥克風的權限 會報12203的錯誤

設定靜态權限(必須)

<
uses-permission 
android
:name
="android.permission.RECORD_AUDIO" 
/>      

動态權限擷取(必須)

ActivityCompat.requestPermissions(

        this, new String[]{Manifest.permission.RECORD_AUDIO

 }, 1);

2.建立MLSoundDector對象

private static final String TAG = "MLSoundDectorDemo";

//語音識别的對象

private MLSoundDector mlSoundDector;

//建立MLSoundDector對象 并 設定回調方法

private void initMLSoundDector(){

    mlSoundDector = MLSoundDector.createSoundDector();

    mlSoundDector.setSoundDectListener(listener);

}

3. 聲音識别結果回調,用于擷取檢測結果,并将回調傳入聲音識别執行個體。

//建立聲音識别結果回調,用于擷取檢測結果,并将回調傳入聲音識别執行個體。

private MLSoundDectListener listener = new MLSoundDectListener() {

    @Override

    public void onSoundSuccessResult(Bundle result) {

        //識别成功的處理邏輯,識别結果為:0-12(對應MLSoundDectConstants.java中定義的以SOUND_EVENT_TYPE開頭命名的13種聲音類型)。

        int soundType = result.getInt(MLSoundDector.RESULTS_RECOGNIZED);

        Log.d(TAG,"聲音識别成功:"+soundType);

    }

    public void onSoundFailResult(int errCode) {

        //識别失敗,可能沒有授予麥克風權限(Manifest.permission.RECORD_AUDIO)等異常情況。

        Log.d(TAG,"聲音識别失敗:"+errCode);

};

此代碼中隻是将聲音識别結果的int類型列印了出來,實際編碼中,可以将int類型的聲音識别結果 轉換為 可被使用者識别的類型。

聲音識别類型的定義:

一文教你如何快速實作聲音識别

<string-array name="sound_dect_voice_type">

    <item>笑聲</item>

    <item>嬰兒或小孩哭聲</item>

    <item>打鼾聲</item>

    <item>噴嚏聲</item>

    <item>叫喊聲</item>

    <item>貓叫聲</item>

    <item>狗叫聲</item>

    <item>流水聲</item>

    <item>汽車喇叭聲</item>

    <item>門鈴聲</item>

    <item>敲門聲</item>

    <item>火災報警聲</item>

    <item>警報聲</item>

</string-array>

3. 開啟和關閉語音識别

@Override

public void onClick(View v) {

    switch (v.getId()){

        case R.id.btn_start_detect:

            if (mlSoundDector != null){

                boolean isStarted = mlSoundDector.start(this); //context 是上下文

                //isStared 等于true表示啟動識别成功、isStared等于false表示啟動識别失敗(原因可能是手機麥克風被系統或其它三方應用占用)

                if (isStarted){

                    Toast.makeText(this,"語音識别開啟成功", Toast.LENGTH_SHORT).show();

                }

            }

            break;

        case R.id.btn_stop_detect:

                mlSoundDector.stop();

4.當頁面關閉的時候,可以調用destroy()方法釋放資源

protected void onDestroy() {

    super.onDestroy();

    if (mlSoundDector != null){

        mlSoundDector.destroy();

四、運作測試

1. 以敲門聲為例,預計聲音識别類型的輸出結果為10

2. 點選開啟語音識别按鈕、模拟敲門聲 ,在AS控制台中可以得到如下日志, 說明內建成功。

一文教你如何快速實作聲音識别

五、其他

1. 聲音識别服務屬于華為機器學習服務中的一個很小的子產品,華為機器學習服務包括6大子產品,分别為:文本類、語音語言類、圖像類、人臉人體類、自然語言處理類,自定義模型 。

2. 這篇記錄文檔隻是介紹了“語音語言類”這個子產品中的“聲音識别服務”

3. 如果有讀者對華為機器學習服務其他子產品感興趣的話,可以檢視華為提供的相關內建文檔,位址如下:

https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides-V5/service-introduction-0000001050040017-V5?ha__source=hms1

>>華為開發者聯盟官網