esp32s3聊天机器人(二)
继续上文,硬件软件准备齐全,介绍一下主要用到的库
sherpa-onnx
开源的,语音转文本、文本转语音、说话人分类和 VAD,关键是支持C#开发
OllamaSharp
用于连接ollama,如其名C#开发
虽然离可玩还有一段距离,但是还是要说一下目前遇到的一些问题
1、最初使用流式语音识别,但录音流发送到server之后,完全识别不到文字,保存为pcm播放发现完全是噪音,最后转换放大了音频可以正确识别到说话内容了
static float gain = 5.0f;
short[] int16Array;
float[] floatArray;
public void Recognize(byte[] bytes)
{//Console.WriteLine("收到音频长度:"+ bytes.Length);int16Array = new short[bytes.Length / 2];Buffer.BlockCopy(bytes, 0, int16Array, 0, bytes.Length);floatArray = new float[int16Array.Length];for (int i = 0; i < int16Array.Length; i++){floatArray[i] = int16Array[i] / 32768.0f * gain;}onlineStream.AcceptWaveform(sampleRate, floatArray);
}
2、流式识别有个问题,我说下一句话的时候才会确定上一句结束,虽然有三个参数可调,但我多次测试,没调好,只好改用离线识别,给esp32s3添加个按键,按下开始发送录音数据,松开停止发送并告知录音结束,server端再开始识别
//默认值config.Rule1MinTrailingSilence = 2.4f;config.Rule2MinTrailingSilence = 0.5f;//限制最长说话10秒config.Rule3MinUtteranceLength = 10f;
void loop() {webSocket.loop(); // 必须调用以处理WebSocket事件 if(digitalRead(PIN_BUTTON) == LOW){pressed = true;uint8_t buffer[BUFFER_SIZE];size_t bytesRead;// 从I2S读取音频数据i2s_read(I2S_NUM_0, buffer, BUFFER_SIZE, &bytesRead, portMAX_DELAY);// 通过WebSocket发送音频数据if (webSocket.sendBIN(buffer, bytesRead)) {//Serial.printf("Sent %d bytes of audio data\n", bytesRead); } else {//Serial.println("Failed to send audio data");}}else{if(pressed){ pressed = false;if (webSocket.sendTXT("{\"code\":1,\"message\":\"结束语音\"}")) {} else {}}}
}
private static void OnMessage(IWebSocketConnection connection, string msg){BaseMsg baseMsg = null;try{baseMsg = JsonConvert.DeserializeObject<BaseMsg>(msg);}catch (Exception e){Console.WriteLine(e);}if (baseMsg != null){// 收到code 1时,结束录音开始识别if (baseMsg.code == 1){Asr asr = null;asrs.TryGetValue(connection.GetHashCode(), out asr);if (asr != null){asr.EndReceive();}}}}
3、周围人多声音嘈杂的时候,语音识别开始放飞自我,七八米开外的人声它都收进来…… 用RNNoise.Net处理了一下,也不知道对不对,感觉有点效果……
https://github.com/Yellow-Dog-Man/RNNoise.Net
/// <summary>/// 识别语音数据/// </summary>short[] int16Array;float[] floatArray;private void Recognize(byte[] bytes){int16Array = new short[bytes.Length / 2];Buffer.BlockCopy(bytes, 0, int16Array, 0, bytes.Length);floatArray = new float[int16Array.Length];for (int i = 0; i < int16Array.Length; i++){floatArray[i] = int16Array[i] / 32768.0f;}// 降噪using (var denoiser = new Denoiser()){int count = denoiser.Denoise(floatArray.AsSpan());Console.WriteLine("denoised count:" + count);}offlineStream = recognizer.CreateStream();offlineStream.AcceptWaveform(sampleRate, floatArray);recognizer.Decode(offlineStream);string result = offlineStream.Result.Text;offlineStream.Dispose();Console.WriteLine("result:" + result);if (!string.IsNullOrWhiteSpace(result)){result = offlinePunctuation.AddPunct(result.ToLower());BaseMsg textMsg = new BaseMsg(1, result);client.Send(JsonConvert.SerializeObject(textMsg));if (llm != null){llm.RequestAsync(result);}}}
4、其他问题,声音卡顿,爆音,音频长了后半段直接爆炸刺啦……
放上最新截图

按键 G47接GND,按钮还没到货……

工程地址,持续修改中
https://github.com/xue-fei/homeai
相关文章:
esp32s3聊天机器人(二)
继续上文,硬件软件准备齐全,介绍一下主要用到的库 sherpa-onnx 开源的,语音转文本、文本转语音、说话人分类和 VAD,关键是支持C#开发 OllamaSharp 用于连接ollama,如其名C#开发 虽然离可玩还有一段距离࿰…...
pyside6学习专栏(九):在PySide6中使用PySide6.QtCharts绘制6种不同的图表的示例代码
PySide6的QtCharts类支持绘制各种型状的图表,如面积区域图、饼状图、折线图、直方图、线条曲线图、离散点图等,下面的代码是采用示例数据绘制这6种图表的示例代码,并可实现动画显示效果,实际使用时参照代码中示例数据的格式将实际数据替换即可…...
DVI分配器2进4出,2进8出,2进16出,120HZ
DVI(Digital Visual Interface)分配器GEFFEN/HDD系列是一种设备,它能够将一个DVI信号源的内容复制到多个显示设备上。根据您提供的信息,这里我们关注的是具有2个输入端口和多个(4个、8个或16个)输出端口的D…...
迷你世界脚本文字板接口:Graphics
文字板接口:Graphics 彼得兔 更新时间: 2024-08-27 11:12:18 具体函数名及描述如下: 序号 函数名 函数描述 1 makeGraphicsText(...) 创建文字板信息 2 makeflotageText(...) 创建漂浮文字信息 3 makeGraphicsProgress(...) 创建进度条信息…...
5分钟速览深度学习经典论文 —— attention is all you need
《Attention is All You Need》是一篇极其重要的论文,它提出的 Transformer 模型和自注意力机制不仅推动了 NLP 领域的发展,还对整个深度学习领域产生了深远影响。这篇论文的重要性体现在其开创性、技术突破和广泛应用上,是每一位深度学习研究…...
Cursor + IDEA 双开极速交互
相信很多开发者朋友应该和我一样吧,都是Cursor和IDEA双开的开发模式:在Cursor中快速编写和生成代码,然后在IDEA中进行调试和优化 在这个双开模式的开发过程中,我就遇到一个说大不大说小不小的问题: 得在两个编辑器之间来回切换查…...
HDFS的设计架构
HDFS 是 Hadoop 生态系统中的分布式文件系统,设计用于存储和处理超大规模数据集。它具有高可靠性、高扩展性和高吞吐量的特点,适合运行在廉价硬件上。 1. HDFS 的设计思想 HDFS 的设计目标是解决大规模数据存储和处理的问题,其核心设计思想…...
为wordpress自定义一个留言表单并可以在后台进行管理的实现方法
要为WordPress添加留言表单功能并实现后台管理,你可以按照以下步骤操作: 1. 创建留言表单 首先,你需要创建一个留言表单。可以使用插件(如Contact Form 7)或手动编写代码。 使用Contact Form 7插件 安装并激活Contact Form 7插件。 创建…...
tauri-plugin-shell插件将_blank的a标签用浏览器打开了,,,解决办法
不要使用这个插件,这个插件默认会将网页中a标签为_blank的使用默认浏览器打开,但是这种做法在我的程序里不是很友好,我需要自定义这种行为,当我点击我自己的链接的时候,使用默认浏览器打开,当点击别的链接的…...
【大模型基础_毛玉仁】1.1 基于统计方法的语言模型
【大模型基础_毛玉仁】1.1 基于统计方法的语言模型 1.语言模型基础1.1 基于统计方法的语言模型1.1.1 n-grams 语言模型1.1.2 n-grams 的统计学原理 1.语言模型基础 语言是概率的。语言模型(LanguageModels, LMs)旨在准确预测语言符号的概率。 将按照语…...
使用 Docker 部署 RabbitMQ 并实现数据持久化
非常好!以下是一份完整的 Docker 部署 RabbitMQ 的博客文档,包含从安装到问题排查的详细步骤。你可以直接将其发布到博客中。 使用 Docker 部署 RabbitMQ 并实现数据持久化 RabbitMQ 是一个开源的消息队列系统,广泛应用于分布式系统中。使用…...
Pandas的数据转换函数
Pandas的数据转换函数:map, apply, applymap 参数描述map只用于Series,实现每个值->值的映射apply用于Series实现每个值的处理,用于DataFrame实现某个轴的Series的处理applymap只能用于DataFrame, 用于处理该DataFrame的每个元素 1. map用于Series值…...
影刀 RPA 实战开发阶段总结
目录 1. 影刀 RPA 官方教程的重要性 1.1系统全面的知识体系 1.2 权威准确的技术指导 1.3 贴合实际的案例教学 1.4高效的学习方法引导 2. 官方视频教程与实战 2.1 官方视频教程:奠定坚实基础 2.2 实战:拓展应用视野 3. 往期实战博文导航 3.1 初级…...
Linux系统上安装kafka
目录 1. 安装Java环境 2. 下载和解压Kafka 3. 配置Kafka 4. 启动ZooKeeper和Kafka 5. 测试Kafka 6. 停止服务 7.常见问题 1. 安装Java环境 Kafka依赖Java运行环境(JDK 8或更高版本): # 安装OpenJDK(推荐) yum…...
DeepSeek如何快速开发PDF转Word软件
一、引言 如今,在线工具的普及让PDF转Word成为了一个常见需求,常见的PDF转Word工具有收费的WPS,免费的有PDFGear,以及在线工具SmallPDF、iLovePDF、24PDF等。然而,大多数免费在线转换工具存在严重隐私风险——文件需上…...
虚拟机 | Ubuntu图形化系统: open-vm-tools安装失败以及实现文件拖放
系列文章目录 虚拟机 | Ubuntu 安装流程以及界面太小问题解决 文章目录 系列文章目录虚拟机 | Ubuntu 安装流程以及界面太小问题解决 前言一、VMware Tools 和 open-vm-tools 是什么1、VMware Tools2、open-vm-tools 二、推荐使用open-vm-tools(简单)1、…...
Mysql-经典故障案例(1)-主从同步由于主键问题引发的故障
故障报错 Could not execute Write_rows event on table test.users; Duplicate entry 3 for key PRIMARY, Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the events master log mysql-bin.000031, end_log_pos 3297这是由于从库存在与主库相同主键值,…...
Linux下学【MySQL】中如何实现:多表查询(配sql+实操图+案例巩固 通俗易懂版~)
每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论: 本章是MySQL篇中,非常实用性的篇章,相信在实际工作中对于表的查询,很多时候会涉及多表的查询,在多表查询…...
ubuntu局域网部署stable-diffusion-webui记录
需要局域网访问,如下设置: 过程记录查看源码: 查看源码,原来修改参数:--server-name 故启动: ./webui.sh --server-name0.0.0.0 安装下载记录: 快速下载可设置: export HF_ENDPOI…...
最基于底层的运算符——位运算符
位运算符是直接对二进制位(bit)进行操作的运算符,它们在底层开发、算法优化和特定场景(如位掩码、数据压缩)中非常高效。以下是常见位运算符的详解、使用技巧及注意事项: 一、六大核心位运算符 1. 按位与&…...
迷宫问题求解:从递归到队列的算法实战与性能对比
1. 迷宫问题与三种经典解法 迷宫问题就像我们小时候玩的走迷宫游戏,需要在错综复杂的路径中找到一条从起点到终点的通路。在计算机科学中,迷宫被抽象成一个二维矩阵,其中0代表可通行的路径,1代表障碍物。这个问题看似简单…...
Qwen3.5-9B-AWQ-4bit开源可部署教程:私有云/K8s集群中部署多实例视觉理解服务
Qwen3.5-9B-AWQ-4bit开源可部署教程:私有云/K8s集群中部署多实例视觉理解服务 1. 模型概述 Qwen3.5-9B-AWQ-4bit是一个支持图像理解的多模态模型,能够结合上传图片与文字提示词,输出中文分析结果。这个量化版本特别适合在资源受限的环境中部…...
MiniCPM-o-4.5-nvidia-FlagOS部署运维:使用Docker Compose管理多服务依赖
MiniCPM-o-4.5-nvidia-FlagOS部署运维:使用Docker Compose管理多服务依赖 你是不是也遇到过这种情况?想部署一个AI模型,发现它依赖一堆东西:模型服务本身、数据库、缓存、可能还有别的辅助工具。一个个手动去装、去配置、去启动&…...
水墨江南模型效果对比:不同参数下的笔触与渲染风格
水墨江南模型效果对比:不同参数下的笔触与渲染风格 最近在尝试用AI生成水墨画,发现一个挺有意思的现象:同一个“水墨江南”模型,用不同的参数设置,画出来的效果天差地别。有时候是寥寥几笔的写意小品,有时…...
Ostrakon-VL终端实战:从扫码识别到生成抖音短视频脚本的创意延伸
Ostrakon-VL终端实战:从扫码识别到生成抖音短视频脚本的创意延伸 1. 像素特工终端介绍 想象你是一名零售侦探,手持的不是笨重的扫描枪,而是一个充满复古游戏风格的AI终端。这就是基于Ostrakon-VL-8B模型开发的像素风格交互界面,…...
MyBatis批量更新避坑指南:从`<foreach>`拼接SQL到`allowMultiQueries`配置的完整流程
MyBatis批量更新实战:从基础实现到性能调优全解析 批量更新操作是后端开发中绕不开的高频需求,但很多开发者在初次接触MyBatis批量更新时,往往会陷入各种"坑"中。本文将带你系统掌握两种主流实现方案,从基础用法到性能优…...
HarmonyOS6 半年磨一剑 - RcCheckboxGroup 组件与全选不确定态机制深度解析
文章目录前言一、RcCheckboxGroup 内部状态同步1.1 双层状态管理1.2 选中状态判断二、布局渲染架构2.1 横向与纵向的渲染分支2.2 itemGap 的类型安全处理2.3 属性透传机制三、全选与不确定态(indeterminate)3.1 三态状态机3.2 全选逻辑实现3.3 indetermi…...
Mojo嵌入Python项目的4种架构模式(含GIL绕过实测数据+内存安全验证报告)
第一章:Mojo嵌入Python项目的4种架构模式(含GIL绕过实测数据内存安全验证报告)Mojo 作为兼具 Python 兼容性与系统级性能的新兴语言,其嵌入 Python 项目的能力已通过多种生产就绪架构得到验证。以下四种主流集成模式均在 macOS Ve…...
S2-Pro自动化运维脚本生成:应对Linux服务器常见管理任务
S2-Pro自动化运维脚本生成:应对Linux服务器常见管理任务 1. 运维工程师的新助手 最近遇到个挺有意思的事。我们团队新来的运维小哥,处理服务器问题时总要先翻半天文档,再到处搜脚本模板。看着他手忙脚乱的样子,我突然想起自己刚…...
医疗器械小白必看:B型、BF型、CF型设备到底怎么选?附真实医院案例解析
医疗器械采购指南:B型、BF型与CF型设备的实战选择策略 去年某三甲医院ICU因监护仪选型不当导致患者数据异常的事件,让医疗器械电气安全标准重新成为行业焦点。作为医疗设备采购人员,面对B型、BF型、CF型这些专业术语时,是否常感到…...
