当前位置:   article > 正文

【安卓离线语音识别】莫愁前路无网络,离线语音正待君——Kaldi篇_kaldi android

kaldi android

基于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" />
  • 1
  • 2

在这里插入图片描述

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
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79

五、运行效果(图片、视频)

点击运行安装在手机或者智屏上,就可以体验离线语音识别了。

1.运行效果

在这里插入图片描述
在这里插入图片描述

  1. 唤醒词:小菲(连着呼唤"小菲小菲"可提高识别率)

  2. 智能家居设备控制测试:

    打开房间灯
    打开客厅空调
    关闭客厅电视
    设备回应"操作成功"

    语音识别结果示例:
    在这里插入图片描述

2. 唤醒词识别

演示视频待更新

3. 家居设备操作技能识别

演示视频在哔哩哔哩审核中

4. 音视频通话技能识别

演示视频在哔哩哔哩审核中

想要真正操控,可以在设备USB端接智能家居ZigBee模块等其它局域型家居网络。即可实现离线语音控制设备。

在这里插入图片描述

六、附录

1.添加技能

在这里插入图片描述

模块中已集成部分的智能家居控制控制语句,以及唤醒词“小菲”。

2.ShareScreen智屏安卓项目架构

在这里插入图片描述

3. 计划

计划优化:

  • 多麦优化
  • 稍模匹配

计划撰写:

  • 基于Kaldi开发安卓离线语音识别项目(二)语音技能探讨
  • 基于Kaldi开发安卓离线语音识别项目(三)语音识别流程
  • 基于Kaldi开发安卓离线语音识别项目(四)实现中文语音识别
  • 基于Kaldi开发安卓离线语音识别项目(五)实现唤醒词识别及唤醒回应
  • 基于Kaldi开发安卓离线语音识别项目(六)识别效果优化探讨
  • 数据结构算法复习笔记
  • 高数、线代、离散、概率论与数理统计复习笔记
  • 计组、计网、计操复习笔记
  • 自然语言处理学习笔记

微信:15798024687
欢迎感兴趣的朋友持续关注,一起探讨。感谢您的浏览。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/124123
推荐阅读
相关标签
  

闽ICP备14008679号