基於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. 等待完成
四、組件集成
封裝後,離線語音識別功能以三種形式對外提供:
- Activity(依賴界面,已實現)
- Service(後臺運行,已實現)
- 普通類(封裝度最高,仍在進一步測試)
下面主要講解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.運行效果
-
喚醒詞:小菲(連着呼喚"小菲小菲"可提高識別率)
-
智能家居設備控制測試:
打開房間燈
打開客廳空調
關閉客廳電視設備迴應"操作成功"
迴應示例:
2. 喚醒詞識別
喚醒詞識別視頻演示
3. 家居設備操作技能識別
演示視頻在嗶哩嗶哩審覈中
4. 音視頻通話技能識別
演示視頻在嗶哩嗶哩審覈中
想要真正操控,可以在設備USB端接智能家居ZigBee模塊等其它局域型家居網絡。即可實現離線語音控制設備。
六、附錄
1.添加技能
模塊中已集成部分的智能家居控制控制語句,以及喚醒詞“小菲”。
2.ShareScreen智屏安卓項目架構
3. 計劃
計劃優化:
- 多麥優化
- 稍模匹配
計劃撰寫:
- 基於Kaldi開發安卓離線語音識別項目(二)語音技能探討
- 基於Kaldi開發安卓離線語音識別項目(三)語音識別流程
- 基於Kaldi開發安卓離線語音識別項目(四)實現中文語音識別
- 基於Kaldi開發安卓離線語音識別項目(五)實現喚醒詞識別及喚醒迴應
- 基於Kaldi開發安卓離線語音識別項目(六)識別效果優化探討
- 數據結構算法複習筆記
- 高數、線代、離散、概率論與數理統計複習筆記
- 計組、計網、計操複習筆記
- 自然語言處理學習筆記
- 等
微信:15798024687
歡迎感興趣的朋友持續關注,一起探討。感謝您的瀏覽。