11

杨二凯 · 2020年04月10日

基于EAIDK-310和声智科技Babel的智能语音平台

概述

上期我们介绍了《基于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 硬件规格
image.png

表格 2 EAIDK-310 软件规格
image.png

实现本案例除了需要一块EAIDK-310核心板,我们还需要一个usb麦克风阵列和一个usb音箱或3.5mm接口耳机 。麦克风阵列用于音频采集,usb音箱或耳机用于音频播放。
本案例中我们使用的是4mic麦克风线型阵列SoundPi linear麦克风模组,购买链接点这里

语音交互流程

语音是最自然的交互方式之一,有着输入效率高、门槛低、使用方便以及能有效进行情感交流的优势。如下图,一次完整的语音交互,应包含语音识别、自然语言处理、语音合成等流程。
image.png

下面我们分别介绍下语音识别、自然语言处理、语音合成的定义及其分别在EAIDK-310平台的实现。

ASR

语音识别(Automatic Speech Recognition, ASR),将语音信号进行分析,并转化为对应的文本信息(文字、拼音等),相当于耳朵。其目标是让计算机能够“听写”出不同人所说出的连续语音,也就是俗称的“语音听写机”,是实现“声音”到“文字”转换的技术。自动语音识别也称为语音识别(Speech Recognition)或计算机语音识别(Computer Speech Recognition)。

语音识别流程包括语音输入、特征提取 、解码和文字输出等过程。

下面为大家展示,在EAIDK-310平台上实现语音识别的案例。

下载解压

系统启动后,首先会进入EAIDK经典Fedora系统桌面环境。(部分版本固件可能需要输入用户名和密码才能进入桌面,用户名密码全都输入openailab,点回车即可登录桌面环境)
image.png
鼠标点击桌面左下角第三个图标(LXTerminal),即可打开终端。下面我们所有操作,都是在终端里面进行的。
image.png
EAIDK-310联网状态下,输入下面指令下载基于EAIDK-310的 ASR源码包

wget ftp://ftp.eaidk.net/EAIDK310_Source/SoundAI/opdn_basex_sample.tar.gz

image.png
可以看到,已经将opdn_basex_sample.tar.gz下载到本地。
解压源码包opdn_basex_sample.tar.gz

tar -xzvf opdn_basex_sample.tar.gz 

image.png
解压完成后,进入opdn_basex_sample_ailab目录

cd opdn_basex_sample_ailab/

image.png

软件结构

加压后的源码包相关文件与说明如下:

  • inc : 相关头文件
  • lib : 编译示例代码所需的依赖库,降噪唤醒库、ASR库、NLP库等,目录中分版本放置
  • sample : 示例代码

    • sample_basexdenoise.cpp
    • cJSON.c
  • toolchain-cmake : cmake交叉编译配置文件
  • sai_config : 配置文件、唤醒模型目录

修改配置文件

以4mic麦克风线型阵列(也可以使用6mic麦克风环型阵列)为例,将麦克风通过USB接口连接到EAIDK-310开发套件。
image.png
此时可以在开发套件上用命令可查询到麦克风线性阵列的设备节点,如下:

arecord -l

image.png

修改代码sample/sample_basexdenoise.cpp的麦克风数量和实际节点号,如下:

vim sample/sample_basexdenoise.cpp

image.png

image.png

编译

设置环境变量

export LD_LIBRARY_PATH=./lib/arm64-linux/asr/ 

image.png

编译代码

chmod 755 make.sh
./make.sh aarch64-gnu

image.png

编译成功
image.png

运行

启动软件

./build/aarch64-gnu/release/sample_basexdenoise sai_config/ 1  sai_config/license.txt y

image.png

image.png

到这里,通过喊”小艺小艺“唤醒设备之后,EAIDK-310开发套件即可通过麦克风阵列录音,经过声智客户降噪算法,将语音上传至声智科技Babel开放平台进行识别,然后返回文本。这里通过“小艺小艺”唤醒设备之后 ,说出“你好”,经过语音识别流程之后,终端返回文本“你好”。
image.png

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

image.png

可以看到,已经将nlp.zip下载到本地。
解压源码包nlp.zip

unzip nlp.zip

image.png

解压完成后,进入nlp目录

cd nlp

image.png

软件结构

  • examples : 示例代码
  • lib : 编译示例代码所需的依赖库
  • include : 编译示例代码所需的头文件

编译

设置环境变量

export LD_LIBRARY_PATH=./lib/

image.png

编译

gcc  examples/nlp_sample_c.c  -L lib/ -lbabel_cpp_nlp -I include/ -o nlp

image.png

运行

启动软件,这里需要使用在声智官网申请到的AppIdSecretKey

./nlp AAAAAHErWgIgq3RgSiBUH03b dVuowniuIGRhgD3vapkIUhvc

此处是查询天气信息,“上海今天天气”,结果通过回调函数返回,结果是json格式文本,可以参考《ASR实例》使用cJSON解析出有效信息
image.png

image.png

下面我们再换两种问法,看下它的理解是否正确、一致
“上海今天有雨吗”,
image.png

image.png

“上海会下雪吗”
image.png

image.png

可以看到,它都准确的理解到了我们询问天气的意思,把上海今天的天气反馈给了我们。

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

image.png

可以看到,已经将nlp.zip下载到本地。
解压源码包tts.zip

unzip tts.zip

image.png

解压完成后,进入nlp目录

cd nlp

image.png

软件结构

  • examples : 示例代码
  • include: 包含C/C++的头文件
  • lib: 相关SDK库文件

编译

设置环境变量

export LD_LIBRARY_PATH=lib/

image.png

编译

gcc examples/tts_sample_c.c -L lib/ -lbabel_cpp_tts  -I include/ -o tts

image.png

运行

启动软件,这里需要用使用在声智官网申请到的AppIdSecretKey

./tts AADBaEnNUZBKg0WBT2oIcWp7 So7NTzb3jzsoF0cfLKvHCoyytzo

image.png

输入exit并回车,会自动生成文字转语音的文件sai_openapi_async_tts.mp3
image.png

音频播放,推荐给大家一个非常好用的音频播放工具,安装方式如下

sudo dnf install sox-devel

image.png

到这里输入y,确认安装
image.png

到这里音频播放工具就安装完成了。

使用alsamixer命令可以选择音频播放设备、调节音量
image.png

image.png

根据提示,按“F6”选择音频播放设备
image.png

这里我们使用的是EAIDK-310自带的3.5mm耳机孔,插普通耳机来听播放的音频,所以这里选择rockchip-rk3328选项
image.png

这里是调节音量选项。
设置完成后,点击“Esc”键退出设置。

设置好音频播放参数后,然后就可以使用play命令播放生成的.mp3文件了
image.png

可以听到,这里音频播放的内容,即examples/tts_sample_c.c示例代码中的文字内容,自己也可以自定义修改里面的文字内容,包括英文单词等,对比语音合成效果。
image.png

除了文字内容以外,也可以在示例代码中修改语音类型、语速、语调、音量等参数
image.png

总结

以上基于EAIDK-310的语音识别、自然语言处理、语音合成案例都是基于声智在线语音SDK来实现的,需要设备联网才能得到结果。通过本章内容,希望能够让开发者在EAIDK平台上快速体验智能语音功能效果,为大家做智能语音相关的应用开发提供参考。

如有疑问或想要了解更多关于EAIDK开发平台方面的内容,欢迎加入EAIDK开发者大本营参与互动讨论,QQ群:625546458。
image.png

更多EAIDK相关阅读:

基于EAIDK-310和SoundAI Azero的语音交互系统
基于EAIDK的人脸算法应用(一)
基于EAIDK的人脸算法应用-源码解读(二)
基于EAIDK-310的传感器调试案例介绍(一)
基于EAIDK-310的传感器调试案例介绍(二)
如何使用EAIDK-310的GPIO点亮小灯泡
推荐阅读
关注数
3510
内容数
57
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息