概述
上期我们介绍了《基于EAIDK-310和SoundAI Azero的语音交互系统》,EAIDK-310开发套件摇身一变,成为了我们所熟知的智能音箱。
当我们“调戏”智能语音助手,与它进行对话交流的时候,中间都涉及哪些流程呢?这期文章就为大家做一个解读与演示。
EAIDK-310开发套件
EAIDK(Embedded Artificial Intelligence Development Kit)- 嵌入式人工智能开发套件,是全球首个采用Arm架构的人工智能开发平台,是OPEN AI LAB专为 AI 开发者精心打造,面向边缘计算的人工智能开发套件。硬件平台具备语音、视觉等传感器数据采集能力,及适用于多场景的运动控制接口;智能软件平台支持视觉处理与分析、语音识别、语义分析、SLAM等应用的基础平台和主流开源算法,满足端侧AI教育、算法应用开发、产品原型开发验证等需求。
EAIDK-310作为EAIDK产品系列中的一款套件,该套件硬件平台使用的是含有4核A53 CPU的高性能Arm SoC(瑞芯微rk3228H),通过搭载OPEN AI LAB开发的嵌入式深度学习框架Tengine,为AI应用提供简洁、高效、统一的API接口,加速终端AI产品的场景化应用落地实现。同时,使用自建的源服务器,便于用户快速上手使用。
EAIDK平台,配置专有更新源文档内容服务,该源服务器支持Tengine/BladeCV/OpenCV以及其他标准第三方软件安装和更新。
表格1 EAIDK-310 硬件规格
表格 2 EAIDK-310 软件规格
实现本案例除了需要一块EAIDK-310核心板,我们还需要一个usb麦克风阵列和一个usb音箱或3.5mm接口耳机 。麦克风阵列用于音频采集,usb音箱或耳机用于音频播放。
本案例中我们使用的是4mic麦克风线型阵列SoundPi linear麦克风模组,购买链接点这里。
语音交互流程
语音是最自然的交互方式之一,有着输入效率高、门槛低、使用方便以及能有效进行情感交流的优势。如下图,一次完整的语音交互,应包含语音识别、自然语言处理、语音合成等流程。
下面我们分别介绍下语音识别、自然语言处理、语音合成的定义及其分别在EAIDK-310平台的实现。
ASR
语音识别(Automatic Speech Recognition, ASR),将语音信号进行分析,并转化为对应的文本信息(文字、拼音等),相当于耳朵。其目标是让计算机能够“听写”出不同人所说出的连续语音,也就是俗称的“语音听写机”,是实现“声音”到“文字”转换的技术。自动语音识别也称为语音识别(Speech Recognition)或计算机语音识别(Computer Speech Recognition)。
语音识别流程包括语音输入、特征提取 、解码和文字输出等过程。
下面为大家展示,在EAIDK-310平台上实现语音识别的案例。
下载解压
系统启动后,首先会进入EAIDK经典Fedora系统桌面环境。(部分版本固件可能需要输入用户名和密码才能进入桌面,用户名密码全都输入openailab,点回车即可登录桌面环境)
鼠标点击桌面左下角第三个图标(LXTerminal),即可打开终端。下面我们所有操作,都是在终端里面进行的。
EAIDK-310联网状态下,输入下面指令下载基于EAIDK-310的 ASR源码包
wget ftp://ftp.eaidk.net/EAIDK310_Source/SoundAI/opdn_basex_sample.tar.gz
可以看到,已经将opdn_basex_sample.tar.gz
下载到本地。
解压源码包opdn_basex_sample.tar.gz
tar -xzvf opdn_basex_sample.tar.gz
解压完成后,进入opdn_basex_sample_ailab
目录
cd opdn_basex_sample_ailab/
软件结构
加压后的源码包相关文件与说明如下:
- inc : 相关头文件
- lib : 编译示例代码所需的依赖库,降噪唤醒库、ASR库、NLP库等,目录中分版本放置
sample : 示例代码
- sample_basexdenoise.cpp
- cJSON.c
- toolchain-cmake : cmake交叉编译配置文件
- sai_config : 配置文件、唤醒模型目录
修改配置文件
以4mic麦克风线型阵列(也可以使用6mic麦克风环型阵列)为例,将麦克风通过USB接口连接到EAIDK-310开发套件。
此时可以在开发套件上用命令可查询到麦克风线性阵列的设备节点,如下:
arecord -l
修改代码sample/sample_basexdenoise.cpp
的麦克风数量和实际节点号,如下:
vim sample/sample_basexdenoise.cpp
编译
设置环境变量
export LD_LIBRARY_PATH=./lib/arm64-linux/asr/
编译代码
chmod 755 make.sh
./make.sh aarch64-gnu
编译成功
运行
启动软件
./build/aarch64-gnu/release/sample_basexdenoise sai_config/ 1 sai_config/license.txt y
到这里,通过喊”小艺小艺“唤醒设备之后,EAIDK-310开发套件即可通过麦克风阵列录音,经过声智客户降噪算法,将语音上传至声智科技Babel开放平台进行识别,然后返回文本。这里通过“小艺小艺”唤醒设备之后 ,说出“你好”,经过语音识别流程之后,终端返回文本“你好”。
ASR流程
1.启动录音线程
pthread_mutex_init(&g_lock,NULL);
pthread_t pt_record;
StartRecordThread(&pt_record);
usleep(1000*10);
string data_str;
while(1)
{
pthread_mutex_lock(&g_lock);
if(g_q.size()>0)
{
data_str=g_q.front();
g_q.pop();
}
2.将音频数据送给声智降噪唤醒算法库处理
void feed_data(sai_denoise_ctx_t* ctx, const char* data, size_t size)
{
if(sai_denoise_feed(ctx,data,size)==0){
writeToFile(1100, Sai_Debug_Raw, std::string(data, size));
}
else{
printf("Failed to feed data");
}
return;
}
3.降噪唤醒库的相关回调函数
//唤醒触发回调函数,识别到唤醒词就会触发此函数
void svk_denoise_event_WAKE_cb(sai_denoise_ctx_t* ctx, const char* type, int32_t code, const void* payload,
void* user_data)
//降噪后的ASR数据回调函数
void svk_denoise_data_ASR_cb(sai_denoise_ctx_t* ctx, const char* type, const char* data, size_t size,
void* user_data)
//VAD检测回调函数
void svk_denoise_event_VAD_cb(sai_denoise_ctx_t* ctx, const char* type, int32_t code, const void* payload,
void* user_data)
4.将降噪后的音频送到云端识别,识别结果通过回调函数返回
debug_log("[Got Event: Vad] vad_val = %d", vad);
switch (vad) {
case 0:
debug_log("[Got Event: Vad] Vad_begin");
break;
case 1:
debug_log("[Got Event: Vad] Vad_end");
sai_denoise_stop_beam(ctx);
while ((buff_size=buff_size-N)>0)
{
memcpy(buf,buff,N);
buff=buff+N;
if(buff_size<0)break;
sai_openapi_asr_session_recognize(asr_session, buf, N);
usleep((N * 8 /(16000 * 16* 8 / 1000)) * 1000);
}
sai_openapi_asr_session_flush(asr_session);
5.设置AppId和SecretKey
char *app_id = "AAAAAHErWgIgq3RgSiBUH03b";
char *secret_key = "dVuowniuIGRhgD3vapkIUhvc";
NLP
自然语言处理(Natural Language Processing,NLP),是指用计算机对自然语言的形、音、 义等信息进行处理,即对字、词、句、篇章的输入、识别、分析、理解、输出、生成等的操作和加工,实现人机间的信息交流。说人话,就是理解和处理文本的过程,相当于大脑。
NLP的处理流程包括获取语料、语料预处理、特征工程、特征选择、模型训练、评价指标等过程。
下面为大家展示,在EAIDK-310平台上实现自然语言处理的案例。
下载解压
EAIDK-310联网状态下,在终端输入下面指令下载基于EAIDK-310的 NLP源码包
wget ftp://ftp.eaidk.net/EAIDK310_Source/SoundAI/nlp.zip
可以看到,已经将nlp.zip
下载到本地。
解压源码包nlp.zip
unzip nlp.zip
解压完成后,进入nlp
目录
cd nlp
软件结构
- examples : 示例代码
- lib : 编译示例代码所需的依赖库
- include : 编译示例代码所需的头文件
编译
设置环境变量
export LD_LIBRARY_PATH=./lib/
编译
gcc examples/nlp_sample_c.c -L lib/ -lbabel_cpp_nlp -I include/ -o nlp
运行
启动软件,这里需要使用在声智官网申请到的AppId
和SecretKey
./nlp AAAAAHErWgIgq3RgSiBUH03b dVuowniuIGRhgD3vapkIUhvc
此处是查询天气信息,“上海今天天气”,结果通过回调函数返回,结果是json格式文本,可以参考《ASR实例》使用cJSON解析出有效信息
下面我们再换两种问法,看下它的理解是否正确、一致
“上海今天有雨吗”,
“上海会下雪吗”
可以看到,它都准确的理解到了我们询问天气的意思,把上海今天的天气反馈给了我们。
NLP主要代码
examples/nlp_sample_c.c主要代码:
//设置回调函数
void nlp_callback_function(nlp_error_code_e type, const char *json) {
printf("[example]%s\n", json);
}
int main(int argc, char *argv[]) {
if (argc < 3) {
printf("Need app_id secret_key as 2nd and 3rd parameter\n");
return 1;
}
const char *app_id = argv[1];
const char *secret_key = argv[2];
//打印版本号
printf("NLP Version: %s\n", sai_nlp_get_version());
//构造nlp对象
sai_openapi_nlp_t *nlp_ptr = sai_openapi_create_nlp(app_id,
secret_key);
//非阻塞接口示例
sai_openapi_nlp_async(nlp_ptr, "上海今天天气", nlp_callback_function);
//释放nlp对象
sai_openapi_destory_nlp(nlp_ptr);
return 0;
}
TTS
语音合成(Text-To-Speech,TTS),是把文本转化成语音的过程,让机器说话,相当于嘴巴。如果说语音识别技术是让计算机学会“听”人的话,将输入的语音信号转换成文字,那么语音合成技术就是让计算机程序把我们输入的文字“说”出来,将任意输入的文本转换成语音输出。大家在siri等各种语音助手中听到的声音,都是由TTS来生成的,并不是真人在说话。
下面为大家展示,在EAIDK-310平台上语音合成的案例。
下载解压
EAIDK-310联网状态下,在终端输入下面指令下载基于EAIDK-310的 NLP源码包
wget ftp://ftp.eaidk.net/EAIDK310_Source/SoundAI/tts.zip
可以看到,已经将nlp.zip
下载到本地。
解压源码包tts.zip
unzip tts.zip
解压完成后,进入nlp
目录
cd nlp
软件结构
- examples : 示例代码
- include: 包含C/C++的头文件
- lib: 相关SDK库文件
编译
设置环境变量
export LD_LIBRARY_PATH=lib/
编译
gcc examples/tts_sample_c.c -L lib/ -lbabel_cpp_tts -I include/ -o tts
运行
启动软件,这里需要用使用在声智官网申请到的AppId
和SecretKey
./tts AADBaEnNUZBKg0WBT2oIcWp7 So7NTzb3jzsoF0cfLKvHCoyytzo
输入exit
并回车,会自动生成文字转语音的文件sai_openapi_async_tts.mp3
音频播放,推荐给大家一个非常好用的音频播放工具,安装方式如下
sudo dnf install sox-devel
到这里输入y,确认安装
到这里音频播放工具就安装完成了。
使用alsamixer命令可以选择音频播放设备、调节音量
根据提示,按“F6”选择音频播放设备
这里我们使用的是EAIDK-310自带的3.5mm耳机孔,插普通耳机来听播放的音频,所以这里选择rockchip-rk3328选项
这里是调节音量选项。
设置完成后,点击“Esc”键退出设置。
设置好音频播放参数后,然后就可以使用play命令播放生成的.mp3文件了
可以听到,这里音频播放的内容,即examples/tts_sample_c.c
示例代码中的文字内容,自己也可以自定义修改里面的文字内容,包括英文单词等,对比语音合成效果。
除了文字内容以外,也可以在示例代码中修改语音类型、语速、语调、音量等参数
总结
以上基于EAIDK-310的语音识别、自然语言处理、语音合成案例都是基于声智在线语音SDK来实现的,需要设备联网才能得到结果。通过本章内容,希望能够让开发者在EAIDK平台上快速体验智能语音功能效果,为大家做智能语音相关的应用开发提供参考。
如有疑问或想要了解更多关于EAIDK开发平台方面的内容,欢迎加入EAIDK开发者大本营参与互动讨论,QQ群:625546458。
更多EAIDK相关阅读:
基于EAIDK-310和SoundAI Azero的语音交互系统
基于EAIDK的人脸算法应用(一)
基于EAIDK的人脸算法应用-源码解读(二)
基于EAIDK-310的传感器调试案例介绍(一)
基于EAIDK-310的传感器调试案例介绍(二)
如何使用EAIDK-310的GPIO点亮小灯泡