我在过去和百度语音打交道的这些日子,曾遇到过很多问题,比如识别慢、精度差。自身原因和设备原因太多,举步艰难。我觉得一个非音频内行的人很难进一步提升在这一块的性能与质量。
但现在,百度语音正不断地完善,已经推出多种我非常适用的新东西,例如:
上个月刚上线的 百度语音识别极速版
传送门> http://ai.baidu.com/forum/topic/show/943032
该项能力经我自己特定样本测试,可以提高识别速度约3~9倍,在上侧传送门的测试样例中,最慢的普通版和最快的极速版耗时甚至相差24倍,可见该极速版,可谓是目前普通版的最佳替代方案了!
这次我将为各位带来的百度开发套件的新星啦
远场语音开发套件!
传送门> https://aim.baidu.com/product/b226a947-4660-4e27-83b4-877bf63b8627
这是一款很不错的产品,就像之前的人脸开发套件一样,他能有效帮助想要落地语音识别的企业和个人开发者们快速开发出属于自己的业务产品。
在本次产品的规格中,有三种配置可选,依次是:
6+1环形麦阵列
4mic线性阵列
3mic三角阵列
他们各有各的应用场景,为了更好地提升各位未来的产品,一定要听我说完他们的优点喔!
6+1环麦阵列
6+1环形阵列由6颗麦克风围绕一圈,中间分布一颗组成,可实现:
360°零死角环绕声场
增强GSC声源定位及波束形成效果
基于非线性消除的AEC技术
推荐用于智能音箱等智能家居产品。
像现在主流的天猫精灵、小米音箱,都是采用的环形6麦阵列喔!
还有像国外的amazon echo 采用了类似解决方案
他可以做到无死角的识别和声源定位喔!这还是值得玩一玩的~
线性4麦阵列
4mic阵列由4颗麦克风横向排列
阵型狭长占用空间小,可适配各种硬件结构设计。
推荐应用于智能电视、平板、以及空调、冰箱等传统白电产品。
三角麦克阵列
3mic阵列是由3颗麦克风三角形方式排列
支持双音区,兼顾主/副驾的语音交互需求
增强GSC声源定位及波束形成效果
基于非线性消除的AEC技术
3mic也支持声源定位喔
本次我所收到的是4mic阵列套件呢。他也是带有声源定位的哦~
废话不多说,开箱开始!
首先这次开发套件的外包装精致小巧,方方正正的外包装有种扑面而来的低调奢华与神秘感,不知道各位有没有看过四驱兄弟呢?
真是侧漏着一股神秘的气息呢!揭开它的面纱,看看里面吧
包装盒内非常简单明了,一张3折页,简单的说明书,开发套件本尊及数据线和电源线。
说明书简单介绍了包装内容清单、开发板的接口示意图、硬件连接指南、测试方式和软件开发环境搭建引导,比较简单。
我们来看一下开发套件本身吧,本套件使用的开发板是来自深圳市百能达电子有限公司和百度联手打造的RK3308开发板,拥有128M的ram和128M的flash。cpu采用的是微芯瑞的rk3308,4核ARM Cortex-A35。
wifi方面仅支持2.4g频段,蓝牙支持到4.0。
在本套件上额外有一片wifi天线,所以wifi质量杠杠的。
麦克风可兼容上方的3种阵列。
数据线是usb-micro,主要用于adb调试。
所配套的是输出为12V2A的电源。
远场语音识别套件之hello world(mac篇)
点亮设备,插上usb线,我们即将进入环境配置阶段。
本篇使用macOS majave 10.14.4做演示。
插入设备前,应当保证自己的系统内具备adb环境。在terminal内确认一下
至于如何安装,可参考百度搜索下的各种adb部署文章~
然后我们第一步首先要帮助开发套件连接到我们的wifi中来。
根据《百度大脑-远场语音开发套件-RK3308开发平台使用说明.pdf》中所提到的wifi配置,可以顺利完成入网。这里我做一遍操作
使用数据线连接设备后,我们可以用
adb devices命令查询到开发套件
随后键入 adb shell,使用命令行调试设备
cd /data/cfg 进入到wifi配置文件的目录下
通过vi命令打开配置文件
默认情况下家用路由器的话,只需要修改ssid(wifi名称)和psk(password key)即可。
若wifi有特殊情况,自行添加
key_mgmt=WPA-PSK // 加密方式 # key_mgmt=NONE // 不加密
修改完成后保存配置
随后输入
wpa_cli reconfigure wpa_cli reconnect
指令激活重新联网
此时此刻,我们就完成了设备入网了。
语音识别、合成都需要用到网络,所以一定要正确入网喔!
(蓝牙我目前用不到,所以暂时没有继续去配置)
接着我们来尝试启动语音识别的demo程序,来看一看环境是否正常
所有sdk资源及相关文件都在根目录oem文件夹内
根据产品说明书,我们需要先启动 alsa_audio_main_service服务。
启动它之前,我们需要对目录权限进行相关修改赋予权限后进行启动
multi_4_2 指的是使用4阵列板声卡2。&后台启动
然后使用 ps -A检查一下服务是否正确启动在后台中
启动了alsa服务后,我们就可以去前往中启动demo了
样例程序文件位于/oem/BDSpeechSDK/sample目录中, 运行时依赖lib、resources、extern目录中的库及资源文件。
所以我们需要在启动时共享库
关于共享库可以看这里
神奇传送门> https://www.cnblogs.com/mylinux/p/4955448.html
我们运行指令
cd /oem/BDSpeechSDK/sample/wakeup LD_LIBRARY_PATH=/oem ./e2e_wp_asr_test
试着喊一下”小度小度,今天天气怎么样”试试?
可以发现,这次套件采用了流式识别喔!附带中间结果的!
并且在3米远的位置,使用悄悄话的方式呼唤小度小度,也能成功唤醒!
可能在英语方面还有待加强吧~
(也许是我的英语太散装了)
关于语音合成
示例程序会将文本“456hello你好今天天气不错”传送给服务器,由服务器生成对应的语音,保存为pcm文件,用户可以进行播放体验。
在终端启动语音合成功能,生成文本“456hello你好今天天气不错”对应的语音。
cd /oem/BDSpeechSDK/sample/tts LD_LIBRARY_PATH=/oem ./online_test
测试程序暂未提供用户传入合成文本生成语音的功能,用户可以参照样例程序自行开发。
运行结束后,会在当前目录下生成一个xxx.pcm,其中xxx是一个测试时的时间戳.在终端执行如下命令体验语音合成效果
aplay -t raw -c 1 -f S16_LE -r 16000 xxx.pcm
远场语音识别套件之交叉编译SampleCode
经过了近一周的努力,总算能够成功地将sample程序成功的交叉编译出来了。
本篇只针对如何成功交叉编译,解决我遇到的问题而设立的。重点是交叉编译的流程
这边我在mac上利用parallel部署了ubuntu虚拟机。为了重新确认一遍步骤,我重新装了一台机器并重头进行了一遍步骤。并故意重现了我这几天碰到过的错误及解决办法,可能可以帮助到各位。
这边需要以下内容:
- rk3308的交叉编译工具链
- gcc环境
- ubuntu16.04 lts版
下载SDK
将rk3308板子内的oem内BDSpeechSDK目录复制到虚拟机内。可以进行adb pull /oem/BDSpeechSDK指令download下来
随后将sdk放到虚拟机。我这里就直接放在了home根目录
下载交叉工具链
链接: https://pan.baidu.com/s/1lEuFlAqfxhAsMQGmFJswTA 提取码: we2t
rk3308的编译在标准linux上是编不出来的。我们这里需要用到交叉编译工具链,这是一个特殊的编译器,可以认为是在A平台编译出B平台才能运行的工具包。
然后将交叉编译链也复制到虚拟机里
按要求构建项目工程目录结构
基于目前创建日期为4月23日的quick_start.md中所述
mkdir my_specch_project cd my_speech_projects touch Makefile mkdir src touch src/main.cpp
创建如下的目录结构:
my_speech_project/
├── Makefile
└── src
└── main.cpp
我们到sample目录下,创建project文件夹并创建src目录,创建指定的文件
编写(copy) sample代码
sample/asr/wakeup/src中的e2e_wp_asr_test.cpp和在quick_start.md中都有相应的demo代码,这里我就直接将wakeup/src中的sample代码拷贝到这里替换main.cpp
这里先不做任何改动,就照搬就行。目前的第一目的是尽快正确交叉编译并成功在板子上跑起来
编写(copy) Makefile代码
makefile可以帮助工程快速连接编译,他能省掉很多功夫。由于本人不是纯正的c++开发工程师,所以这里copy了quick_start.md中的makefile代码
#make src=src/***.cpp FILE_NAME=$(src) SYS_ROOT=$(sr) TARGET=$(basename $(notdir $(FILE_NAME))) #build CXX=arm-rockchip-linux-gnueabihf-g++ INCLUDE=-I../../include -I../../include/ASR -I../../include/TTS -I../../extern/include -I../../extern/include/longconnect CPPFLAGS=-Wall -fopenmp -O2 -fPIC -g -D__LINUX__ -Wl,-rpath=../../lib,--disable-new-dtags,--copy-dt-needed-entries -Wl,-rpath=../../extern/lib,--disable-new-dtags -L../../lib -lBDSpeechSDK -L../../extern/lib -lzlog -llongconnect -lnghttp2 -lcurl -lssl -lcrypto -lz -lAudioEncoder -liconv -lAudioDecoder -lhttpDNS -lbd_alsa_audio_client -lgomp -lrt -ldl -lpthread ifneq ($(strip $(SYS_ROOT)),) MY_SYS_ROOT=--sysroot=$(SYS_ROOT) endif SRC_PATH=./src SRC_FILE=$(shell cd $(SRC_PATH)&&echo *.cpp) SRC=$(foreach n,$(SRC_FILE),$(SRC_PATH)/$(n)) $(TARGET):$(SRC) $(CXX) -o $(TARGET) ./$(FILE_NAME) $(MY_SYS_ROOT) $(INCLUDE) $(CPPFLAGS) #clean LIST_ALL_FILES=$(shell find . -maxdepth 1) SOURCES=. ./Makefile ./src RM_FILES=$(filter-out $(SOURCES),$(LIST_ALL_FILES)) clean: -rm -rf $(RM_FILES)
这里容易出现的第一个问题:
照搬后由于缩进,当你ctrlCV时,极有可能将缩进一起复制过来,所以这里需要将代码缩进都去除,保持整洁。在后面编译时我会演示出现缩进的错误提示,这里我继续保持原有的格式。
尝试编译
在quick_start.md中编译部分,要求我们配置完成后,在Makefile所在的目录执行
export PATH=path-to-cross-compiler-root/host/bin:$PATH make FILE_NAME=src/main.cpp SYS_ROOT=path-to-cross-compiler-root/host/arm-rockchip-linux-gnueabihf/sysroot
这里 path-to-cross-compiler-root需要替换成我们工具链的根目录/bin即可
/host其实就是我们工具链的根目录
那在我这样的目录环境,等效替换成了
export PATH=/home/parallels/rk3308_arm_tool_chain/bin:$PATH make FILE_NAME=src/main.cpp SYS_ROOT=/home/parallels/rk3308_arm_tool_chain/arm-rockchip-linux-gnueabihf/sysroot
这里会出现很多问题。如果上方的操作跟我一样,那你也很有可能碰到这些问题!
错误1. Makefile:18
由于特殊缩进导致的makefile编译错误
错误具体提示如下
经过我多次测试,我打了很多空行也会错在第18行这里。后来解决的方法就是将缩进全部去除就可以了!
错误2.undefined reference
消除了上方的缩进后再次进行编译,会出现新的提示:
这个错误是因为缺少alsa的so库导致的。这个错误也被写在了quick_start.md中
如果遇到类似 ld: 找不到 -lbd_alsa_audio_client的错误,请开发者自行从官网下载alsa服务包或自行从开发套件中/ome/目录下提取相关库放到工程下参与链接即可。
这边我们从oem目录中pull一个文件下来。他在/oem目录下,名为libbd_alsa_audio_client.so。将它复制到BDSpeechSDK/lib下,这个目录专门放外部依赖的库文件,这个也放这里吧。
然后再次尝试编译,没有任何错误提示了,编译通过
然后在Makefile的同目录上就可以看到一个main的可执行程序了。这个程序是可以在rk3308的环境下执行的。将它通过adb放到板子里。这里提醒下,tmp目录在断电后会清洗。
(这里省略adb push ./main /tmp的过程)
尝试adb下打开main
我们的main也依赖于alsa的服务,所以在这里直接将alsa设置成开机启动得了。
/oem/Rklunch.sh 这个文件就是rk3308板子开机后会跑的一个执行文件,我们可以把所有需要在开机时启动的东西,都写在这个文件里,这样板子下次就会帮我们自动启动alsa了
这里新增了几行代码,主要是改一下目录权限,然后运行alsa服务
但是这一次还是没有启动的,需要自己手动启动一下alsa。启动方式就是上面5句话。
这里也可以通过reboot指令重启板子,但是tmp刚放进来的main文件就被洗掉了,但可以检验开机启动是否正常,这个自行权衡吧~
启动alsa后我们去启动main
cd /tmp/ LD_LIBRARY_PATH=/oem:/oem/BDSpeechSDK/lib:/oem/BDSpeechSDK/extern/lib ./main
如果看到这个输出,那么我们离成功不远了。但是其中有一句输出影响了整个程序。这不是编译问题!
错误3. dat file invalid
error:5, domain:38, desc:Wakeup: dat file invalid., sn:
这里意思是没成功载入dat文件。
我们看一下代码。在wakeup_config函数中,可以看到它配置dat文件的路径,是../../resources/esis_resource.pkg
只要把这个层级改成绝对路径,或者把路径改短 ./esis_resource.pkg,并把pkg文件拷贝过来即可
然后重新编译,adb push到tmp下,这里省略
记得把dat文件也push到tmp下,如果跟我的改法一样的话
然后再次执行main
可以发现唤醒进入回调激活了引擎加载和启动唤醒。
我们这时候可以尝试使用了.
小度小度,今天上海天气如何?
至此已经完成了demo项目工程的交叉编译工作。
这只是默认sample程序编译出来的效果喔,还有很多隐藏功能带解锁。
这是我7天来的努力成果,如果这篇文章对你有所帮助,请给一个赞吧~
作者:周施乐