SkyLark App 应用开发指南

优质
小牛编辑
135浏览
2023-12-01
修订记录
版本修订内容修订时间修订者
V1.0创建2019.08.07kira
V1.1更新及补充Develop Guideline2019.11.04kira
V1.2添加Skylark配置及日志服务说明2019.12.13kira
V1.3添加底层模块加载返回及hw加载项可配置2019.12.16kira

[TOC]

1.1、简介

​ Skylark是针对国芯AI芯片,基于Linux系统,提供多媒体信息的输入、处理、输出及各种外围器件的驱动、操控等一系列解决和二次开发方案。开发者可直接或二次开发后应用于各种人工智能产品。

1.2、目的

​ 整合国芯AI芯片,Linux平台的软件开发方式。满足因不同场景或产品需要,快速便捷的完成业务功能的调整落地。

1.3、约定

  • Middleware:系统中间服务层,完成业务应用层与底层之间的交互及管理。

  • Senseflow:通用的流数据处理框架。

  • SenseBus:通用的进程内部消息总线服务。

  • Iotjs: 开源的轻量级JavaScript解释引擎。

  • JsApp:基于Iotjs的业务应用服务。

  • VSP:语音前处理服务。

2.1、框图

System Framework

2.2、概要说明

2.2.1、Kernal

​ 基于OpenWRT及不同硬件平台BSP定制。

2.2.2、驱动层

​ 根据不同的硬件平台,定制包裹相应的驱动。

2.2.3、文件系统

​ 根据用户需求定制。

2.2.4、Middleware

​ 介于应用服务层与系统底层之间,将应用服务层软件与系统底层接口操作分离开来,实现两者可独立开发、维护。

2.2.5、IPC

​ 进程间通信服务Flora,实现不同进程之间的信息交互。

2.2.6、Senseflow & Application

  • Senseflow:通用的流数据处理框架,功能模块由Components和Proxy组成,内部采用Sensebus消息总线服务,完成语音、图像的识别。

  • Application:采用JavaScript语言开发的应用业务服务,便于开发者快速添加、删除、修改相关业务功能,如:LED灯效调整、按键功重定义、提示音播放选择、配网模式选择、IOT服务接入等经常需要调整的业务。

3.1、框图

技术架构图

3.2、目录结构

Js App Sdk目录结构说明

3.3、说明

3.3.1、Entrance

​ App.js为JsApp执行的入口JS文件,负责加载各分层业务功能服务,同时开启事件监听服务。

3.3.1.1、流程说明

未命名文件

3.3.1.2、示例代码

// Todo: 加载方式一  
var module_name_1 = require('module file path');  
var MODULE_1= module_name_1.Create();

// Todo: 加载方式二  
var module_name_2= require('module file path);  
var MODULE_2 = new module_name_2();

// Todo: 事件消息监听  
event_emitter.addListener('topic', function () {  
// Todo: 打印消息

console.log('topic: ' + arguments[0]);  
// Todo: Deal Message  
... ...  
});

3.3.2、Hardware Abstraction & Iotjs Modules

3.3.2.1、流程说明

3.3.2.2、示例代码

// Todo: 加载 Iotjs Modules

// Note: [×××]代表加载模块名称  
var module_name = require('modules file path');  
var MODULE = module_name.Create();  
MODULE .Load[×××]();

// Todo: 设置User事件句柄

this.SetUserEmitter = function (emitter) {  
SL_BATTERY.SetUserEmitter(emitter);  
... ...  
};

// Todo: 设置HW事件句柄  
User[×××]Listener(hw_emitter);

3.3.3、User Abstraction & Actual User

3.3.3.1、流程说明

User

3.3.3.2、示例代码

// Todo: 加载 HW  
var hw = require('HW file path');  
var HW = hw.Create();  
var hw_emitter = HW.GetEmitter();

// Todo: 加载 Actual User  
var user_name = require('user file path');  
var ACTUALUSER = new user_name();

// Todo: Set User Emitter To Hw And Start User Listener

// Note: [×××]代表需要监听的模块  
HW.SetUserEmitter(user_emitter);  
Hw[×××]Listener(user_emitter);

// Todo: Set Hw Emitter To Actual User  
[ACTUALUSER].SetHwEmitter(hw_emitter);

// Todo: Start Actual Users Listener  
[SOLUTIONUSER]Listener();

3.4、添加自定义模块方式

3.4.1、添加Solution User

1、在solutionuser目录下,新建需要添加的Solution User文件夹,创建相应的JavaScript文件。(可参照Turing模块的目录文件结构)

2、在文件use.js中加载新添加的Solution User模块。(可参照Turing模块的加载方式)

3、在文件use.js中添加work_state配置,并添加事件消息处理函数。(可参照Turing模块的配置及添加方式)

4、新添加的Solution User,必须实现并提供四个外部可调用操作接口:

  • GetEmitter() | Solution User事件消息句柄获取函数;无参数;返回Solution
    User事件消息操作句柄。

  • SetHWEmitter(emitter) | Solution
    User设置HW硬件接口抽象层事件消息句柄;emitter:
    HW硬件接口抽象层事件消息句柄;无返回。

  • DealWorkStateMessage(type, message) | Solution User IPC消息处理函数;type:
    message类型(string), message: 消息体;返回true/false。

  • DealUserEventMessage(type, message) | Solution User HW层消息处理函数;type:
    message类型(string), message: 消息体;无返回。

3.4.2、添加Iotjs Module

1、在iotjsmodules目录下,新建需要添加的Iotjs Module文件夹,创建相应的JavaScript文件。(可参照sl_led模块的目录文件结构)

2、在文件hw.js中加载新添加的Iotjs Module模块。(可参照sl_led模块的加载方式)

3、配置User事件消息句柄,同时开启事件消息监听服务。(可参照sl_led模块的配置及监听服务开启方式)

4.1、整体概述

​ Senseflow定义为:通用流数据处理框架。主要处理摄像头图像数据与VSP音频数据,大致划分为如下几个方便:

  • 基础框架代码与基础功能模块,如:文件夹base、include下的代码。该部分代码已基本固化,后续如不调整框架,则不会涉及该部分代码的修改、维护。

  • 启动代码、第三方库引用,如:文件夹daemon、external。该部分代码已基本固化,后续如不调整基础功能,则不会涉及该部分代码的修改、维护。

  • 外置功能模块,如:文件夹modules。该部分代码主要用来实现IPC通信,如调整通信机制或协议,则需修改、维护此部分的代码。

  • 功能组件,如:文件夹circuits、components。该部分代码为流数据处理各环节的功能组件,大致可以分为通用组件①、配置组件②与自定义组件③,后续主要修改、维护该部分的代码。

  • .sf配置文件,用来组装功能组件、设置可配参数,根据产品或功能定义来编写、维护对应的.sf配置文件。

  • 产品或应用场景配置项目录,用来放置不同产品或应用场景下,Senseflow运行时需加载的配置项,如:声学、语言模型等。

  • 配置项目录,存放OpenWRT整体或package编译时,Senseflow运行时需加载的配置项,如:声学、语言模型等。

4.2、规划及维护方案

4.2.1、离线短指令方案

1、编译项目统一为一个版本,采用流式NLP的方式取代VAD。

2、配置项目从产品或应用场景配置项目录中选择配置。

具体操作详细文档:《离线短指令方案Senseflow编译配置说明.pdf》

4.2.2、对接AI云平台方案

1、AI云平台对接功能实现做为一个自定义组件③体现在代码仓库。

2、通过.sf配置文件,对接组装不同的AI云平台方案。

PS注释说明:

①通用组件,不同组件组装方案都会用到的组件,如:vsp、sptk、logfbank_m2n等。

②配置组件,通过不同的配置文件来实现不同功能的组件,如:gxdnn、wfst_decoder等。

③自定义组件,根据用户选择添加的组件,如:Turing等。

5.1、Configuration

5.1.1、说明

1、在根目录添加:config目录,存放SDK需要的所有配置文件(json)。

2、Solution Users可在自身方案添加:config目录,用来存放自身需要的所有配置文件。SDK添加只读配置文件的操作方法①(遵循配置文件模板②即可),用户也可按照自身习惯自行完成配置服务。

3、SDK配置目前分为:

  • app.json: 过渡配置文件,兼容之前的版本 - R

  • gxiot.json: GX IOT服务配置 - R

  • hw.json: 底层功能模块服务配置 - R

  • log.json: 日志服务配置 - R

  • net.json: 网络服务配置 - R

  • volume.json: 系统音量配置 - WR

  • wifi.json: wifi配置 - WR

PS注释说明:

只读配置文件的操作方法:

源码: public/config/sl_solutionconfig.js

方法:

  • ReadAppConfigValue(solutionFile, key, value) 根据key value获取json对象。

  • ReadAppConfigObject(solutionFile, key) 根据key获取json对象。

②配置文件模板:{ “Config”: { } } 范例:

{

“Config”: {

“solution”: { “name”: “” },

“Source”:{ “Path”: “” }

}

}

5.2、Logging

5.2.1、说明

1、SDK中需要调试打印、测试、记录等信息,统一接入log服务。

2、Solution Users根据自身需要选择是否接入。

3、可根据需要在config/log.json开启SDK各模块的log服务。Solution
Users如接入,需自行完成此功能。

ps: log服务待持续完善,目前只实现了调试打印。

5.2.2、使用范例

1、源码:public/log/log.js 不同模块可根据与其的相对路径require(path+log)加载。

2、方法:RecordLog(logMessage, logSwitch)

3、范例:

var log = require(path+log);

var LOG = log.Create();

LOG.RecordLog(‘hello’, true/false);

​ 用户可根据提供的Native User Modules加载结果返回接口,获取相关加载结果信息;可通过配置hw.json的load项来配置所需要加载的底层模块。

6.1、Native User Modules Load

6.1.1、说明

​ Iotjsmodules中所包裹的底层模块,统一提供接口:IsModuleLoadSuccess()返回模块加载结果,true:success;
false: failed

6.2、HW Load Configuration

6.2.1、说明

  • 配置文件:config/hw.json

  • 配置项:load

  • 配置说明:true: 加载;false: 不加载。

"load": {
    “battery”:         true/false,
    “bluetooth”:     true/false,
    “keyboard”:     true/false,
    “led”:         true/false,
    “lowpower”:     true/false,
    “mplayer”:         true/false,
    “ota”:         true/false,
    “otp”:         true/false,
    “rplayer”:         true/false,
    “soundwave”:     true/false,
    “syscmd”:         true/false,
    “volume”:         true/false,
    “wavplayer”:     true/false,
    “wifi”:         true/false
}

Listening Messages