RISC-V大赛开发套件详解(四):D1哪吒开发板Haas-UI语音AI

简介: RISC-V大赛开发套件详解(四):D1哪吒开发板Haas-UI语音AI

编辑语:

为助力“玄铁杯”RISC-V应用创新大赛的顺利进行,协助参赛者快速上手操作大赛提供的RISC-V开发套件,OCC推出RISC-V大赛开发套件解析系列内容,从硬件特点到例程开发为开发者详细解读大赛开发套件。


上期内容开始,我们开启了D1 哪吒开发板HaaS-UI的开发介绍,并为大家演示了D1 哪吒开发板如何基于HaaS-UI实现Wi-Fi配网。本期我们将为大家介绍HaaS-UI的语音AI服务,旨在为准备基于D1 哪吒开发板开发离线语音功能或在线语音功能的开发者提供指导和借鉴。

01

概述

1.1 语音AI服务(Voice)

语音AI服务,简称Voice。服务框架采用通用的C/S架构,服务端提供离线语音功能和在线语音等功能。客户端可以接收服务端发出的事件,也可以向服务端发送控制命令。


02

编程语言

2.1 C/C++

Voice服务端是由C语言开发完成。Voice客户端支持C++开发。


2.2 JavaScript

Voice客户端支持JS语言开发。JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。虽然它是作为开发Web页面的脚本语言而出名,但是它也被用到了很多非浏览器环境中,JavaScript 基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式、声明式、函数式编程范式。下文演示了Voice客户端开发的实例。视频:完成一个ASR效果需要编写的代码下图:对应ASR效果


2.3 Vue.JS

Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式JavaScript框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用(SPA)提供驱动。Vue.JS 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。Vue.JS 自身不是一个全能框架——它只聚焦于视图层。因此它非常容易学习,非常容易与其它库或已有项目整合。另一方面,在与相关工具和支持库一起使用时,Vue.JS 也能驱动复杂的单页应用。下面动图展示的就是通过Vue.JS开发的界面。

图片.png


03

依赖库

3.1 ALSA库


ALSA是Advanced Linux Sound Architecture,高级Linux声音架构的简称。它在Linux操作系统上提供了音频和MIDI(Musical Instrument Digital Interface,音乐设备数字化接口)的支持。

  1. 有效支持所有类型的音频接口,从消费级声卡到专业的多声道音频接口。
  2. 完全模块化的声音驱动器。
  3. SMP 和线程安全设计。
  4. 用户空间库 (alsa-lib) 用于简化应用程序编程并提供更高级别的功能。
  5. 支持较旧的 Open Sound System (OSS) API,为大多数 OSS 程序提供二进制兼容性。在RVB-D1 开发板JS轻应用平台中,Voice服务使用ALSA-LIB库定时读取定量录音数据后,交给算法处理。


3.2 D-Bus库

  • 库名:libdbus-1.so.3


D-Bus是一种高级的进程间通信机制,它由freedesktop.org项目提供,使用AFL和GPL双许可证发行。D-Bus 提供system守护进程(用于“添加新硬件设备”或“打印队列更改”等事件)和per-user-login-session守护进程(用于用户应用程序之间的一般 IPC 需求)。此外,消息总线建立在通用的一对一消息传递框架之上,任何两个应用程序都可以使用该框架进行直接通信(无需通过消息总线守护进程)。


目前,通信应用程序在一台计算机上,或者通过未加密的 TCP/IP 进行,适合在具有共享 NFS 主目录的防火墙后面使用。D-Bus最主要的用途是在Linux桌面环境为进程提供通信,同时能将Linux桌面环境和Linux内核事件作为消息传递到进程。D-Bus的主要概率为总线,注册后的进程可通过总线接收或传递消息,进程也可注册后等待内核事件响应,例如等待网络状态的转变或者计算机发出关机指令。目前,D-Bus已被大多数Linux发行版所采用,开发者可使用D-Bus实现各种复杂的进程间通信任务。在RVB-D1 开发板JS轻应用平台中,Voice服务使用D-Bus通信机制对外提供事件信号(Signal)和方法(Method Call)。Voice服务使用的是D-Bus的系统总线(System Bus)。


语音AI服务和D-Bus的关系图:

图片.png


3.3 XML库

由于D-Bus的安全策略,服务“org.voice.server”需要设置own,配置文件存放于/etc/dbus-1/system.d/voice-dbus.conf。


该文件的解析依赖于libexpat.so库


<!DOCTYPE busconfig PUBLIC
 "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
 "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
        <policy user="root">
                <allow own="org.voice.server"/>
                <allow send_destination="org.voice.server"/>
                <allow send_interface="org.voice.server"/>
                <allow receive_sender="org.voice.server" receive_type="signal"/>
        </policy>
        <policy context="default">
                <deny own="org.voice.server"/>
                <deny send_destination="org.voice.server"/>
                <deny receive_sender="org.voice.server" receive_type="signal"/>
        </policy>
</busconfig>


若没有该配置文件,运行voice服务会报错误如下:


Name Error (Connection ":1.1" is not allowed to own the service "org.voice.server" due to security policies in the configuration file)


04

Voice服务启动

运行Voice客户端前,需要先启动Voice服务端,一般系统初始化过程中会默认启动Voice服务,若没有启动,则可执行如下命令启动:


/usr/bin/voice-service


查看服务是否成功启动,执行命令:输出信息中出现 string "org.voice.server" 则说明服务启动成功。


dbus-send --system --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.ListNames


05

Voice 客户端开发

5.1 D-Bus 接口

介绍Voice客户端开发必须要先郑重介绍其D-Bus接口,因为客户端开发基于D-Bus接口。


5.1.1 D-Bus API

D-Bus接口采用的是字符串形式,如下,定义了服务名、服务路径、服务接口。Voice 客户端通过这些字符串可以访问到Voice 服务。


5.1.1.1 D-Bus 服务名

"org.voice.server"


5.1.1.2 D-Bus 服务路径

"/org/voice/path"


5.1.1.3 D-Bus 服务接口

"org.voice.interface"


5.1.1.4 D-Bus BUS 类型

DBUS_BUS_SYSTEM


5.1.1.5 D-Bus Signal

下个章节会介绍这些信号是如何使用的。

名字

说明

"SessionBegin"

会话开始信号。

"SessionEnd"

会话结束信号。

"ASRBegin"

开始ASR识别信号,云端识别到语音的第一个词时会发送该事件

"ASRChanged"

ASR中间结果信号,云端识别到语音的过程中上报的事件

"ASREnd"

ASR识别结束信号

"NLP"

NLP结束信号

"TTSBegin"

TTS开始信号

"TTSEnd"

TTS结束信号


5.1.1.6 DBUS MethodCall

名字

说明

"Start"

开启语音服务

"Stop"

关闭语音服务

"GetState"

获取状态

"ASR"

调用该API进行ASR

"NLP"

调用该API进行NLP

"TTS"

调用该API进行TTS


5.2 用户使用示例(JS)

5.2.1 库文件

为了方便用户编程,JS层封装了一个Voice库,该库屏蔽了D-Bus相关的细节,用纯JS的方式(无本地方法)提供了API。用户只需要包含“voice.js”库,即可使用该APIs。


import voice from 'libs/voice.js'


5.2.2 Voice对象定义

function() {
  var self = this;
  this.voice = new voice("voice");
}


5.2.3 事件监听

通过JS编程,可以监听Voice服务发上来的事件。如下示例,介绍了如何监听Voice服务的各个事件。本文也提供了Linux命令行的方法监听Voice服务,可以更好的配合调

dbus-monitor --profile --system interface='org.voice.interface'


5.2.3.1 监听sessionBegin事件

function() {
  var self = this;
  this.voice.on("sessionBegin", (props) => {
    console.log(props);
    //此处可以暂停其它业务,播放session应答音等操作
  });
}


5.2.3.2 监听ASR事件

function() {
  var self = this;
  this.voice.on("ASRBegin", (props) => {
    //......
  });
  this.voice.on("ASRChanged", (props) => {
    //......
  });
  this.voice.on("ASREnd", (props) => {
    //......
  });
}


5.2.3.3 监听NLP事件

function() {
  var self = this;
  this.voice.on("NLP", (props) => {
    //......
  });
}


5.2.3.4 监听TTS事件

function() {
  var self = this;
  this.voice.on("TTSBegin", (url) => {
    //play
  });
  this.voice.on("TTSEnd", (url) => {
    //...
  });
}


5.2.4 服务的开启和关闭

通过JS编程,也可以将Voice服务强制关闭,需要注意的是关闭后,其客户端也将接收不到Voice服务的事件,除非调用“Start”方法将服务开启。通常情况下,不建议将Voice服务频繁的开关。本文提供Linux命令行的方法开关Voice服务:

dbus-send --system --print-reply --type=method_call --dest=org.voice.server /org/voice/path org.voice.interface.Start


5.2.4.1 关闭服务

function() {
  this.voice.stop();
}


5.2.4.2 开启服务

function() {
  this.voice.start();  //语音AI服务默认开启,不需要用户开启,只有当用户关闭后,才需要开启。
}


5.2.5 客户端退出

注意:Voice客户端退出时,需要用户主动调用destroy函数。destroy函数中会断开D-Bus链接,清除定时器资源。如果没有执行该操作,反复进行 new voice()的操作,会造成内存泄漏。


06

下期预告

有关D1 哪吒开发板HaaS-UI语音AI的介绍就到这里,下期我们将带大家了解D1 哪吒开发板如何基于HaaS-UI实现视频播放功能。欢迎大家持续关注本系列内容。


2022“玄铁杯”RISC-V应用创新大赛报名即将截止,还没有报名的小伙伴赶快点击下方图片报名参加吧。

图片.png


相关文章
|
7天前
|
人工智能 小程序
【一步步开发AI运动小程序】十五、AI运动识别中,如何判断人体站位的远近?
【云智AI运动识别小程序插件】提供人体、运动及姿态检测的AI能力,无需后台支持,具有快速、体验好、易集成等特点。本文介绍如何利用插件判断人体与摄像头的远近,确保人体图像在帧内的比例适中,以优化识别效果。通过`whole`检测规则,分别实现人体过近和过远的判断,并给出相应示例代码。
|
4天前
|
存储 人工智能 自然语言处理
ChatMCP:基于 MCP 协议开发的 AI 聊天客户端,支持多语言和自动化安装 MCP 服务器
ChatMCP 是一款基于模型上下文协议(MCP)的 AI 聊天客户端,支持多语言和自动化安装。它能够与多种大型语言模型(LLM)如 OpenAI、Claude 和 OLLama 等进行交互,具备自动化安装 MCP 服务器、SSE 传输支持、自动选择服务器、聊天记录管理等功能。
51 14
ChatMCP:基于 MCP 协议开发的 AI 聊天客户端,支持多语言和自动化安装 MCP 服务器
|
5天前
|
人工智能 API 语音技术
TEN Agent:开源的实时多模态 AI 代理框架,支持语音、文本和图像的实时通信交互
TEN Agent 是一个开源的实时多模态 AI 代理框架,集成了 OpenAI Realtime API 和 RTC 技术,支持语音、文本和图像的多模态交互,具备实时通信、模块化设计和多语言支持等功能,适用于智能客服、实时语音助手等多种场景。
67 15
TEN Agent:开源的实时多模态 AI 代理框架,支持语音、文本和图像的实时通信交互
|
6天前
|
人工智能 小程序 UED
【一步步开发AI运动小程序】十六、AI运动识别中,如何判断人体站位?
【云智AI运动识别小程序插件】提供人体、运动及姿态检测的AI能力,本地引擎无需后台支持,具备快速、体验好、易集成等优势。本文介绍如何利用插件的`camera-view`功能,通过检测人体站位视角(前、后、左、右),确保运动时的最佳识别率和用户体验。代码示例展示了如何实现视角检查,确保用户正或背对摄像头,为后续运动检测打下基础。
|
12天前
|
人工智能 小程序 API
【一步步开发AI运动小程序】十三、自定义一个运动分析器,实现计时计数02
本文介绍如何利用“云智AI运动识别小程序插件”开发AI运动小程序,详细解析了俯卧撑动作的检测规则构建与执行流程,涵盖卧撑和撑卧两个姿态的识别规则,以及如何通过继承`sports.SportBase`类实现运动分析器,适用于小程序开发者。
|
12天前
|
人工智能 小程序 API
【一步步开发AI运动小程序】十二、自定义一个运动分析器,实现计时计数01
随着AI技术的发展,AI运动APP如雨后春笋般涌现,如“乐动力”、“天天跳绳”等,推动了云上运动会、线上健身等热潮。本文将指导你从零开始开发一个AI运动小程序,利用“云智AI运动识别小程序插件”,介绍运动识别原理、计量方式及运动分析器基类的使用,帮助你在小程序中实现运动计时和计数功能。下篇将继续探讨运动姿态检测规则的编写。
|
1天前
|
人工智能 小程序 数据处理
uni-app开发AI康复锻炼小程序,帮助肢体受伤患者康复!
近期,多家康复机构咨询AI运动识别插件是否适用于肢力运动受限患者的康复锻炼。本文介绍该插件在康复锻炼中的应用场景,包括康复运动指导、运动记录、恢复程度记录及过程监测。插件集成了人体检测、姿态识别等功能,支持微信小程序平台,使用便捷,安全可靠,帮助康复治疗更加高效精准。
|
7天前
|
人工智能 小程序 JavaScript
【一步步开发AI运动小程序】十四、主包超出2M大小限制,如何将插件分包发布?
本文介绍了如何从零开始开发一个AI运动小程序,重点讲解了通过分包技术解决程序包超过2M限制的问题。详细步骤包括在uni-app中创建分包、配置`manifest.json`和`pages.json`文件,并提供了分包前后代码大小对比,帮助开发者高效实现AI运动功能。
|
12天前
|
人工智能 小程序 开发者
【一步步开发AI运动小程序】十一、人体关键点跳跃追踪
本文介绍如何利用“云智AI运动识别小程序插件”开发AI运动小程序,涵盖云上运动会、健身打卡等热门应用场景。通过示例代码展示如何调用插件功能,实现动作追踪与分析,助力开发者快速上手。
|
12天前
|
存储 人工智能 并行计算
【AI系统】算子开发编程语言 Ascend C
本文详细介绍了昇腾算子开发编程语言 Ascend C,旨在帮助开发者高效完成算子开发与模型调优。Ascend C 原生支持 C/C++标准,通过多层接口抽象、自动并行计算等技术,简化开发流程,提高开发效率。文章还探讨了并行计算的基本原理及大模型并行加速策略,结合 Ascend C 的 SPMD 编程模型和流水线编程范式,为读者提供了深入理解并行计算和 AI 开发的重要工具和方法。
28 2