【安卓离线语音识别】莫愁前路无网络,离线语音正待君——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独立运行和开发。
  • 上述为简单封装Kaldi;并在其基础上,扩展了自主开发的语音技能;
  • 后期将逐步完善和丰富功能,并在博客中更新。

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
欢迎感兴趣的朋友持续关注,一起探讨。感谢您的浏览。

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值