第二期【百度大脑新品体验】语音套件之交叉编译
goJhou 发布于2019-05-09 13:06 浏览:1064 回复:3
0
收藏
最后编辑于2019-06-01

经过了7天的新品体验,我从开箱、hello world、交叉编译三方面已经写下了3篇文章,欢迎各位来阅~

第二期【百度大脑新品体验】远场语音识别套件之开箱

> http://ai.baidu.com/forum/topic/show/943766

第二期【百度大脑新品体验】远场语音识别套件之hello world(mac篇)

> http://ai.baidu.com/forum/topic/show/943770

第二期【百度大脑新品体验】远场语音识别套件之交叉编译SampleCode

> http://ai.baidu.com/forum/topic/show/943771

 

第二期【百度大脑新品体验】远场语音识别套件之交叉编译SampleCode

 

经过了近一周的努力,总算能够成功地将sample程序成功的交叉编译出来了。

本篇只针对如何成功交叉编译,解决我遇到的问题而设立的。重点是交叉编译的流程

这边我在mac上利用parallel部署了ubuntu虚拟机。为了重新确认一遍步骤,我重新装了一台机器并重头进行了一遍步骤。并故意重现了我这几天碰到过的错误及解决办法,可能可以帮助到各位。

这边需要以下内容:

  • rk3308的交叉编译工具链
  • gcc环境
  • ubuntu16.04 lts版

 

下载SDK

将rk3308板子内的oem内BDSpeechSDK目录复制到虚拟机内。可以进行adb pull /oem/BDSpeechSDK指令download下来

随后将sdk放到虚拟机。我这里就直接放在了home根目录

 

下载交叉工具链

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天来的努力成果,如果这篇文章对你有所帮助,请给一个赞吧~

收藏
点赞
0
个赞
共3条回复 最后由goJhou回复于2019-06-01 23:31
#4goJhou回复于2019-06-01 23:31:25
#3 花之语冬春风寒回复
请问交叉编译链工具是怎么弄的?

新贴子里我把下载链接放出来了喔。可以去最新的那个里下载

0
#3花之语冬春风寒回复于2019-06-01 11:06:44

请问交叉编译链工具是怎么弄的?

0
#2wangwei8638回复于2019-05-11 09:28:45

专业,赞!

0
TOP
切换版块