• 方案介绍
  • 附件下载
  • 相关推荐
申请入驻 产业图谱

一步步教你把人工智能对话系统小智python移植到树莓派5上

05/29 09:55
1.2万
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

xiaozhi_final.zip

共1个文件

在当今人工智能技术迅猛发展的浪潮里,大模型如雨后春笋般不断涌现,似乎已成为各个项目中不可或缺的关键要素。

智能家居领域到智能办公场景,从教育行业到娱乐产业,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、在 Raspberry Pi 配置工具中,导航到“Advanced Options”(高级选项)。
2、在“Advanced Options”下,选择“Boot Order”(启动顺序)。
3、在“Boot Order”中,选择“NVMe/USB boot”(NVMe/USB启动)。
4、确认选择并保存更改。
5、使用“Finish”或“Esc”键退出 Raspberry Pi 配置工具。
6、重启树莓派在终端中输入 sudo reboot 命令来重新启动你的树莓派。(保险起见可以关机,把TF卡抽掉,重新开机)
开机时间大约10s,心情还是蛮好的。
file:///C:UsersADMINI~1AppDataLocalTempksohtml23896wps1.jpg

二、更换软件源

软件源是指树莓派系统软件安装的数据来源,默认的源应该是树莓派官方的源,普通民众也不是不能容,但是遇到稍大的下载项目就容易断,因为,为**的幸福生活,第一步建议更换软件源:
树莓派更改软件源为清华源
1. 备份原有的 sources.list 文件
在开始之前,最好备份原有的 sources.list 文件,以防万一需要恢复。
打开终端,执行以下命令来备份原有的 sources.list 文件
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
2. 编辑 sources.list 文件
接下来,我们需要编辑 /etc/apt/sources.list 文件,将其替换为清华大学的镜像源地址。
使用文本编辑器打开 sources.list 文件,例如使用 nano:
sudo nano /etc/apt/sources.list
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware
# 以下安全更新软件源包含了官方源与镜像站配置,如有需要可自行修改注释切换
deb https://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware
5 修改其他文件
/etc/apt/sources.list.d/raspi.list
sudo nano /etc/apt/sources.list.d/raspi.list
内容修改为
deb https://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ bookworm main
6.更新源
sudo apt update
sudo apt upgrade?
另外,值得注意下,上面的操作只是更换了系统软件源,但是如果你要用python编程环境的话,还要替换pip源,因为python的默认源也在国外,在这里也一同把它替换掉,以免后顾之忧。
这将指定清华大学 的 PyPI 镜像源作为默认源。你也可以选择其他镜像源,如:
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple
   -阿里云:`https://mirrors.aliyun.com/pypi/simple/`
   -中科大:`https://pypi.mirrors.ustc.edu.cn/simple/`   

三、远程编程工具

因为树莓派通常都不是用来当主力机,配置都较为简单可能没有配置鼠标、键盘显示器,有时不是因为不相配,只是占用了太多工作台面的地方,显得很凌乱,一个不小心被女主人全扔了,所以“为了优雅”,我们坚持保持桌面整洁,采用远程操作的方式开展工作做好了,树莓派还就只占用巴掌大的地方,与各方诸侯保持安全距离。
一般情况大家都会上工具iShell,Wave Terminal, MobaXterm,这些工具都很强大,建议大家去体验一下。MobaXterm是老牌软件,稳定功能强大,但也意味着没有创新,iShell是国产新秀,高级要收费,带AI问答。Wave Terminal?就更新潮了,也同样白嫖AI.
file:///C:UsersADMINI~1AppDataLocalTempksohtml23896wps2.jpg
这里重点介绍使用?Visual Studio Code?的远程开发扩展:
安装?Remote - SSH?扩展。
配置?SSH:
在?VS Code?中打开命令面板(Ctrl + Shift + P),然后选择“Remote-SSH: Connect to Host”。
输入树莓派的?SSH?信息(如?pi@<树莓派的IP地址>)。

file:///C:UsersADMINI~1AppDataLocalTempksohtml23896wps3.jpg
然后就可以想在本地一样打开树莓派上的文件夹和文件进行编辑,也可以在vscode的终端上运行树莓派的命令,操控树莓派。

四、py-xiaozhi项目移植

(1)独立python环境

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

 

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

(2)音频测试

小智是个智能对话系统,可谓“国民女朋友”你值得拥有,因此,基本配置就是要有麦克风和喇叭。Pi5上面原生是没有这些设备的,看看是不是连个耳机孔都没有呀。 为了优雅起见,建议购买麦克喇叭一体套装,如果没有可以到会议室去“借”一个,就可以完美地解决这个问题了。
基本的测试我们需要让Pi5能出声和能听到声音,保障这些功能后才进行下一步,不然后面有你受的。
从USB口插上麦克喇叭一体设备后,查看设备,如下所示,这里的card0就是我的设备,但是后来没用这个,用了得力的音质更好的产品。
(myenv) genvex@raspberrypi:~/py-xiaozhi $ aplay -l  # 查看可用设备
**** List of PLAYBACK Hardware Devices ****
card 0: YueMiUSB [YueMi_USB], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: vc4hdmi0 [vc4-hdmi-0], device 0: MAI PCM i2s-hifi-0 [MAI PCM i2s-hifi-0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: vc4hdmi1 [vc4-hdmi-1], device 0: MAI PCM i2s-hifi-0 [MAI PCM i2s-hifi-0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
设备状态监控
<BASH>
# 实时查看音频电平alsamixer -c 0  # 控制USB声卡
Available audio input devices:
Device Index    Device Name             Default Sample Rate (Hz)
0               YueMi_USB: USB Audio (hw:0,0)           44100.0
1               sysdefault              44100.0
5               spdif           44100.0
6               pulse           44100.0
7               speex           44100.0
8               upmix           44100.0
9               vdownmix                44100.0
11              default         44100.0?
这个设备的采样频率跟小智需要的采样率不对呀,小智需要的是16000,这个问题后面看看有没解决的方案。
在移植小智过程中,经过上述一系列妥善的处理,pi5已经已经进入了最佳状态,可以大刀阔斧地进行工作了,其中Pyaudio?安装问题,有些周折,以下线索提供参考。

(3)安装?PortAudio?开发包:

在基于?Debian/Ubuntu?的系统(如树莓派的?Raspbian)上,你需要安装?`portaudio`?的开发包,使用以下命令:
sudo apt update
   sudo apt install portaudio19-dev
这会安装?`portaudio`?库的头文件和其他开发文件。
2.安装?`PyAudio`:
? ?安装完?`portaudio`?开发包后,再次尝试安装?`PyAudio`:
  pip install pyaudio

 

(4)按键驱动

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

file:///C:UsersADMINI~1AppDataLocalTempksohtml23896wps5.jpg
https://wiki.seeedstudio.com/Grove_Base_Hat_for_Raspberry_Pi_Zero/
这里我们使用IO16作为按键使用,可以根据自己的实际情况修改。

(5)py-xiaozhi移植精讲

下面到了py-xiaozhi代码分解的内容,也是我们学以致用的重要内容,我们不单纯为了把项目跑起来,一些技术层面的知识可以让我们跑得更快更远。
小智对话**系统的运行架构?
py-xiaozhi运行时序图
file:///C:UsersADMINI~1AppDataLocalTempksohtml23896wps6.jpg
# 主要组件交互关系
while running:
    1. GUI线程 --> 消息队列 --> 更新**记录
    2. MQTT线程 --> 接收云端指令 --> 控制音频会话
    3. 音频线程 --> UDP加密传输 --> 实现双向语音
    4. 心跳线程 --> 维持连接 --> 处理会话超时

 

# 典型通信流程示例
def send_audio():
    while running:
        录音 -> Opus编码 -> AES加密 -> UDP发送
def on_mqtt_message():
    接收JSON指令 -> 更新会话状态 -> 控制音频线程

def on_space_key_press():
    global key_state, udp_socket, aes_opus_info, listen_state, conn_state
    if key_state == "press":
        return
    key_state = "press"
    # 判断是否需要发送hello消息
    if conn_state is False or aes_opus_info['session_id'] is None:
        conn_state = True
        # 发送hello消息,建立udp连接
        hello_msg = {"type": "hello", "version": 3, "transport": "udp",
                     "audio_params": {"format": "opus", "sample_rate": 16000, "channels": 1, "frame_duration": 60}}
        push_mqtt_msg(hello_msg)
        print(f"send hello message: {hello_msg}")
    if tts_state == "start" or tts_state == "entence_start":
        # 在播放状态下发送abort消息
        push_mqtt_msg({"type": "abort"})
        print(f"send abort message")
    if aes_opus_info['session_id'] is not None:
        # 发送start listen消息
        msg = {"session_id": aes_opus_info['session_id'], "type": "listen", "state": "start", "mode": "manual"}
        print(f"send start listen message: {msg}")
        push_mqtt_msg(msg)


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


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


# def on_release(key):
#     if key == pynput_keyboard.Key.space:
#         on_space_key_release(None)
#     # Stop listener
#     if key == pynput_keyboard.Key.esc:
#         return False


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


if __name__ == "__main__":
    audio = pyaudio.PyAudio()
    run()
部分关键代码

总结:

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

DigiKey得捷

DigiKey 总部位于美国明尼苏达州锡夫里弗福尔斯市,是一家获得原厂授权的全球性、全类目电子元器件和自动化产品分销商。我们通过分销来自 2,300 多家优质品牌制造商的 1,020 多万种元器件获得了强大的技术优势。DigiKey 还为工程师、设计师、开发者和采购专业人员提供丰富的数字解决方案、无障碍互动和工具支持,以帮助他们提升工作效率。在中国,客户可以通过电子邮件、电话和客服获得全方位技术支持。如需了解更多信息和获取 DigiKey 广泛的产品,请访问 www.digikey.cn 并关注我们的微信、微博、腾讯视频和 BiliBili 账号。

DigiKey 总部位于美国明尼苏达州锡夫里弗福尔斯市,是一家获得原厂授权的全球性、全类目电子元器件和自动化产品分销商。我们通过分销来自 2,300 多家优质品牌制造商的 1,020 多万种元器件获得了强大的技术优势。DigiKey 还为工程师、设计师、开发者和采购专业人员提供丰富的数字解决方案、无障碍互动和工具支持,以帮助他们提升工作效率。在中国,客户可以通过电子邮件、电话和客服获得全方位技术支持。如需了解更多信息和获取 DigiKey 广泛的产品,请访问 www.digikey.cn 并关注我们的微信、微博、腾讯视频和 BiliBili 账号。收起

查看更多

相关推荐