一文教你如何快速實現聲音識別

華為開發者論壇發表於2021-08-12

在一些應用專案開發的過程中,有時需要用到語音檢測的功能,即識別敲門聲、門鈴聲、汽車喇叭聲等功能,對於中小開發者來說,單獨開發構建該能力,不免耗時耗力,而華為機器學習服務中的聲音識別服務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 SDKMaven倉地址。

關於 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 );
    }
    
@Override
    
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 :
            
if  ( mlSoundDector  !=  null ){
                
mlSoundDector .stop();
            }
            
break ;
    }
}

 

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

@Override
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


>> 華為開發者聯盟官網

>> 獲取開發指導文件
>> 參與開發者討論請到 CSDN社群 或者 Reddit 社群
>> 下載 demo 和示例程式碼請到 Github 或者 Gitee
>> 解決整合問題請到 Stack Overflow


原文連結: https://developer.huawei.com/consumer/cn/forum/topic/0202580471954390028?fid=18

原作者:胡椒

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

相關文章