使用树莓派 4B + wukong 模块 + OpenAI,做了个智能音箱 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
quietjosen
V2EX    分享创造

使用树莓派 4B + wukong 模块 + OpenAI,做了个智能音箱

  •  
  •   quietjosen
    atjason 2023-09-01 15:27:57 +08:00 3863 次点击
    这是一个创建于 800 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用树莓派 4B + wukong 模块 + OpenAI ,做了个智能音箱,简单记录下关键节点。


    智能音箱的大概流程是这样的:

    • 关键词唤醒
    • 听用户说什么并转换为文字
    • 识别文字中的命令并得到答案
    • 将文字转换为音频并播放
    • 将上述流程串起来

    上面是从技术的角度分析。从产品的角度,还要考虑很多事情

    • 产品外观及工业设计
    • 响应速度与使用感受
    • 稳定性
    • 电池、功耗、散热等

    从实现的角度,各个模块都有对应的选择,每个模块取最优解,然后组合出产品,是可以的。只是,这会比较耗时。经过简单的比较,选择 wukong-robot 这一成套解决方案。

    关于硬件的选型。先是用我手上吃灰的 Radxa 安装。不过,由于这个硬件比较老了,官方的 Ubuntu 系统很久远,在安装 wukong-robot 时,遇到一系列兼容性问题。花了很多时间后,决定放弃。

    找朋友借来了树莓派 3B 。果然,树莓派生态很好。就拿安装系统来说,官方出了多平台的工具,很容易安装指定系统。并且,树莓派的系统是安装在 SD 卡上的。这样,更换 SD 卡就可以更换系统,很方便。

    安装 wukong-robot 后,又遇到问题:这块板的 USB 有故障,识别不了 USB 设备。这就难办了,因为麦克风、扬声器是需要 USB 接口的。没办法,又买了树莓派 4B 。

    在新的硬件上,基本跑通了默认系统后,还要有一系列的配置和优化。

    关于后端引擎,最想用的自然是 ChatGPT/OpenAI 。不过,这个东西在国内是无法访问的。试了在板子上搭建梯子,可遇到 SSL 的问题,花了很长时间没解决,并且也不是必现的,只是高概率。

    后来想的办法,就使用 Azure 的 ChatGPT 接口。具体的,使用日本的节点,会相对快点。好处是不用梯子,但总的响应速度,还是不如梯子 + OpenAI 接口。先这样用段时间,再考虑优化速度吧。现在文心一言发布了,可以考虑对接一下。

    关于语音识别,简单比较几个,感觉区别不是太大,最后选了腾讯语音。

    关于语音全成,默认是 Edge 接口,合成的效果不错。不过,实际有时会慢,比如一句短语可能要 2s 以上,这就比较影响体验,最后选了腾讯语音。

    关于麦克风和扬声器,考虑最后的外观,选择了一个 USB 一体的、方形的设备。这样,可以比较容易和树莓派一起放到一个壳子里。

    说到壳子,自己设计了简单的外壳。

    还有其它一些优化,比如:

    • wukong-robot 在识别出命令后,会先调用百度 Unit 进行第一遍处理,目的是识别出一些预定义的功能,比如「大点声」这类的。问题是,这个操作会增加 3s 的延时。显然,为了低频的预处理,给所有请求都加上延时,是不划算的,于是我去掉了。
    • 但调音量的需求确实存在,于是在发送到 OpenAI 进行识别之前,硬编码对命令进行预识别和处理。这是本地的,不消耗时间。wukong-robot 内置的调音量,是硬编码设置默认设备的,这点改成了可以调节指定设备的。
    • 替换录音开始、结束的提示音,减缓大延时带来的差体验。

    最终产品,主要是给娃用的,回答他的十万个为什么。从初步使用体验上看,还是满意的。最大的不足是唤醒不灵敏、可能误唤醒。这点之后考虑用麦克风阵列,取代现在的单麦克风。未来,还会根据实际使用来不断改进。


    后记:其实这件事,我几个月前就想做了,拖拖拉拉做到现在。

    最开始,我是想基于现有的智能音箱做二次开发。最后发现,我还是太年轻。但凡厂商,几乎没有真正开放的。如果很容易让别人二次开发,岂不是给别人嫁衣。

    如果自己完整做一个,需要大块的时间,一直没这个勇气,直到最近才下决心。比如,看到人家稚晖君,半年时间就做出那么高级的机器人,自己半年组装不出一个音箱,真是太汗颜了。

    9 条回复    2023-09-03 09:45:42 +08:00
    macy
        1
    macy  
       2023-09-01 15:39:53 +08:00
    可以,我也想给娃做一个,期待教程,我的想法是 asr 模型跑在家里的服务器上,可能会快点,其他的调用 chatgpt
    quietjosen
        2
    quietjosen  
    OP
       2023-09-01 15:43:11 +08:00
    @macy asr 不是大问题,短句一般 <2s 。教程不太会写更详细的了,毕竟程序员都不喜欢写文档……
    musi
        3
    musi  
       2023-09-01 15:48:28 +08:00
    麦克风阵列比起单麦克风在误唤醒上可能有点提升,但提升不会太大。误唤醒其实现在的智能音箱或多或少都会存在这个问题,厂商的智能音箱除了是麦克风阵列还用了算法降噪,对麦克风消音等对环境音的处理
    quietjosen
        4
    quietjosen  
    OP
       2023-09-01 15:53:08 +08:00
    @musi 恩,其实我买了 4 阵列的麦克风,录音效果好一点,但不是特别明显,又退货了…

    现在主要是两个问题:

    - 叫它它不应
    - 不叫它它应,尤其是播放声音时。

    我想到的办法,就是把唤醒词变复杂点,降低误解概率。
    billzhuang
        5
    billzhuang  
       2023-09-01 15:54:47 +08:00
    chatgpt 来给娃回答十万个为什么,娃会不会被坑了。
    quietjosen
        6
    quietjosen  
    OP
       2023-09-01 15:59:27 +08:00
    @billzhuang 常识性问题还好,比如太阳系有几大行星、世界上最大的 XX 是什么。
    vsyf
        7
    vsyf  
       2023-09-02 01:22:50 +08:00 via Android
    像我就不一样了,想做个监控摄像头一年多了代码才写一半
    chancat
        8
    chancat  
       2023-09-03 02:39:28 +08:00 via Android
    咸鱼有处理的钉钉 f1 ,有单卖板子的,有整机出售的。可以自己看需求,我们是去年上车的板子,150 包邮两张。rk3399 usb 摄像头,麦克风,原本这个设备就是给远程办公用的
    quietjosen
        9
    quietjosen  
    OP
       2023-09-03 09:45:42 +08:00
    @chancat 好的,如果再做一个的话,去了解下。现在这个差不多也能用。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5411 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 42ms UTC 07:12 PVG 15:12 LAX 23:12 JFK 02:12
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86