最近Alexa比较热门,为了深入一点理解这项新技术的工作原理,下载了相关的sdk源码准备在电脑上运行一下。我的平台是macOS,按照说明一步一步下来,遇到了一些问题,由于缺少说明,只好自己摸索,有时候没有时间搞就放下,到了今天,终于把所有难关通过,Alexa的基本功能已经出来了。在高兴之余,觉得有必要把这个过程遇到的问题记录下来,这样以后遇到这个问题也比较好回忆,也希望能对别人有所启发。
问题一:gstreamer路径找不到
在执行
cd ~/sdk-folder/sdk-build && cmake /Users/huziqin/sdk-folder/sdk-source/avs-device-sdk -DGSTREAMER_MEDIA_PLAYER=ON -DPORTAUDIO=ON -DPORTAUDIO_LIB_PATH=/Users/huziqin/sdk-folder/third-party/portaudio/lib/.libs/libportaudio.a -DPORTAUDIO_INCLUDE_DIR=/Users/huziqin/sdk-folder/third-party/portaudio/include
这一条命令主要是利用cmake这个工具生成项目的makefile文件,但当我运行的时候会报错,就是这样:
– Found PkgConfig: /opt/local/bin/pkg-config (found version “0.29.2”)
– Checking for modules ‘gstreamer-1.0>=1.8;gstreamer-app-1.0>=1.8’
– No package ‘gstreamer-1.0’ found
– No package ‘gstreamer-app-1.0’ found
这个意思就是没有找到gstreamer,但我实际上是通过homebrew安装过的,原因有可能是因为cmake没有办法找得到相应的路径,于是我手动告诉cmake路径,这样就可以了,具体的命令就是:
$ export PKG_CONFIG_PATH=”/usr/local/Cellar/gstreamer/1.12.4/lib/pkgconfig/:/usr/local/Cellar/gst-plugins-base/1.12.4_1/lib/pkgconfig/”
其中对应的路径是实际上的.pc文件所在的路径,我是通过使用find命令查找到的。通过这条命令,会输出一个环境变量PKG_CONFIG_PATH,然后在执行cmake的时候会查看这个变量,这样就能找到了。而.pc文件是用来描述相应的模块的信息,比如它的头文件路径。
问题二:找不到glib.h路径
是的,虽然通过了cmake,但在编译的时候,还是会报错,具体原因还不知道,但我想到一个变通的办法,就是直接指定文件的路径。不过这次要修改的是Mediaplayer/src/下面的CMakelist.txt,cmake就是根据这个文件来产生相应的makefile文件.修改的方法是在这个文件中包含缺少的目录路径,然后重新调用cmake命令生成makefile文件。
include_directories(“/usr/local/Cellar/glib/2.54.3/include/glib-2.0/”)
include_directories(“/usr/local/Cellar//glib/2.54.3/lib/glib-2.0/include/”)
就是这样,就可以找到,通过编译了。
glib是gun开源软件用到的一个基础库,在gstreamer里面也需要链接这个库。
问题3: 编译通过了,运行时报错
这个问题是耗时最长的,直到有一天我突然想到,也许跟我的编译环境有关。
当时报错的提示是:
$ alexac
2018-02-24 12:26:17.144 [ 1] I sdkVersion: 1.5.0
(process:10547): GLib-CRITICAL **: g_datalist_id_dup_data: assertion ‘key_id != 0’ failed
(process:10547): GLib-CRITICAL **: g_datalist_id_set_data_full: assertion ‘key_id > 0’ failed
(process:10547): GLib-GObject-CRITICAL **: g_param_spec_pool_lookup: assertion ‘pool != NULL’ failed
(process:10547): GLib-GObject-WARNING **: g_object_set_valist: object class ‘(null)’ has no property named ‘silent’
(process:10547): GLib-CRITICAL **: g_datalist_id_dup_data: assertion ‘key_id != 0’ failed
(process:10547): GLib-CRITICAL **: g_datalist_id_set_data_full: assertion ‘key_id > 0’ failed
(process:10547): GLib-GObject-CRITICAL **: g_param_spec_pool_lookup: assertion ‘pool != NULL’ failed
(process:10547): GLib-GObject-WARNING **: g_object_set_valist: object class ‘(null)’ has no property named ‘sync’
对于这样的错误提示,去网上查找,基本上找不到什么有用的解决方案。
后来我开始想,会不会是因为有一些同名的gcc,或者类似的一些用来编译的工具相互之间有冲突呢?因为我用来开发的这个系统之前也用来开发其他项目,比如为了开发安卓,安装过安卓的sdk,然后也安装过macport用来编译安卓系统软件,为了运行机器学习的软件也装了一些相关的工具,然后现在为了调试Alexa,也装了homebrew。然后我了解到macport和homebrew功能类似但是互不兼容。所以我的办法是删除掉macport,把其他不用的开发工具不要导入到PATH变量中,只把最必要的路径保留下来。
经过一番修改,最终path变成这样:
/usr/local/opt/curl/bin:/Users/huziqin/miniconda3/bin:/Library/Developer/CommandLineTools/usr/bin/:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/Wireshark.app/Contents/MacOS
这就比原来简单多了,不存在重复的工具。
然后我重新编译,就不会再出现这种运行时的错误了。
问题4:无法获取token
就是运行:
cd ~/sdk-folder/sdk-build && python AuthServer/AuthServer.py
显示连接不上,但又不提示是哪里造成的问题,检查AlexaClientSDKConfig.json文件是没有问题的,后来发现是在开发者终端上面配置Alexa产品时没有设置正确。也就是漏掉了下面这一步:
因为这里是配置本地的服务器的端口,这里没有配置就会无法获取到token。
当然,真正的原因我还是有些不明白,为什么Alexa运行需要在本地产生一个web server,不是可以直接连接amazon的server吗?还是说仅仅是产生token的时候才需要在本地运行一个server呢?是不是时为了方便调试才需要在本地运行一个server来进行认证?这些疑问就等待以后进一步研究吧。