【安卓離線語音識別】莫愁前路無網絡,離線語音正待君——Kaldi篇

基於Kaldi開發安卓離線語音識別項目(一) 在安卓項目中集成lib-share-asr組件
作者:詩酒赴韶華
奉言:暇騰點躍千帆,醉臥江海萬瀾。
轉載請註明出處:https://blog.csdn.net/dj2017/article/details/105657295
【持續更編中】

一、前言

       ~~~~~~~近期在開發智能家居領域產品——帶屏智能音箱,其中語音場景要求在、離線語音識別支持。由於,大廠收費頗高。對於,窮苦大衆的小生,擼起袖子,就在Github上遨遊。果然,邂逅了兩位夢中情人——Pocketsphinx和Kaldi。
       ~~~~~~~作爲老資格的Pocketsphinx已經被後生Kaldi拍在沙灘上,但還是對Pocketsphinx做了一番實踐(詳情可在小生的博客中瀏覽)。最後,還是選擇使用Kaldi,較於前者,Kaldi識別率更高,誤識別率更低。
(莫愁前路無網絡,離線語音正待君——Pocketsphinx篇)
       ~~~~~~~但是,既然是開源,所以很多時候,還需要在手中雕琢,方能顯其美。在對kaldi進行一系列封裝以後,將一步步開源封裝成果。
       ~~~~~~~以下,着重講解lib-share-asr組件的集成以及基本使用。

二、準備工作

1. 下載lib-share-asr組件

在這裏插入圖片描述
lib-share-asr組件結構介紹:
在這裏插入圖片描述

  • 該語音技能,也可在在線語音識別服務端程序中應用。如需自定義語音技能,請依照已實現技能進行開發。
  • lib-share-asr在修改build.gradle等文件後,作爲APP獨立運行和開發。
  • 上述爲簡單封裝,後期將逐步完善並在博客更新。

2. AS最新版本

3. 真機測試

  • 不推薦模擬器,除非爲模擬器增加了外部存儲功能,否則運行組件會閃退)

三、導入工程

  • 注意事項:先按流程做完,最後再Sync Now。

1. 解壓

在這裏插入圖片描述

2. 黏貼進工程

在這裏插入圖片描述

3. 在主模塊導入資源

在這裏插入圖片描述

4. 配置build.gradle

在這裏插入圖片描述

5. 配置工程的settings.gradle

在這裏插入圖片描述

6. 點擊右上角的一行藍色字:Sync Now

7. 等待完成

四、組件集成

封裝後,離線語音識別功能以三種形式對外提供:

  1. Activity(依賴界面,已實現)
  2. Service(後臺運行,已實現)
  3. 普通類(封裝度最高,仍在進一步測試)

下面主要講解Service形式封裝的集成
雖然lib-share-core中有路由功能,但是此處爲方便講解,以主模塊直接依賴lib-share-asr組件來進行講解。

1. 添加依賴

在這裏插入圖片描述
在這裏插入圖片描述

2. 添加權限

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

在這裏插入圖片描述

3. 編程使用

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

4. 示例代碼

示例使用Activity與Service同進程不同線程間IBinder進行通信。還可以其它方式,請自行實現。

// MainActivity.java
/**
 * Copyright 2020 JiaDeng.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.dengjia.share_screen_snapshot;

import androidx.appcompat.app.AppCompatActivity;

import android.Manifest;

import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;

import com.dengjia.lib_share_asr.ShareAsrService;

import pub.devrel.easypermissions.EasyPermissions;

public class MainActivity extends AppCompatActivity  implements ServiceConnection {

//    private TextView tv_eventRouter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String[] perms = {Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO};
        if (!EasyPermissions.hasPermissions(this, perms)) {
            EasyPermissions.requestPermissions(this, "Need permissions for camera & microphone", 0, perms);
        }

        Intent intent = new Intent(this, ShareAsrService.class);
        startService(intent);
        bindService(intent, this, BIND_AUTO_CREATE);
    }

    @Override
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
        ShareAsrService.AsrResultBinder asrResultBinder = (ShareAsrService.AsrResultBinder) iBinder;
        ShareAsrService shareAsrService = asrResultBinder.getService();
        shareAsrService.addAsrResultListener(new ShareAsrService.AsrResultListener() {
        	// 此處傳回的result就是識別後的結果文本
            @Override
            public void onGetAsrResult(String result) {
                Log.e("MainActivity", "\n語音識別結果:" + result);
            }
        });
    }

    @Override
    public void onServiceDisconnected(ComponentName componentName) {

    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }

}
// 提示:從onGetAsrResult(String result)獲取每次的識別結果。

五、運行效果(圖片、視頻)

點擊運行安裝在手機或者智屏上,就可以體驗離線語音識別了。

1.運行效果

在這裏插入圖片描述
在這裏插入圖片描述

  1. 喚醒詞:小菲(連着呼喚"小菲小菲"可提高識別率)

  2. 智能家居設備控制測試:

    打開房間燈
    打開客廳空調
    關閉客廳電視

    設備迴應"操作成功"
    迴應示例:
    在這裏插入圖片描述

2. 喚醒詞識別

喚醒詞識別視頻演示

3. 家居設備操作技能識別

演示視頻在嗶哩嗶哩審覈中

4. 音視頻通話技能識別

演示視頻在嗶哩嗶哩審覈中

想要真正操控,可以在設備USB端接智能家居ZigBee模塊等其它局域型家居網絡。即可實現離線語音控制設備。

在這裏插入圖片描述

六、附錄

1.添加技能

在這裏插入圖片描述

模塊中已集成部分的智能家居控制控制語句,以及喚醒詞“小菲”。

2.ShareScreen智屏安卓項目架構

在這裏插入圖片描述

3. 計劃

計劃優化:

  • 多麥優化
  • 稍模匹配

計劃撰寫:

  • 基於Kaldi開發安卓離線語音識別項目(二)語音技能探討
  • 基於Kaldi開發安卓離線語音識別項目(三)語音識別流程
  • 基於Kaldi開發安卓離線語音識別項目(四)實現中文語音識別
  • 基於Kaldi開發安卓離線語音識別項目(五)實現喚醒詞識別及喚醒迴應
  • 基於Kaldi開發安卓離線語音識別項目(六)識別效果優化探討
  • 數據結構算法複習筆記
  • 高數、線代、離散、概率論與數理統計複習筆記
  • 計組、計網、計操複習筆記
  • 自然語言處理學習筆記

微信:15798024687
歡迎感興趣的朋友持續關注,一起探討。感謝您的瀏覽。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章