ESP32 本地大模型部署语音助手

ESP32S3 Box 提供了 chatgpt 的 demo。因为访问不了的原因,打算改来做一个本地化部署的专用语音助手。

文章目录

  • 准备工作
    • Windows 安装 ESP-IDF
    • WSL 安装 ESP-IDF
      • 配置 IDF
      • 编译 chatgpt demo
      • 串口映射
      • 下载
  • 语音助手
    • 调试步骤
    • 遇到的问题
      • 在WSL2中,server.py 脚本无法被ESP访问端口
      • server.py 脚本无法访问 Ollama server
      • WSL2部署的 cosyvoice server 无法访问
      • cosyvoice fasapi container 无法外部访问
      • cosyvoice fastapi container 运行报错
      • Windows Server 保存音频时保存
      • ESP32 只能录音一部分,后面会丢失
      • 如何将 audio 写入 ESP32

前置条件:

  • >=12GB显存的显卡
  • ESP32S3-Box

准备工作

ESP-IDF 是我用过的最难用的 IDE!

Windows 安装 ESP-IDF

Windows 安装下载release版本的离线安装包就好了,然后进入powershell,找到example里的 Hello world

idf.py set-target esp32s3
idf.py menuconfig
idf.py build
idf.py -p COM3 flash

在这里插入图片描述

WSL 安装 ESP-IDF

配置 IDF

由于 ChatGPT demo 需要指定ESP-IDF的版本或者最新版本(Windows中编译出现了BUG),所以需要在linux环境中手动安装指定版本的 ESP-IDF:

  • Linux 和 macOS 平台工具链的标准设置
  • ChatGPT Example
sudo apt-get install git wget flex bison gperf python3 python3-pip python3-venv cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0git clone git@github.com:espressif/esp-idf.git
cd esp-idf/export IDF_GITHUB_ASSETS="dl.espressif.cn/github_assets"
./install.sh esp32s3# 完成后配置shell环境
. ./export.sh

卡住哪个压缩包下载不下来,就到网页中手动下载,然后它会创建python虚拟环境,到idf-tool.py中找到pip下载的部分,在后面加上-i https://mirrors.aliyun.com/pypi/simple/以加快速度

设置环境变量:

vim ~/.bashrc
alias get_idf='. $HOME/esp/esp-idf/export.sh'

使用get_idf进入python虚拟环境

编译 chatgpt demo

git clone git@github.com:espressif/esp-box.git
cd examples/chatgpt_demo/factory_nvs
idf.py menuconfig

这里设置一下wifi和openAI密钥等信息:

在这里插入图片描述

OpenAI Key:https://platform.openai.com/api-keys

在这里插入图片描述

这里它会手动为IDF-ESP下载submodule,时间比较长,尤其会卡在esp_wifi包,如果卡住了,ctrl-C后继续,它会跳过这个包的更新去继续下载,然后进入menuconfig,但是最后编译的时候会报错,因为找不到库

ninja: error: '/esp-idf/components/esp_wifi/lib/esp32s3/libcore.a', needed by 'factory_nvs.elf', missing and no known rule to make it
ninja failed with exit code 1, output of the command is in the work/esp-box/examples/chatgpt_demo/factory_nvs/build/log/idf_py_stderr_output_18950 and /work/esp-box/examples/chatgpt_demo/factory_nvs/build/log/idf_py_stdout_output_18950

到esp-idf/components/esp_wifi目录下,删除里面所有文件后通过git checkout 将文件还原,可以解决上述这个问题。

也有可能是网好了给我下载下来了,总之,祈祷网是好的。

完成后,开始build

idf.py build

编译chatgpt-demo:

cd examples/chatgpt_demo/
idf.py menuconfig
idf.py build

串口映射

参考:wsl2中访问windows上的串口。windows下载安装:usbipd-win

在WSL中

sudo apt install linux-tools-5.4.0-77-generic hwdata
sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/5.4.0-77-generic/usbip 20

管理员模式下打开Powershell:

$ usbipd list
Connected:
BUSID  VID:PID    DEVICE                                                        STATE
1-1    303a:1001  USB 串行设备 (COM7), USB JTAG/serial debug unit                Not sharedPersisted:
GUID                                  DEVICE
$ usbipd bind --busid 1-1
$ usbipd attach --wsl --busid=1-1
$ usbipd: info: Using WSL distribution 'Ubuntu-20.04' to attach; the device will be available in all WSL 2 distributions.
usbipd: info: Using IP address 172.18.128.1 to reach the host.

WSL中,找到TTY:

$ ls /dev/tty*
/dev/ttyACM0

下载

idf.py -p /dev/ttyACM0 flash

烧写不进去,按住BOOT,再按reset,等待串口烧录。找不到串口时,在powershell重复上述的操作。

语音助手

在这里插入图片描述

Roadmap:

  • 更改demo中的默认界面语言,并且删除与OpenAI相关的代码实现
  • 更新demo的默认语音
  • 更新语音唤醒的提示词
  • 写一个python上位机服务器,接受ESP32的请求,处理完数据后
    • 接收ESP的音频
    • 下发语音识别结果,即第一串字符
    • 下发ollama生成的结果,即第二串字符
    • 下发语音生成的结果,即第三段数据
    • ESP继续超时等待结果,收到后,播放声音

在这里插入图片描述

调试步骤

  • Windows 运行 Docker Desktop

  • 打开FunASR

    sudo bash work/funasr/funasr-runtime-deploy-online-cpu-zh.sh restart
    
  • 打开Ollama serve

    [Environment]::SetEnvironmentVariable('OLLAMA_HOST', '0.0.0.0:11434', 'Process')
    [Environment]::SetEnvironmentVariable('OLLAMA_ORIGINS', '*', 'Process')
    ollama serve
    
  • 运行cosyvoice docker,在Docker Desktop中直接运行

  • 管理员模式打开powershell,绑定 ESP-IDF 串口

    usbipd attach --wsl --busid=1-1
    
  • 运行 server.py 脚本

    python3 \\wsl.localhost\Ubuntu-20.04\home\sjl\work\esp-box\examples\chatgpt_demo\main\server.py
    
  • 下载烧录

    get_idf
    idf.py -p /dev/ttyACM0 flash
    idf.py -p /dev/ttyACM0 monitor
    

遇到的问题

在WSL2中,server.py 脚本无法被ESP访问端口

通过转发端口方式,实际操作总是有问题。解决:把server放windows端,带来了下面的问题。

server.py 脚本无法访问 Ollama server

把 VPN 关了。

WSL2部署的 cosyvoice server 无法访问

创建 cosyvoice fastapi docker 容器,先提前下载一个镜像

docker pull pytorch/pytorch:2.0.1-cuda11.7-cudnn8-runtime

按照官方教程编译fasapi container。

cosyvoice fasapi container 无法外部访问

需要将cosyvoice fastapi docker的ip设为0.0.0.0,以让host能够访问,需要下载一个vim。

cosyvoice fastapi container 运行报错

显示为:CUFFT_INTERNAL_ERROR

  • Bug: Ubuntu on WSL2 - RTX4090 related cuFFT runtime error

  • CUFFT_INTERNAL_ERROR on RTX 4090

  • 解决:到cosyvoice给的docker里,卸载掉11.7的pytorch cuda:

    pip uninstall torch torchaudio
    pip install torch==2.0.1 torchaudio==2.0.2 --index-url https://download.pytorch.org/whl/cu118
    

    考虑:提 pull request,在编译容器镜像时一步到位

Windows Server 保存音频时保存

在wsl2的客户端保存音频没问题

raise RuntimeError(f"Couldn't find appropriate backend to handle uri {uri} and format {format}.")
RuntimeError: Couldn't find appropriate backend to handle uri tmp.wav and format None.

在 save 时无法保存音频。解决,安装后端,并且不要使用windows conda,导致 pip 包混乱。

pip3 install ffmpeg soudfile

ESP32 只能录音一部分,后面会丢失

TODO

如何将 audio 写入 ESP32

TODO

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/148824.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3项目开发——新闻发布管理系统(八)

文章目录 十、新闻管理模块设计开发1、新闻管理主页面设计1.1 基本架构搭建1.1.1 搜索表单1.1.2 新闻主表格样式(静态数据模拟渲染)1.2 新闻分类选择框1.2.1 新建组件1.2.2 页面中导入渲染1.2.3 调用接口,动态渲染下拉分类,设计成 v-model 的使用方式1.2.4 父组件定义参数绑定…

供应链采购管理系统:开启智能采购新时代

在当今全球化的商业环境中,供应链管理的高效性和智能化对于企业的生存与发展至关重要。而供应链采购管理系统,尤其是智能采购系统,正成为企业提升竞争力的关键工具。 一、传统采购管理的挑战 传统的供应链采购管理往往面临着诸多难题。首先&a…

数据中心里全速运行的处理器正在浪费能源

数据中心是耗电大户,运营商一直在努力解决的一个关键问题是如何减少能源和资源消耗。人们已经找到了一些巧妙的解决方案,例如使用非饮用水来冷却设备,但一个显而易见的解决方案似乎被忽略了:启用处理器的各种省电功能。 随着需求的…

示例说明:sql语法学习

SQL(Structured Query Language,结构化查询语言)是一种用于管理关系型数据库的标准语言。学习SQL可以帮助你有效地查询、插入、更新和删除数据库中的数据。以下是SQL语法的一些基本概念和常用命令: 1. SQL基础语法 SQL关键字&am…

揭秘化工产品网络优化成本:性价比高的策略大公开

合作咨询联系竑图 hongtu201988 化工产品网络推广到底需要多少钱?为什么有些几千就行,有些需要几万甚至几十万不等?可以肯定地说:化工产品网络优化的费用并非一成不变,而是受到多种因素的影响。今天湖南竑图网络给大家…

ucosii+STM32 BLDC电机控制器设计 附源程序Proteus仿真

资料下载地址:ucosiiSTM32 BLDC电机控制器设计 附源程序Proteus仿真 嵌入式,现在把我的程序和设计思路分享给大家。 软件所用版本如下 Proteus版本 SP 8.7 STM32CubeMX 版本 5.4.0 HAL固件库版本 1.8.0 Keil 版本 uVison5 一、设计思路: …

如何构建出更好的大模型RAG系统?

ChatGPT爆火之后,以ChatPDF为首的产品组合掀起了知识库问答的热潮。 在过去一整年中,大多数人都在完成RAG系统到高级RAG系统的迭代升级。但是技术发展是迅速的,如何深入了解RAG的发展,做出更好的RAG系统,其实还是非常…

手术缝合线合格品检测项目众多 线径又是其重要一环!

手术缝合线的合格与否,关系着使用及恢复情况,其品质的优劣非常重要,而要想得到合格的手术缝合线,则需要多种类型的仪器进行检测。其中线径就是重要一环,下面来看看线径检测仪,并简单介绍一下其他所需检测信…

C++中stack类和queue类

感谢大佬的光临各位,希望和大家一起进步,望得到你的三连,互三支持,一起进步 数据结构习题_LaNzikinh篮子的博客-CSDN博客 初阶数据结构_LaNzikinh篮子的博客-CSDN博客 收入专栏:C_LaNzikinh篮子的博客-CSDN博客 其他专…

显示数量以及坐标区间

import re import numpy as np import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties# 动态加载字体文件 font_path /usr/local/sunlogin/res/font/wqy-zenhei.ttc # 替换为实际字体路径 my_font FontProperties(fnamefont_path)# 定义日志…

软件需求规格说明书编制模板参考(Doc原件)

1 范围 1.1 系统概述 1.2 文档概述 1.3 术语及缩略语 2 引用文档 3 需求 3.1 要求的状态和方式 3.2 系统能力需求 3.3 系统外部接口需求 3.3.1 管理接口 3.3.2 业务接口 3.4 系统内部接口需求 3.5 系统内部数据需求 3.6 适应性需求 3.7 安全性需求 3.8 保密性需…

个人量化成功之路-----从 Yahoo! Finance 下载交易策略数据

雅虎财经 是投资者最受欢迎的网站之一。它提供有关股票、债券、货币和加密货币的各种市场数据。它还提供市场新闻、报告和分析、期权和基本数据 官方的雅虎财经 API 于 2017 年被下架 Yfinance 是由 Ran Aroussi 开发的开源 Python 库,用于访问雅虎财经上可用的财…

mysql 报 ERROR 1273: Unknown collation: ‘utf8mb4_0900_ai_ci‘ 的处理

1、数据库sql是mysql8的导出的,本机上安装的还是5.7的版本,然后导入sql,直接就报错。 2、mysql的下载地址: MySQL :: Download MySQL Community Server 3、报错截图: 4、重新选择一个collation就可以了,…

气膜建筑的维护与维修:延长使用寿命的关键—轻空间

气膜建筑以其快速搭建、低成本和灵活的空间设计,被广泛应用于体育馆、仓储设施等多个领域。然而,随着时间的推移,气膜建筑的结构和材料在使用过程中不可避免地受到环境和使用条件的影响,因此定期维护和必要的维修显得尤为重要。了…

每日1题-2

2207 字符串中最多数目的子序列 本题要找pattern在text出现的次数 然后在插入pattern中的一个字符 得到更多的出现次数 很容易想到先求出不插入字符前 子序列出现的次数 我们可以用遍历的方式 让pattern[0]为x pattern[1]为y 遍历text遇到x让x数目加1 遇到y让y数目加1 总数ans…

CSRF中级防御绕过

1)回顾low级别做过csrf页面的密码重置,重复之前的操作,我们发现级别调整中级之后,报错如下 2)查看源码 $_SERVER[‘HTTP_REFERER’]:上一次的请求的url$_SERVER[‘SERVER_NAME’]:当前的服务器的host代码&…

文献笔记 - Reinforcement Learning for UAV Attitude Control

这篇博文是自己看文章顺手做的笔记 只是简单翻译和整理 仅做个人参考学习和分享 如果作者看到觉得内容不妥请联系我 我会及时处理 本人非文章作者,文献的引用格式如下,原文更有价值 Koch W, Mancuso R, West R, et al. Reinforcement learning for UA…

电子信息制造业数据安全如何防护?有什么加密方案?

电子信息制造业数据加密解决方案 问题 1.电子文档(源代码、设计图纸、设计方案等)均要做数据保护措施,防止内部人员有意或无意造成数据泄露; 2.与外部企业之间往来的外发文件,管控不当,容易造成泄密&…

【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析

文章目录 C string 类详解:从入门到精通前言第一章:C 语言中的字符串 vs C string 类1.1 C 语言中的字符串1.2 C string 类的优势 第二章:string 类的构造与基础操作2.1 string 类的构造方法2.1.1 示例代码:构造字符串 2.2 string…