用”树莓派”打造一款智能音响—-“什么值得买”原创文章搬运



  • 作者:囧小平

    本文首发于国内第一大剁手网站“什么值得买”。主要记录了我折腾叮当的过程中一些心得体会,或许对其他人有些帮助。我直接把网页转成MarkDown并稍加修改后发于本论坛,供各位叮当爱好者参考和交流。由于内容没有二次润色,所以部分措辞可能有些不当,大家可以选择性阅读。以下是是几乎没有修改过的原文。

    前言

    犹豫了很久这篇文章要不要发,原因有以下几个方面:

    1. 体验一般:用树莓派自己打造一款智能音箱,或许在一些人看来似乎是一件值得折腾的,比较好玩的事情。但是实际做下来之后会发现,这款"智能音箱"的效果和体验也许会跟理想中的产品有不小的差距。

    2. 门槛较高:基于这款基于树莓派的智能音箱,利用了一些开源项目。虽然有比较详细的教程指导玩家怎么一步一步去安装,怎么去使用。但是在安装和使用的过程中难免遇到各种问题,这就需要玩家有一定的Linux基础和编程基础,否则很难快速定位和解决问题。

    3. 资源不够丰富:目前这个智能音箱还处于开发阶段,能够提供的资源和功能,比如电台、音乐、故事、儿歌、相声等,还不够丰富和强大,况且没有相关厂商支持,接入资源和实现功能都有一定的难度。

    4. 价格无优势:本来觉得自己用树莓派做一个,虽然效果欠佳,那么整体成本总该能控制了吧。遗憾的是,由于树莓派加上其必备配件(比如SD卡,外壳、散热等)的价格已经比较高了,再加上做智能音箱购置的其他外设(比如蓝牙音箱麦克风)的成本,算下来跟市面上已售的一些国产智能音箱相比,几乎没有什么优势,更别提价格杀手--"小米"了。当然这个价格无优势的前提是只用树莓派做智能音箱一种应用。如果你同时跑了其他应用,充分利用树莓派的资源和性能,那么这个价格优势就有可能反转了。

    所以,用树莓派打造的这款智能音箱,即智障,又迟钝,还不时地傲娇,一般人可能还不好驾驭,价格呢也没什么优势。那我为什么犹豫了一圈还是把文章发了呢,主要是基于以下几个原因。

    1. 具有一定可用性:如果把这个用树莓派打造的智能音箱用产品的角度去评判,确实缺点不少。但是如果把它当作一个实验性的玩物,降低评判标准,那么这个"智障音箱"还是具有相当的可用性的。况且即使是已经在售的那几款智能音箱,在某些方面多多少少也是有瑕疵的。

    2. 开源项目潜力大:这个智能音箱是基于开源项目,硬件方案和软件代码都是开放的。开源的好处就是众人拾柴火焰高。所以即使现在这个智能音箱有很多残缺和不足,但是通过开发者们的努力,经过几个版本的迭代,一定会向着更好用、更易用、更好玩的方向发展。

    3. 可定制化强:这个智能音箱代码的可扩展性很好,只要是技术上是可行的,哪怕是用一些黑科技,想要的功能都可以加上去。当然目前各大厂商的智能音箱也都面向开发者陆续推出了自己的开放平台,但是其开放程度显然无法和源码完全开放的开源项目相比。

    4. 普通人仍然可玩:虽说玩转这个项目有较高的技术门槛,但是如果认真阅读项目文档,即使是零基础的玩家,依然可以把这个智能音箱用起来的。

    5. 树莓派不再吃灰:我想有不少值友都拥有一块树莓派,或许它已经吃灰了。那么你看完这篇文章,可能会觉得这个项目还是比较有意思、有挑战的,如果你感兴趣的话,你的树莓派就不用再吃灰了。同时,我想有不少人应该和我一样,喜欢折腾些有意思的东西,那么这个项目或许值得折腾。

    6. 吸引开发者:目前这个智能音箱项目用户也不少,但是开发者我感觉比较少。如果这篇文章发出去了,利用张大妈的影响力能够吸引更多对这个项目感兴趣的开发者,那么我也算为这个项目做了点贡献了。

    好了,发的理由比不发的多,而且我在犹豫的时候其实也写了六七千字了,不想白写。所以不管效果如何我还是发了。大不了,权当一篇科普文了。。。。

    1 序章

    上面说了一堆废话,主要是防止被喷。下面开始正题。

    什么是智能音箱呢?智能音箱,是一个音箱升级的产物,是家庭消费者用语音进行上网的一个工具,比如点播歌曲、播报新闻、或是了解天气预报,它也可以对智能家居设备进行控制,比如打开窗帘、设置冰箱温度、提前让热水器升温等。

    智能音箱这个产品最近在国内比较火,陆续有多款产品集中上市,价位从几百到上千不等,站内也有多款产品的使用测评。国外的代表产品有亚马逊Echo和谷歌的Home,但是由于语言和GFW的原因,这些产品难免在中国大陆市场水土不服。国内的代表产品有:讯飞X京东的叮咚、天猫精灵X1、迷之定价的Rokid若琪、价格屠夫小米AI音箱小爱同学、Tichome问问音箱等等。不少产品站内也有不少较为详细的体验和测评。可见智能音箱这个硬件,无论市场上是否能接受和流行,但从厂商的角度,确确实实是火了一把。

    我前一段时间,刚用树莓派折腾了一个家庭环境监测系统,见下面的链接。这个系统跑得还算稳定,想要的功能基本都实现了。

    正愁没有新的东西可以玩呢。然后我就发现了一个极好的基于树莓派的中文智能音箱开源项目。 这个项目就是我们今天的主角叮当-dingdang-robot

    叮当是一款可以工作在 Raspberry Pi上的开源中文语音对话机器人/智能音箱项目,目的是让中国的Hacker们也能快速打造个性化的智能音箱。

    叮当包括以下诸多特性:

    1.模块化。功能插件、语音识别、语音合成、对话机器人都做到了高度模块化,第三方插件单独维护,方便继承和开发自己的插件。

    2.微信接入。支持接入微信,并通过微信远程操控自己家中的设备。

    3.中文支持。集成百度、科大讯飞、阿里等多家中文语音识别和语音合成技术,且可以继续扩展。

    4.对话机器人支持。支持接入图灵机器人、Emotibot,未来还将支持接入更多机器人。

    5.全局监听,离线唤醒。支持无接触地离线语音指令唤醒。

    6.灵活可配置。支持定制机器人名字,支持选择语音识别和合成的插件。

    7.智能家居。集成 HomeAssistant 插件,支持语音控制智能家电。

    上面引用中的内容是项目主页上叮当的介绍和主要特性。叮当的主要作者是wzpan。我也稍微提交了一点代码和几个插件,算是做了微小的贡献。

    说到叮当就不得不提jasper-client。Jasper是一套基于Python开发的语音控制框架,代码结构清晰、文档丰富、注释详细、可定制化程度高,使得开发者在此基础上进行二次开发变得容易。其作者是Shubhro SahaCharles Marsh 和Jan Holthuis,在此感谢他们。但是还是由于语言和GFW的原因,Jasper并不适合国人直接使用。

    叮当就是在Jasper的基础上进行了大量本土化工作,加入了很多适合国内环境和国人的功能和模块,优化了代码流程,提高程序的稳定性,并撰写了极其详尽的文档,大大降低了玩家的安装和使用的门槛。具体的特性上文的引用中都有涉及。在此感谢wzpan同学辛勤且出色的工作。

    目前项目处于开发阶段,未来肯定会有更多好玩好用的功能加入。下面将会一步一步介绍怎么搭建起这个基于树莓派的智能音箱。由于篇幅限制以及项目wiki已经足够详细的原因,所以下文中很多步骤将直接给出链接,尽量不在本文中重复贴出,但是我会在需要的时候给出解释和说明。

    2 硬件准备

    一款智能音箱是由三个最基本的部件组成的,分别是:大脑、耳朵、嘴巴。大脑就是主机用来计算,耳朵就是麦克风用来聆听,嘴巴就是音响用来说话。

    这部分更详细的内容可参考这里

    2.1 主机

    叮当是基于Python开发的,所使用的依赖都是在Linux环境下的。所以任何一款基于Linux的电脑(理论上Mac也是可以的)经过正确的配置并解决依赖问题,都是可以正常运行叮当的。为了小型化的目的,你当然可以选择树莓派、荔枝派、NanoPi、香蕉派、香橙派等等。但是,这里仍然推荐使用树莓派3B并安装Raspbian jessie系统,目前的项目文档基本也是基于树莓派3B这个硬件和Raspbian jessie这个系统,可以避免配置上的遇到的坑,节省不少时间。当然,如果你是经验丰富的老司机,那么请尽管随意折腾任何硬件或系统。至于怎么选择SD卡,怎么安装系统,怎么SSH,怎么远程桌面等等,诸如此类树莓派使用过程中很基本的内容,本文就不赘述了,写这些有点浪费篇幅了。下面的教程默认使用树莓派3B并安装了Raspbian jessie系统。

    2.2 麦克风

    麦克风是智能音箱的耳朵,耳朵灵不灵光对智能音箱体验的好坏影响非常大。毕竟麦克风是智能音箱接收用户声音输入的唯一通道,听不到或者听错了,都会让人觉得这个智能音箱一点都不智能了。对麦克风来说,比较重要的几个指标有拾音距离、回声消除、拾音角度、灵敏度等。具体怎么选择呢,不用多说,当然越好的当然越贵了。这里给大家推荐两类比较常用的麦克风:

    2.2.1 PlayStation Eye

    没想到PS3时代淘汰下来的洋垃圾这时候成了廉价又可用的宝贝了。Playstation Eye是PS3主机上搭配PS Move玩体感游戏的,自带麦克风和摄像头,只占用一个USB接口。花一份钱,买两样东西,而且价格竟然只有惊人的一顿饭钱--26块钱,你没看错,一顿饭钱,还包邮。至于使用效果呢,总结下来还是可用的。麦克风在没那么嘈杂的环境下,三米以外也能获得不错的拾音效果。摄像头分辨率确实不高,只有640×480,但是帧数比较高,一般使用也足够了。毕竟价格便宜,还要什么自行车。

    这里附上链接,找销量最高的那个就对了,别买贵了。我本人使用的也是这款,下面的配置也会按照这个硬件做示例。

     2.2.2 ReSpeaker 2 Mics Pi HAT

    ReSpeaker 2 Mics Pi HAT是专门为树莓派打造的 2 阵列开发板,带 2 Mic 阵列,有声卡,支持外接 3.5mm 音频输出。我本人没用过,效果应该比上面那个好一些,也可能效果跟Playstation Eye没什么差别。缺点呢是会占用树莓派的GPIO,所以购买前要想清楚了。同时,这个HAT配置起来也要比直接插USB的Playstation Eye要繁琐一些,需要自己安装驱动。

    这里给出链接,好像这东西销量不太高。。。 我没有用过这款,想了解ReSpeaker怎么配置可以参考这个连接

    2.3 音响

    作为嘴巴的音箱选择还是相对比较随意的,但是不推荐使用蓝牙音箱,因为配置起来比较麻烦。推荐使用任意3.5mm接口的并有独立供电的音响作为声音输出。不过我之前在淘宝上搜索过,独立供电的音箱体积普遍比较大。我们用树莓派DIY智能音箱,还是希望体积能控制在一个比较小的尺寸内。市面上体积小的音箱都是蓝牙音响,还好这些音箱大部分都是支持3.5mm接口的。但是为了避免频繁充电,要么买个续航时间长一点的,要么就把音箱一直连接充电器充电。我经过对比筛选,最终选择了这一款。突然发现降价了,比我买的时候还便宜了。。。感觉亏了1个亿。。。 别看价格便宜,这个音箱做工和外观都还不错,音质什么的本来也没有太高要求的。

    2.4 硬件配置与测试

    目前,我们已经有了一个装好系统的大脑:树莓派3B,一个超便宜超实惠的耳朵:Playstation Eye,以及一个小巧可爱的嘴巴:海威特M13,剩下的要做的就是配置和测试,看看我们的耳朵能不能听得到,嘴巴能不能讲话。

    2.4.1 摄像头-Playstation Eye

    把Playstation Eye的USB接口插到树莓派上,使用如下命令,结果显示的是当前所有可用的麦克风设备:

    pi@raspberrypi:~ $ arecord -l
    
    **** List of CAPTURE Hardware Devices ****
    
    card 1: CameraB409241 [USB Camera-B4.09.24.1], device 0: USB Audio [USB Audio]
    
      Subdevices: 1/1
    
      Subdevice #0: subdevice #0
    

    可以看到我们的Playstation Eye录音设备的声卡卡号"card 1"和设备编号"device 0",把他们记下来。

    2.4.2 音箱-海威特M13

    把音箱插到树莓派的3.5mm接口上,使用如下命令,结果显示的是当前所有可用的音频输出设备:

    pi@raspberrypi:~ $ aplay -l
    
    **** List of PLAYBACK Hardware Devices ****
    
    card 0: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
    
      Subdevices: 8/8
    
      Subdevice #0: subdevice #0
    
      Subdevice #1: subdevice #1
    
      Subdevice #2: subdevice #2
    
      Subdevice #3: subdevice #3
    
      Subdevice #4: subdevice #4
    
      Subdevice #5: subdevice #5
    
      Subdevice #6: subdevice #6
    
      Subdevice #7: subdevice #7
    
    card 0: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
    
      Subdevices: 1/1
    
      Subdevice #0: subdevice #0
    

     card 0是树莓派自带的声卡,3.5mm接口的音箱设备,也就是我插的这个音箱,用的是这个声卡,其设备编号为device 0。 device 1则是HDMI的音频输出用到的,这里可以忽略。如果你用具有声音输出的HDMI显示设备,那么可能就需要关注这个device 1了。

    2.4.3 配置:

    新建文件/home/pi/.asoundrc :

    nano /home/pi/.asoundrc

    如果你用的硬件和我的一模一样,则将下面的配置写入文件中

    pcm.!default {
    
            type asym
    
                playback.pcm {
    
                    type plug
    
                    slave.pcm “hw:0,0”
    
                }
    
                capture.pcm {
    
                    type plug
    
                    slave.pcm “hw:1,0”
    
                }
    
    }
    
    ctl.!default {
    
            type hw
    
            card 2
    
    }
    

    这个配置文件配置好后,程序就知道应该从哪个设备发声,从哪个设备接收声音了。如果你使用了其他硬件,详细的配置可以参考本章开始给出的链接

    2.4.4 测试:

    配置完毕后,测试一下,需要声音输入和声音输出是否正常。

    执行以下命令,执行的时候吼几嗓子

    arecord -d 3 temp.wav
    

    执行以下命令,看看你的能不能听到你自己的咆哮

    aplay temp.wav
    

    以上过程中有任何错误,请仔细检查自己的硬件和配置,并认真阅读本章开始给出的链接。硬件功能正常是使项目正常运行的基础中的基础,所以这里不能有任何差错。下面给个硬件连接完成后的全家福,部分硬件在上一篇文章中也有出镜。黑色的小圆桶是博联的黑豆,借助于他可以声音控制基于红外遥控的电器。

    3 软件安装

    在讲述软件安装之前,我觉得有必要先讲述一下叮当的基本运行流程,这样可以方便你理解后面安装的步骤和配置的过程。同时这也是目前市面上几乎所有智能音箱产品的运行流程。

    首先,为了方便智能音箱接收用户的指令,智能音箱都会配置一个唤醒词,只有用户呼出唤醒词,智能音箱才会进入等待接受用户语音指令的状态。这样做的目的是防止用户的日常对话被智能音箱识别到,进而可能会引发智能音箱触发由错误语音识别引起的误动作,另外目前大多数智能音箱产品都使用在线语音识别引擎,设定唤醒词可以从某种程度上保护用户的隐私。所以,智能音箱智能音箱最基本的最常用的使用场景应该是这样的:

    如果上面的流程比较抽象,我举一个具体的使用例子,假设我将智能音箱的唤醒词设定为"小囧":

    具体到叮当,他的软件运行流程是这样的:

    所以可以总结出几个关键词:唤醒词、语音识别、语音合成、插件,这几个关键词是理解智能音箱系统运行的核心。下面简单对着几个关键词解释下

    唤醒词:唤醒词是用户设定或者系统内置好的一个词语,比如:"叮咚"、"叮当"、"小爱同学"、"Alexa"等等。前面已经解释过,设定唤醒词的目的是防止日常对话和背景音被智能音箱识别并误触发相应的动作,保护用户隐私。只有通过唤醒词唤醒智能音箱,智能音箱才能根据用户接下来的对话或指令做出反馈。

    语音识别:语音识别简单来讲就是把人的声音识别成硬件可以处理的指令或文字。其实无论是唤醒词还是用户的对话或指令,都是普通的声音输入。然后由于唤醒词识别只有单一一个词或者词组,用户的对话则是长度不定内容不定的句子,所以两者使用的识别技术是不一样的。一般唤醒词的识别使用离线的语音识别引擎,即在本地就能完成语音到文字的转换。而非特定人声的对话由于其识别难度比较大,一般借助于专业的在线语音识别引擎处理,所以语音就会上传到其服务器,处理完毕后把结果通过网络返回到本地。国内

    语音合成:语音合成则是与语音识别相逆的过程,即是把文字转换为语音。智能音箱虽然本质上是个音箱,本职工作就是播放点音乐什么的。但是由于给它冠以了智能的头衔,所以也必须要有一定的人机交互的能力,也就是说,我跟智能音箱说话,它也得回话。比如我问智能音箱:"谁是这世界上最美丽的人",如果这款智能音箱足够聪明的话,它就应该回复说"当然是主人你了"(。。。。。大雾。。。。。)。总之将文字转换为声音,技术上要比语音识别难度要低,主要难点是让转换出来的声音更接近于自然的人声。离线的语音合成也是有的,但是效果就没那么好了。大部分在线语音合成引擎的效果都是可以接受的。

    插件:当智能音箱唤醒之后,用户要下达指令。通过语音识别引擎,将用户的语音指令解析为文字。插件的作用就是,如果解析出来的文字里面有某个关键字,系统就会讲指令交给相应的插件去处理。比如,用户指令里包含"新闻",系统则会将指令交给新闻插件去处理,获取当前新闻后通过语音合成播报给用户。再如,用户指令里包含"音乐",系统则会将指令交给音乐插件去处理,播放用户指定的音乐。

    简单介绍了整个叮当系统运行中所涉及的几个关键词后,下面谈谈怎么安装叮当。

    3.1 方法一:使用安装好的镜像

    这种方法识别小白用户,如果对自己没有什么信心,请选择现成的镜像,可以节省不少折腾的时间。感谢wzpan,这么贴心地帮大家把镜像做好了,下载地址在这里:点我

    具体树莓派怎么烧写镜像就不多说了。虽然小白用户可以直接烧写现成的镜像完成安装,但是我仍建议大家花些时间看一下手动安装的步骤,我觉得你有必要知道你都安装了些什么。

    3.2 方法二:手动安装

    这种方法适合进阶用户,或者之前树莓派上已经部署好一些项目,不想从头再来(比如我)。其实也不用把手动安装想的太复杂,叮当的安装文档相当详细,只要认真阅读,只要有耐心,手动安装并没有太大难度。我花了一个晚上就顺利完成了安装。当然,想顺利安装的前提是使用推荐的树莓派3B和Raspbian jessie系统。另外,由于项目代码一直在更新,功能也一直在丰富,相应的文档也会不断更新,所以每次同步完项目代码后,如果出现什么问题,不妨再去看看项目wiki。

    具体的安装过程可以参考:叮当安装教程。因为链接里面的教程已经相当详细了,请仔细阅读,我这里就不整段贴出来了,只对安装的过程做一些解释和补充。

    3.2.1 基本工具安装

    首先使用下面的命令安装一些基本的工具:

    sudo apt-get update
    sudo apt-get upgrade --yes
    sudo apt-get install sox libsox-fmt-mp3 git-core python-dev bison libasound2-dev libportaudio-dev python-pyaudio libatlas-base-dev python-pymad --yes
    sudo easy_install pip
    

    因为叮当是基于Python开发的,所以这些工具里面包含了一些基本的Python运行叮当需要的软件和工具,同时还包含一些支持播放音频所需要的库文件和工具,当然还包括git用来clone代码。SOX是播放MP3格式音频所用到的工具。TaskWarrior是支持叮当日程提醒功能用到的工具。

    3.2.2 安装叮当项目

    接下来要安装的是我们的核心项目了。由于Python是一种面向对象的解释型计算机程序设计语言,所以Python开发的很多项目软件其实并不存在安装的概念,把代码下载下来,然后安装项目所需要的依赖就算完成安装了。

    这里推荐大部分用户直接使用叮当,但是还是给出另外两个项目的介绍,对有开发经验的用户算是一个参考。首先是叮当的祖宗Jasper,然后是我自己fork的Jasper,融合了叮当的特性并加入了我自己的一些特殊需求。

    ---Jasper---:

    Japser是叮当的基础,架构清晰,代码可读性高,注释详细,方便扩展,目前代码更新基本停止了,处于一个稳定的版本。

    Jasper支持的语音识别有:Pocketsphinx,Google STT,AT&T STT,Wit.ai STT,Julius。

    Jasper支持的语音合成有:eSpeak,Festival,Flite,SVOX Pico TTS,Google TTS,Ivona TTS,MaryTTS,Max OS X TTS。

    关于这些语音识别引擎的介绍可以参考这里这里。然而Jasper支持的STT和TTS看起来非常多,但是这些引擎的大部分要么不支持中文,要么没法在大中华局域网中使用。Jasper的官方插件和第三方插件也存在同样的问题,不适合墙内用户,不适合中文用户。这些问题正是叮当诞生的部分原因。

    ---囧小平的Jasper---:

    这个是我自己用的版本,这个版本没有fork叮当,而是fork了Jasper。我在Jasper的基础上,做了以下工作:

    首先去掉了大量国内用不成或者用不到TTS和STT引擎,只留下Pocketsphinx、Julius两个引擎。

    其次参照叮当加入snowboy语音识别和百度语音识别/合成引擎,同时我还加入了本地中文语音合成引擎Ekho(这个引擎的优势在于无需联网速度快,但是声音很难听,适用于极少部分场合)、在线中文语音合成引擎Voice Rss。和叮当同步加入了阿里和讯飞的语音识别/合成引擎,代码实现上会不同。

    然后,因为目前的Python版微信都存在7X24小时在线较难得到保证的问题,所以我抛弃了在Jasper中接入微信,而是加入了Slack Bot的支持,可以代替微信满足我的需求。

    插件方面,由于是基于Jasper框架,所以Jasper、叮当以及我的版本三者的插件都可以通用的。我目前加入的插件有:树莓派状态查询插件、新闻头条播报插件、出行路线规划插件、百度FM插件,这四个插件已经贡献到叮当第三方插件。还有两个插件:HomeAssistant插件和小影机器人插件,叮当第三方插件已经有功能类似的插件,所以这两个都是自己用的,和叮当代码实现有所不同,没有提交到叮当第三方插件。

    如果你不想直接使用叮当而是定制自己的功能,可以像我这样fork Jasper,并借鉴叮当里面有用的东西,扩展自己的功能。我自己对项目的改进和优化,如果经过一定时间的验证,只要是公用的部分,都会提交到叮当的,除非我懒。。。。

    安装

    具体到安装就简单了,把叮当git clone下来。

    git clone https://github.com/wzpan/dingdang-robot.git
    

    然后,用pip工具安装项目所需要的Python依赖

    sudo pip install -r client/requirements.txt
    

    因为项目不断更新中,要时常去github上关注下项目的状态,必要情况下git pull更新项目代码。

    3.2.3 安装语音识别STT引擎

    项目中常用的语音识别引擎一般有Pocketsphinx、snowboy、百度/阿里/讯飞语音识别。其中Pocketsphinx、snowboy一般用于用户离线唤醒,百度/阿里/讯飞语音识别用于在线识别用户对话/指令。

    百度/阿里/讯飞语音识别由于是在线引擎,注册后获取App Key,调用相应的API即可,没有工具和依赖需要安装。Pocketsphinx和snowboy是离线引擎,不需要借助网络。snowboy目前只能用于唤醒词的识别,相关依赖已经集成到项目中,不需要安装,但是需要用户自己去训练设定的唤醒词,详细的步骤可以看这里。Pocketsphinx除了用于唤醒词识别,也可以用于指定的有限指令集的识别(但是识别效果一般,并不推荐),这个是常用语音识别引擎中唯一需要安装的,而且安装的东西也比较多,不少工具和依赖库都是要用源码编译的,过程也比较长,还好似乎没什么坑,只要耐心等待,都会顺利完成安装,具体的步骤看这里即可。如果遇到编译错误什么的,我想你都选择手动安装了,想必也有一定经验了,所以自己解决也不是什么难事了。

    当然很多用户不喜欢项目自带的唤醒词,想自己定义更有个性的唤醒词。那么修改唤醒词可以参考这里,另外我也提了个issue,指导用户修改中文唤醒词。具体使用下来,对比两个唤醒词识别引擎Pocketsphinx和snowboy,前者如果唤醒词选得好,效果还不错,后者感觉误识别率太高了。

    3.2.4 安装语音合成TTS引擎

    因为中文的复杂性,可供选择的中文语音合成引擎大多都是在线的,离线的免费的引擎屈指可数(讯飞的好用,但是收费)。所以,项目中常用的语音合成引擎目前有百度/阿里/讯飞在线语音合成了。除此之外在我的项目中,我还加入了离线中文语音合成引擎Ekho以及在线中文语音合成引擎Voice RssEkho的声音比较难听,使用的机会并不多,Ekho的安装教程可以参考这里Voice Rss是国外的产品,声音还不错,但是免费额度比较低,联网速度比较慢,不如国内的百度阿里/讯飞,适合墙外用户。

    4 部署配置

    软件安装的部分基本完毕了,剩下就是写配置文件了。这一步其实没有什么难度,但却是大部分新手最容易犯错误的地方,因为很多用户不喜欢认真阅读文档,导致配置缺失或者配置错误,进而引起程序错误。

    配置主要分为项目的配置和插件的配置。

    叮当的配置文件在这里~/.dingdang/profile.yml,创建配置文件,并参考这里进行配置。

    对于叮当使用的官方插件,参考这里进行配置,对于第三方插件,参考这里进行配置。

    文档真的很详细,而且每一项也有详尽的说明,我就不再贴一遍了。

    如果一切顺利进入到项目的根目录,执行下面的命令即可

    python dingdang.py

    以叮当为例,当你听到提示音,并看到类似下面的提示信息,那么就基本算是成功了。

    pi@raspberrypi:~/dingdang-robot $ python dingdang.py
    
                叮当 - 中文语音对话机器人               
    
             © 2017 潘伟洲            *@hahack.com>
    
      https://github.com/wzpan/dingdang-robot.git    
    
    Cannot connect to server socket err = No such file or directory
    
    Cannot connect to server request channel
    
    jack server is not running or cannot be started
    

    我建议,用不到的功能尽量就在配置文件中关掉,以免配置出错导致整个程序运行异常。同时,很多插件提供的服务和在线语音服务都需要用户去各种不同的网站注册并申请key。虽然这些步骤比较繁琐,但是毕竟是人家大厂提供给用户的免费服务,而且免费的额度对于个人来说已经相当够用了,所以麻烦点也绝对值了。你可能需要申请key的地方有:百度语音、阿里语音、讯飞语音,他们提供核心的语音识别和合成服务;图灵机器人、小影机器人,他们提供智能人机交互的服务;心知天气,提供天气信息的服务;聚合数据,提供新闻头条服务;百度LBS,提供公交路线规划服务。以后项目加入更多基于在线服务的功能,也就会有更多网站需要注册和申请。

    5 功能演示

    这里对一些常用的插件进程功能演示,让大家更好了解叮当能做些什么。

    首先放出叮当主页里面的演示视频连接:演示视频。主要由项目作者wzpan录制。

    然后是我录制的两个控制家电的:

    <div class="youku-player-box"><iframe class="youku-player-inner" src="//player.youku.com/embed/XMzA0MTAwNzA0OA==?client_id=135733115d8d2ef5" style="width:600px;height:480px;margin: 0 auto;display:block;" frameborder=0 allowfullscreen></iframe></div><div class="youku-player-box"><iframe class="youku-player-inner" src="//player.youku.com/embed/XMzA0MTAwODY1Mg==?client_id=135733115d8d2ef5" style="width:600px;height:480px;margin: 0 auto;display:block;" frameborder=0 allowfullscreen></iframe></div>

    估计很多人对这个比较感兴趣,我就展开说一下。这个功能是结合了叮当和HomeAssistant,后者在张大妈的出镜率相当高,以至于我都觉得后面发的那些文章不少重复度太高了。。。HomeAssistant确实是个好东西,官方文档也很详细和丰富,懂英文的话,看官方文档比较好。HomeAssistant支持Rest API,有了这个功能接入叮当分分钟的事。前面放硬件图的时候也展示了我买的博联黑豆,先把黑豆接入HomeAssistant,把想控制的电器的红外遥控器拿过来将红外码学习一遍,然后就能通过HomeAssistant控制了。HomeAssistant这边配置好后,在叮当中写个插件,把语音控制指令转换为HomeAssistant的Rest API请求,就能用声音控制家电了。目前这个功能还比较基础,只能实现简单的开关,想实现更复杂的功能当然也可以,只是开发起来比较费事费事,懒得做了。

    6 问题与总结

    算一下这套基于树莓派自制的智能音箱的成本:树莓派3B:200元,16GB SD卡:50元 树莓派电源:25元 Playstation Eye:25元 蓝牙音箱:60元,各种语音在线API和插件用到的在线API都是免费,加在一起一共360元,算上树莓派的强大功能还可以用于其他用途,这套智能音箱的造价我认为还是可以接受的。但是正如文章开头所提到的,目前的这套造价低廉的自制智能音箱,不可避免地存在着一些问题或是缺陷。

    6.1 问题

    从实际的体验中,比较突出的两个问题是唤醒词的识别率以及指令响应的实时性,下面从硬件和软件两个层面分析一下造成这些问题的可能的原因,并给出解决方案。

    6.1.1 唤醒词的识别率

    唤醒智能音箱是与智能音箱进行交互的第一步,唤醒词的识别率问题主要体现在:1.当用户叫出唤醒词的时候智能音箱无法识别到,导致无法唤醒;2.用户日常对话,或者环境音错误地唤醒了智能音箱。

    无法唤醒的问题从一定程度上跟麦克风的好坏有很大关系。用户理想的使用场景肯定不是对着麦克风讲出唤醒词或者讲出指令,而是在一定距离以外,在正常的充满外界噪声的环境下唤醒音箱并讲出交互指令,这就要求麦克风硬件有着较远的拾音距离,较好的噪声抑制和回声消除能力。

    唤醒词的识别率问题跟其使用的语音识别引擎有着直接的关系。首先是唤醒词的选择,合适的唤醒词可以从一定程度上减少错误识别,具体什么样的唤醒词是合适的唤醒词,需要根据不同的唤醒词识别引擎不断更换、不断尝试。这个页面是百度语音提供的,可以对你选择的唤醒词做出评估,也给出了一些选择唤醒词的指导建议,可以作为参考。其次,目前项目中用作唤醒词识别的Pocketsphinx和snowboy两个引擎的识别率都并不完美,存在一定的错误识别率,搭配性能较差的麦克风的话,体验可能会很糟糕。

    原因已经分析完了,解决方案也就显而易见了。要提高唤醒词的识别率,首先可以考虑更换性能更好的麦克风,当然价格也会比较昂贵;

    其次,选择一个合适的唤醒词,这就需要自己不断尝试和调整了,我的经验是,唤醒词最好是四个字的,而且发音最好是平时说话时很少用到的组合;最后,对于唤醒词识别引擎,若是更换性能更好的商业版本似乎成本比较高,若是更换其他开源语音识别引擎,比如julius或者kaldi,他们的使用门槛比较高,不如Pocketsphinx和snowboy用起来简单,似乎没什么好的办法了。

    结合我的实际使用体验,我推荐使用Pocketsphinx,如果选择了一个合适的唤醒词,使用起来效果还是可以接收的。除此之外,目前Pocketsphinx使用的是公用的非特定人声的模型,可以利用Pocketsphinx训练小字符集的特定人声的模型,或者用自己的声音去适配现有的非特定人声的模型。具体怎么做呢,可以参考:PocketSphinx语音识别系统语言模型的训练和声学模型的改进PocketSphinx语音识别系统声学模型的训练与使用。如果你是模式识别相关专业的研究生,那么这两篇文章操作起来应该没有什么难度。言外之意是普通用户可以无视了。

    6.1.2 指令响应的实时性

    指令响应的实时性是指音箱被唤醒后,从用户发出指令到音箱根据指令给出反馈是否及时有效。用户当然希望指令下达的那一刻,智能音箱可以在很短的时间内给出反馈,如果等待时间较长,就会显得这个智能音箱很迟钝。

    指令响应的实时性跟硬件处理器的处理性能有一定的关系,音频的输入、指令的处理、音频的输出都会消耗处理器资源。树莓派3B的处理器性能一般,如果你的板子上运行着过多程序,就可能造成系统处理缓慢,对指令响应不及时。

    软件方面,则和我们选择的语音识别引擎和语音合成引擎有关了。由于项目中目前使用的是在线的百度语音服务,虽然其语音识别的识别率和语音合成的效果都还不错,但是网络环境是否通畅,在线服务器响应是否及时,都会影响到用户的对指令响应的实时性体验。

    解决方案依然显而易见。硬件上抛弃树莓派,更换性能更好的开发平台。软件上,在保证识别率和识别效果的前提下,选择离线的语音识别和语音合成引擎,必然会带来更好的体验。但是成本是一个大问题,各家的离线引擎服务都是要收费的。对于语音合成,还可以选择专门的语音合成模块,效果虽然肯定不如在线合成的那么自然,但是应该也不错,成本还可以接受。比如这个

     综上所述,大部分问题都可以用钱来解决。。。。

    6.2 总结

     码字不容易啊,写了一万多了。。。可能对很多人都是废话。不过只要能起到一点文章开头所说的那几点效果,也算没白写了。

    总之,用树莓派打造智能音箱,有一定的难度,实际效果和功能上都还有不少进步的空间,但是我觉得这是一个比较好玩,值得折腾的项目,希望能吸引到一些感兴趣的人。从我个人角度出发,我只是想折腾着玩而已,不想浪费树莓派剩下的可以榨取的性能和资源,成本和实际体验不是我关注的要点,而且我相信这个项目会越来越好。那么你是否也想玩一把了呢?项目主页在此:叮当,欢迎给作者star,欢迎fork,欢迎提PR,主页有QQ群,欢迎入群讨论交流。


Log in to reply
 

Popular Topics

|

Looks like your connection to SCC was lost, please wait while we try to reconnect.