简介

Rokid开放平台SDK包含Siren、NLP、ASR、TTS几大模块。要使用Rokid开放平台的SDK,首先需要有一套 Android 源码,然后下载以下SDK模块:

Android 6.0 使用

git clone https://github.com/Rokid/rokid-openvoice-sdk-deps-protobuf -b android23

Android 5.0 使用

git clone https://github.com/Rokid/rokid-openvoice-sdk-deps-protobuf -b android22

命令获取protobuf。另外,这里为大家提供了rokid-openvoice-sample-android示例代码帮忙大家快速集成。

接下来会从以下6个步骤完整讲述如何为自己的项目部署Rokid开放平台的SDK:

1 目录结构

命名建议与上图一致

rokid-openvoice-sample-android 与整个的业务逻辑相关,其中包含一个C进程和一个Java进程,以及MIC HAL。C进程用于为Siren提供pcm流,然后传递由Siren滤波降噪过的纯净语音给NLP或ASR,NLP或ASR经过云端处理返回结果,还有一个最重要的点就是维持Siren与NLP或ASR之间的状态。Java进程用于解析NLP或ASR返回结果,处理应用层逻辑。

2 配置

1、进入Rokid开放平台申请Rokid账号,已经有Rokid账号的同学可直接登录(但需进行部分信息补全)。
2、登录后点选「语音接入」进行设备认证信息申请。
3、具体做法:语音接入 > 创建新设备 > 填写设备名称 > 创建认证文件。之后您将获得:
account_id
device_type_id
device_id
secret、key

通过以上信息,您就可以获取Rokid语音服务了,然后把申请得到的账号信息写入到 /rokid-openvoice-sample-android/etc/openvoice-profile.json文件中。

{
    'host': 'apigwws.open.rokid.com',
    'port': '443',
    'branch': '/api',
    'ssl_roots_pem': '/system/etc/roots.pem',
    'key': 'your_key',
    'device_type_id': 'your_device_type_id',
    'device_id': 'your_device_id',
    'api_version': '1',
    'secret': 'your_secret',
    'codec': 'opu'
}

请添加如下内容到 /device/xxxx/p230/p230.mk,每个人的路径是不一样的。这一步是为了让SDK编译出来的东西打包进system.img。

注意SDK存放位置

include openvoice/rokid-openvoice-sample-android/device/xxxx/p230/openvoice.mk

如果你是Android 5.0 的代码,你还需要添加如下内容,这一步后面会想办法去掉,不过目前还是必不可少的

/build/core/definitions.mk 最后一行添加下面这一句

include openvoice/rokid-openvoice-sample-android/build/core/definitions.mk

3 处理权限问题

Android 基于Linux引入了selinux,这是专门为Linux设计的一套安全机制。它有三种工作模式,Android4.2 以前一直处于Permission模式,之后便工作在enforcing模式,这就需要我们根据selinux的规范添加相应的.te文件,建议在开发阶段设回Permission,省掉一大堆权限问题。

/system/core/init/init.cpp 

static selinux_enforcing_status selinux_status_from_cmdline() {
	selinux_enforcing_status status = SELINUX_ENFORCING;
	修改为
	selinux_enforcing_status status = SELINUX_PERMISSIVE;
}  

4 添加系统启动项

进入到 /device/xxxx/common/products/mbox/init.xxxx.rc加入如下内容,每个人的目录是不一样的。因为rokid-openvoice-sample-android中的C进程编译出来为runtime,所以我们加在这里,让init进程帮我们启动。

service runtime /system/bin/runtime
    class main
    user root
    group root root 

5 编译

如果你的开发板使用的是USB MIC,你需要定义宏 USB_AUDIO_DEVICE,具体操作如下:

/rokid-openvoice-sample-android/Android.mk

LOCAL_CPPFLAGS += -DUSB_AUDIO_DEVICE

如果你不使用Java或TTS接口,请修改如下内容,否则你需要使用 git clone https://github.com/Rokid/rokid-openvoice-sdk-deps-fastjson.git 获取依赖Jar包。

/rokid-openvoice-sdk/Android.mk

include $(LOCAL_PATH)/JavaLibrary.mk
修改为
#include $(LOCAL_PATH)/JavaLibrary.mk

单编 :

先编译 Andorid,然后使用mm依次编译:rokid-openvoice-sdk-deps-protobuf,rokid-openvoice-sdk-deps-poco,rokid-openvoice-sdk,rokid-blacksiren,rokid-openvoice-sample-android。

整编 :

./build/envsetup.sh
lunch <your config>
make aprotoc -j8
make -j8

6 调试

以上是一套完整的集成流程,到目前为止已经完成了50%的工作。调试主要围绕MIC这块,拾音以及语音识别准确度都围绕在这里,建议大家分两步:

第一步:测试硬件是否OK,我们使用tinycap命令抓取pcm裸数据,这个命令是从kernel层直接拿数据,不经过HAL层,这样可以定位问题。然后用Audacity工具分析波形,要想识别效果好就不能有杂音出现。

adb shell
stop runtime
cd /sdcard
tinycap file.wav [-D card] [-d device] [-c channels] [-r rate] [-b bits] [-p period_size] [-n n_periods]

card        :选择一个MIC设备,可以进入/proc/asound/ 下查看
device      :0代表输入,1代表输出
channels    :通道数
rate        :采样率,Siren采样率最小必须为48K
bits        :比特率,32/24/16
period_size :周期
periods     :点

例:
tinycap 1.wav -D 0 -d 0 -c 8 -r 48000 -b 32 -p 1024 -n 8
adb pull sdcard/1.wav ./

第二步:拾音,也就是Siren,这里教大家做一个简单的配置。

1. /rokid-blacksiren/resource/blacksiren.json 

mic_num        :总的MIC个数(aec没有则不计算在内)
mic_channel_num:对应的channel数,一般是一对一
mic_simple_rate:大于等于48000

2. /rokid-blacksiren/resource/cn/r2ssp.cfg

audio.rate  :等同于上面的 sample_rate
aec         :(重要)全称为Acoustic Echo Chancellor,可以消除各种延迟的回声,这个需要内核做修改,大家可以关闭掉(置0)
aec.mics    :实际使用的MIC通道(不包括aec)
aec.ref.mics:aec的虚拟通道(aec是关闭可以不用管)

mic.num       :总的MIC个数(aec没有则不计算在内)
mic.pos(0...n):MIC方位,程三维立体型,需要游标尺精确测量,寻向角度与此相关,不影响拾音。如图0--3
为实际MIC,需要精确方位,后面全部都是AEC虚拟通道,不需要方位 。大家根据自己的硬件进行配置(详细测量方式见附件1)
sl.poc        :实际使用的MIC通道(不包括aec)
bf.mics       :同上

到这为止整个集成就大告完成,后续优化主要针对MIC硬件,以及添加AEC来改善拾音,下一章就会讲解编译中普遍遇到的问题。

附件1:

如图,MIC可以呈三维立体设计,但一般都是二维的。不管怎样,只要找到圆心,按照MIC顺序依次测量从圆心到MIC之间的距离。例如上面pos.0的坐标:x=0.00000000,y=0.03000000,z=0.00000000,单位为”米“。