回答

收藏

《2024 DigiKey 汽车应用创意挑战赛》树莓派5智能对话系统移植

#竞赛 #竞赛 730 人阅读 | 0 人回复 | 2025-03-02

本帖最后由 genvex 于 2025-3-2 22:02 编辑

树莓派5工作环境搭建及智能对话系统移植

   在当今人工智能技术迅猛发展的浪潮里,大模型如雨后春笋般不断涌现,似乎已成为各个项目中不可或缺的关键要素。从智能家居领域到智能办公场景,从教育行业到娱乐产业,AI的应用场景持续拓展延伸。而人工智能对话机器人,更是一跃成为当下最为热门的项目类型之一。众多开发者竞相涌入这一赛道,全力尝试打造出令人称奇的智能语音助手,期望能让AI真正无缝融入人们的日常生活。就最新情况而言,小智(Xiaozhi - ESP32)无疑是当前极为成功的项目典范,在刚刚过去的农历新年期间成为大众热议的焦点,网友们口口相传,热度居高不下。

  将小智移植到树莓派5上,不仅能够充分挖掘并发挥树莓派5的硬件优势,还可流畅且高效地完成对话交互内容,为**智能体的开发工作夯实基础,铺平前行道路。本项目内容将详细地从环境搭建开始,一步步深入到运行py - xiaozhi项目,进行全方位、手把手式的细致讲解,尤其适合刚刚接触树莓派pi5的新手朋友。同时,在讲解过程中还会分享这段时间探索项目时积累总结的宝贵经验,助力大家更好地理解与实践。






一、系统安装

    择树莓派 OS(64) Bookworm系统(桌面版),选择Bookworm是因为它支持PVE8,Bullseye只支持PVE7选择64位是因为很多特性只支持64,兼容性更好,所以能64位就64位。这里我的TF卡的容量就是随便找的,因为也不打算在TF卡上工作。因为现在固态硬盘已经很便宜了一个普通256G的固态硬盘就一百元附近,跟TF的价格已经区别不明显了,但是换来更高的速度更大的容量,所以我认为现在正确的打开方式都是加个固态硬盘,才是长久之计。 为了安装固态硬盘,我们需要加一个固态硬盘的扩展板(树莓派 M.2 HAT+
),这个有树莓派官方选择和国内厂商的替代产品,性能上应该没什么区别。 据说树莓派原厂的也是我们国内代工的,所以大家可以放心使用。
   因此在制作树莓派系统的时候,一起给TF卡和固态硬盘的系统也给烧录了,因为,还是需要用TF卡启动系统后,进行简单的设置,把启动盘改为固态硬盘,后面就没有TF卡什么事了,但是建议还是把这张TF卡保留着,当你的固态盘系统坏了,心态崩了的时候,它还可以救个场。
切换固态硬盘作启动盘的操作步骤如下:
使用 SD 卡将你的树莓派启动到 Raspberry Pi OS。进入树莓派配置工具在终端中,输入 sudo raspi-config 命令来打开 Raspberry Pi 配置 CLI(命令行界面)更改启动顺序。
  1. 1、在 Raspberry Pi 配置工具中,导航到“Advanced Options”(高级选项)。
  2. 2、在“Advanced Options”下,选择“Boot Order”(启动顺序)。
  3. 3、在“Boot Order”中,选择“NVMe/USB boot”(NVMe/USB启动)。
  4. 4、确认选择并保存更改。
  5. 5、使用“Finish”或“Esc”键退出 Raspberry Pi 配置工具。
  6. 6、重启树莓派在终端中输入 sudo reboot 命令来重新启动你的树莓派。(保险起见可以关机,把TF卡抽掉,重新开机)
  7. 开机时间大约10s,心情还是蛮好的。
复制代码
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml23896\wps1.jpg

二、更换软件源

   软件源是指树莓派系统软件安装的数据来源,默认的源应该是树莓派官方的源,普通民众也不是不能容,但是遇到稍大的下载项目就容易断,因为,为**的幸福生活,第一步建议更换软件源
树莓派更改软件源为清华源
  1. 1. 备份原有的 sources.list 文件
  2. 在开始之前,最好备份原有的 sources.list 文件,以防万一需要恢复。
  3. 打开终端,执行以下命令来备份原有的 sources.list 文件
  4. sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
  5. 2. 编辑 sources.list 文件
  6. 接下来,我们需要编辑 /etc/apt/sources.list 文件,将其替换为清华大学的镜像源地址。
  7. 使用文本编辑器打开 sources.list 文件,例如使用 nano:
  8. sudo nano /etc/apt/sources.list
  9. # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
  10. deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware
  11. # 以下安全更新软件源包含了官方源与镜像站配置,如有需要可自行修改注释切换
  12. deb https://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware
  13. 5 修改其他文件
  14. /etc/apt/sources.list.d/raspi.list
  15. sudo nano /etc/apt/sources.list.d/raspi.list
  16. 内容修改为
  17. deb https://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ bookworm main
  18. 6.更新源
  19. sudo apt update
  20. sudo apt upgrade
复制代码


另外,值得注意下,上面的操作只是更换了系统软件源,但是如果你要用python编程环境的话,还要替换pip源,因为python的默认源也在国外,在这里也一同把它替换掉,以免后顾之忧。
   这将指定清华大学 PyPI 镜像源作为默认源。你也可以选择其他镜像源,如:
  1. pip config set global.index-url https://mirrors.aliyun.com/pypi/simple
  2.    -阿里云:`https://mirrors.aliyun.com/pypi/simple/`
  3.    -中科大:`https://pypi.mirrors.ustc.edu.cn/simple/`   
复制代码


三、远程编程工具
   因为树莓派通常都不是用来当主力机,配置都较为简单可能没有配置鼠标、键盘显示器,有时不是因为不相配,只是占用了太多工作台面的地方,显得很凌乱,一个不小心被女主人全扔了,所以“为了优雅”,我们坚持保持桌面整洁,采用远程操作的方式开展工作做好了,树莓派还就只占用巴掌大的地方,与各方诸侯保持安全距离。
一般情况大家都会上工具iShell,Wave Terminal, MobaXterm,这些工具都很强大,建议大家去体验一下。MobaXterm是老牌软件,稳定功能强大,但也意味着没有创新,iShell是国产新秀,高级要收费,带AI问答。Wave Terminal 就更新潮了,也同样白嫖AI.
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml23896\wps2.jpg

这里重点介绍使用 Visual Studio Code 的远程开发扩展:
安装 Remote - SSH 扩展。
配置 SSH
VS Code 中打开命令面板(Ctrl + Shift + P),然后选择“Remote-SSH: Connect to Host”
输入树莓派的 SSH 信息(如 pi@<树莓派的IP地址>)。


file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml23896\wps3.jpg

然后就可以想在本地一样打开树莓派上的文件夹和文件进行编辑,也可以在vscode的终端上运行树莓派的命令,操控树莓派。


四、py-xiaozhi项目移植

(1)独立python环境

     python的世界,很多程序都可以共享支持库,但是每个程序对应库的版本又可能存在细微的差别,也就细微的差别就会导致运行失败。所以为了保障每个程序都有个私密的环境,也不影响其他的程序运行,良好的操作规范还是创建独立的运行环境。其中带来的问题就是稍微的会多占用点存储空间,鉴于前面我们已经解决了硬盘空间的问题了,所以到这一步也不是什么问题了,为了减少后面的各种崩溃,或者限定崩溃的范围也是值得的。
     良好操作规范:
  1.    # 确保你安装了虚拟环境工具
  2.    sudo apt update
  3.    sudo apt install python3-venv python3-pip
  4.    # 创建一个新的虚拟环境
  5.    python3 -m venv myenv
  6.    # 激活虚拟环境
  7.    source myenv/bin/activate
  8.    # 在虚拟环境中安装 requirements.txt 中的包
  9.    pip install -r requirements.txt
复制代码

   激活虚拟环境后,所有的 `pip` 安装都会在这个独立的环境中进行,不会影响系统的 Python。退出虚拟环境可以运行 `deactivate`

(2)音频测试
  小智是个智能对话系统,可谓“国民女朋友”你值得拥有,因此,基本配置就是要有麦克风和喇叭。Pi5上面原生是没有这些设备的,看看是不是连个耳机孔都没有呀。 为了优雅起见,建议购买麦克喇叭一体套装,如果没有可以到会议室去“借”一个,就可以完美地解决这个问题了。

基本的测试我们需要让Pi5能出声和能听到声音,保障这些功能后才进行下一步,不然后面有你受的。
USB口插上麦克喇叭一体设备后,查看设备,如下所示,这里的card0就是我的设备,但是后来没用这个,用了得力的音质更好的产品。
  1. (myenv) genvex@raspberrypi:~/py-xiaozhi $ aplay -l  # 查看可用设备
  2. **** List of PLAYBACK Hardware Devices ****
  3. card 0: YueMiUSB [YueMi_USB], device 0: USB Audio [USB Audio]
  4.   Subdevices: 1/1
  5.   Subdevice #0: subdevice #0
  6. card 1: vc4hdmi0 [vc4-hdmi-0], device 0: MAI PCM i2s-hifi-0 [MAI PCM i2s-hifi-0]
  7.   Subdevices: 1/1
  8.   Subdevice #0: subdevice #0
  9. card 2: vc4hdmi1 [vc4-hdmi-1], device 0: MAI PCM i2s-hifi-0 [MAI PCM i2s-hifi-0]
  10.   Subdevices: 1/1
  11.   Subdevice #0: subdevice #0
复制代码


设备状态监控
  1. <BASH>
  2. # 实时查看音频电平alsamixer -c 0  # 控制USB声卡
  3. Available audio input devices:
  4. Device Index    Device Name             Default Sample Rate (Hz)
  5. 0               YueMi_USB: USB Audio (hw:0,0)           44100.0
  6. 1               sysdefault              44100.0
  7. 5               spdif           44100.0
  8. 6               pulse           44100.0
  9. 7               speex           44100.0
  10. 8               upmix           44100.0
  11. 9               vdownmix                44100.0
  12. 11              default         44100.0
复制代码


这个设备的采样频率跟小智需要的采样率不对呀,小智需要的是16000,这个问题后面看看有没解决的方案。

在移植小智过程中,经过上述一系列妥善的处理,pi5已经已经进入了最佳状态,可以大刀阔斧地进行工作了,其中Pyaudio 安装问题,有些周折,以下线索提供参考。


3安装 PortAudio 开发包:


   在基于 Debian/Ubuntu 的系统(如树莓派的 Raspbian)上,你需要安装 `portaudio` 的开发包,使用以下命令:

  1. sudo apt update
  2.    sudo apt install portaudio19-dev
复制代码

   这会安装 `portaudio` 库的头文件和其他开发文件。

2.安装 `PyAudio`

   安装完 `portaudio` 开发包后,再次尝试安装 `PyAudio`

  1.   pip install pyaudio
复制代码


4)按键驱动

   因为还没完成 语音唤醒 发送消息逻辑 ,通过按键简单完成这个激活小智的对话过程,长按按键开始录音,松开按键 自动发送语音信息,等待信息回复。 还是为了优雅,我在pi5加了个seeed的多功能扩展板,板载多个grove接口,grove接口是 业界大厂seeedM5stack传感器的通用接口,他们的传感器以颜值著称。这里我只是用了普通IO,还有i2c,uart这些端口也是引出的,以后要继续折腾其他传感器也非常便利。但是注意Pi5IO驱动要使用gpiozero这个库,pi4常用的rpi.gpio库在pi5上就不好用了,在这个地方也是折腾了好久。因此,当前这个移植是可以向下兼容的(pi4或者其他linux开发板是也是可以用的)。

file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml23896\wps5.jpg

这里我们使用IO16作为按键使用,可以根据自己的实际情况修改。


5)py-xiaozhi移植精讲

   下面到了py-xiaozhi代码分解的内容,也是我们学以致用的重要内容,我们不单纯为了把项目跑起来,一些技术层面的知识可以让我们跑得更快更远。
小智对话**系统的运行架构

?                     

py-xiaozhi运行时序图


file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml23896\wps6.jpg
  1. # 主要组件交互关系
  2. while running:
  3.     1. GUI线程 --> 消息队列 --> 更新**记录
  4.     2. MQTT线程 --> 接收云端指令 --> 控制音频会话
  5.     3. 音频线程 --> UDP加密传输 --> 实现双向语音
  6.     4. 心跳线程 --> 维持连接 --> 处理会话超时
复制代码

  1. # 典型通信流程示例
  2. def send_audio():
  3.     while running:
  4.         录音 -> Opus编码 -> AES加密 -> UDP发送
  5. def on_mqtt_message():
  6.     接收JSON指令 -> 更新会话状态 -> 控制音频线程
复制代码
  1. def on_space_key_press():
  2.     global key_state, udp_socket, aes_opus_info, listen_state, conn_state
  3.     if key_state == "press":
  4.         return
  5.     key_state = "press"
  6.     # 判断是否需要发送hello消息
  7.     if conn_state is False or aes_opus_info['session_id'] is None:
  8.         conn_state = True
  9.         # 发送hello消息,建立udp连接
  10.         hello_msg = {"type": "hello", "version": 3, "transport": "udp",
  11.                      "audio_params": {"format": "opus", "sample_rate": 16000, "channels": 1, "frame_duration": 60}}
  12.         push_mqtt_msg(hello_msg)
  13.         print(f"send hello message: {hello_msg}")
  14.     if tts_state == "start" or tts_state == "entence_start":
  15.         # 在播放状态下发送abort消息
  16.         push_mqtt_msg({"type": "abort"})
  17.         print(f"send abort message")
  18.     if aes_opus_info['session_id'] is not None:
  19.         # 发送start listen消息
  20.         msg = {"session_id": aes_opus_info['session_id'], "type": "listen", "state": "start", "mode": "manual"}
  21.         print(f"send start listen message: {msg}")
  22.         push_mqtt_msg(msg)


  23. def on_space_key_release():
  24.     global aes_opus_info, key_state
  25.     key_state = "release"
  26.     # 发送stop listen消息
  27.     if aes_opus_info['session_id'] is not None:
  28.         msg = {"session_id": aes_opus_info['session_id'], "type": "listen", "state": "stop"}
  29.         print(f"send stop listen message: {msg}")
  30.         push_mqtt_msg(msg)


  31. # def on_press(key):
  32. #     if key == pynput_keyboard.Key.space:
  33. #         on_space_key_press(None)


  34. # def on_release(key):
  35. #     if key == pynput_keyboard.Key.space:
  36. #         on_space_key_release(None)
  37. #     # Stop listener
  38. #     if key == pynput_keyboard.Key.esc:
  39. #         return False


  40. def run():
  41.     global mqtt_info, mqttc
  42.     # 获取mqtt与版本信息
  43.     get_ota_version()
  44.     # 监听键盘按键,当按下空格键时,发送listen消息
  45.     # listener = pynput_keyboard.Listener(on_press=on_press, on_release=on_release)
  46.     # listener.start()
  47.     button = Button(16)
  48.     button.when_pressed = on_space_key_press
  49.     button.when_released = on_space_key_release
  50.     # 创建客户端实例
  51.     mqttc = mqtt.Client(callback_api_version=mqtt.CallbackAPIVersion.VERSION2, client_id=mqtt_info['client_id'])
  52.     mqttc.username_pw_set(username=mqtt_info['username'], password=mqtt_info['password'])
  53.     mqttc.tls_set(ca_certs=None, certfile=None, keyfile=None, cert_reqs=mqtt.ssl.CERT_REQUIRED,
  54.                   tls_version=mqtt.ssl.PROTOCOL_TLS, ciphers=None)
  55.     mqttc.on_connect = on_connect
  56.     mqttc.on_message = on_message
  57.     mqttc.connect(host=mqtt_info['endpoint'], port=8883)
  58.     mqttc.loop_forever()


  59. if __name__ == "__main__":
  60.     audio = pyaudio.PyAudio()
  61.     run()
复制代码
部分关键代码


总结:
  人工智能已经把人类带向了一个前所未有的繁荣,树莓派作以其优越的性能,成为了承载人工智能运行的实体,走进平凡人家的最佳实践。借助树莓派,智能家居系统变得触手可及。人们仅需通过简单的语音指令,就能依托树莓派搭载的人工智能程序,轻松操控家中的灯光、温度与电器设备,让生活变得更加便捷与舒适。在教育领域,树莓派为学生们开启了探索人工智能世界的大门。学生们可以利用它开展简单的图像识别、语音交互等实验项目,将抽象的人工智能理论知识转化为生动有趣的实践操作,极大地激发了他们对科技的热爱与创新思维。在科研层面,树莓派凭借其灵活的扩展性,成为了众多科研人员进行小型人工智能实验的得力助手,帮助他们在有限的资源条件下,快速验证新的算法与模型,为人工智能技术的进一步突破贡献力量。随着技术的不断迭代升级,未来树莓派有望在更多领域大放异彩,持续推动人工智能与日常生活深度融合,创造出更多令人惊喜的应用场景 。






xiaozhi_final.zip

4.95 KB, 下载次数: 1

分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条