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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在 IntelliJ IDEA(2024) 中创建 JAR 包步骤

下是在 IntelliJ IDEA 中创建 JAR 包的详细的步骤&#xff1a; ​1. 选择File -> Project Structure->Artifacts&#xff0c; (1)点击➕新建&#xff0c;如下图所示&#xff1a; (2)选择JAR->Empty (3)输入jar包名称&#xff0c;确定输出路径 &#xff08;4&#…

自学Java-JavaSE基础加强(多线程)

自学Java-JavaSE基础加强&#xff08;多线程&#xff09; 一、创建线程1、方式一&#xff1a;继承Thread类小结 2、方式二&#xff1a;实现Runnable接口小结 3、方式三&#xff1a;实现Callable接口4、小结 二、线程的常用方法三、线程安全1、认识线程安全2、模拟线程安全问题3…

香港电讯CE2.0网络全面升级,100G服务支援企业关键应用

随着人工智能&#xff08;AI&#xff09;和新兴科技的应用日益俱增&#xff0c;安全可靠、高速稳定的网络对现今企业而言尤关重要。香港电讯作为香港及大湾区企业信赖的科技解决方案提供者&#xff0c;一直致力为企业客户提供面向未来的网络方案&#xff0c;为不同行业的网络需…

算法-图-dijkstra 最短路径

理论知识 dijkstra三部曲 朴素版dijkstra 模拟过程 堆优化版dijksra 经典模版例题 Dijkstra求最短路 I 参加科学大会&#xff08;第六期模拟笔试&#xff09;--模版题 网络延迟 ref 理论知识 最短路是图论中的经典问题即&#xff1a;给出一个有向图&#xff0c;一…

【leetcode hot 100 48】旋转图像

方法一&#xff1a;&#xff08;原地旋转&#xff09;对于矩阵中第 i 行的第 j 个元素&#xff0c;在旋转后&#xff0c;它出现在倒数第 i 列的第 j 个位置。matrix[row][col]在旋转后的新位置为matrix[col][n−row−1]。只要旋转四次就能回到原点。 class Solution {public vo…

Vue Hooks 深度解析:从原理到实践

Vue Hooks 深度解析&#xff1a;从原理到实践 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff01;点我试试&#xff01;&#xff01; 文章目录 Vue Hooks 深度解析&#xff1a;从原理到实践一、背景…

ESP32S3读取数字麦克风INMP441的音频数据

ESP32S3 与 INMP441 麦克风模块的集成通常涉及使用 I2S 接口进行数字音频数据的传输。INMP441 是一款高性能的数字麦克风&#xff0c;它通过 I2S 接口输出音频数据。在 Arduino 环境中&#xff0c;ESP32S3 的开发通常使用 ESP-IDF&#xff08;Espressif IoT Development Framew…

逐行拆解 C 语言:数据类型、变量

今日&#xff0c;我们即将踏上一段充满趣味与挑战的学习之旅&#xff0c;深度钻研数据类型的多样奥秘&#xff0c;解锁变量创建的实用技巧。不仅如此&#xff0c;还会邂逅两个实用的基础库函数&#xff0c;探索它们在程序中穿针引线的奇妙作用。同时&#xff0c;几个简洁却强大…

【Java数据结构】前K个高频单词

前K个高频单词 692. 前K个高频单词 - 力扣&#xff08;LeetCode&#xff09; 解决这个问题我们先得知道每个单词出现的次数&#xff0c;用map存储下来&#xff0c;然后将出现次数最多的通过建立小根堆解决top-K问题 &#xff0c;重点是top-K的求取。 1.建立map 首先我们可以…

锂电池升压到5V并且可以锂电池充电的芯片SM5401

收拾旧物时发现一个旧台灯&#xff0c;正好又有一节锂电池&#xff0c;于是想改成&#xff1a;用锂电池给台灯供电&#xff08;台灯是5V的&#xff09;&#xff0c;并且可以通过USB给锂电池充电。 于是找到了SM5401这个芯片。 SM5401 可以把锂电池电压升压成5V输出&#xff0c…

大模型工程师学习日记(十五):Hugging Face 模型微调训练(基于 BERT 的中文评价情感分析)

1. datasets 库核心方法 1.1. 列出数据集 使用 d atasets 库&#xff0c;你可以轻松列出所有 Hugging Face 平台上的数据集&#xff1a; from datasets import list_datasets# 列出所有数据集 all_datasets list_datasets()print(all_datasets)1.2. 加载数据集 你可以通过 l…

高考數學。。。

2024上 具体来说&#xff0c;直线的参数方程可以写为&#xff1a; x1t y−t z1t 二、简答题(本大题共5小题&#xff0c;每小题7分&#xff0c;共35分。) 12.数学学习评价不仅要关注结果评价&#xff0c;也要关注过程评价。简要说明过程评价应关注哪几个方面。…

Seurat - Guided Clustering Tutorial官方文档学习及复现

由于本人没有使用过Seurat4.0&#xff0c;而是直接使用的最新版。所以本文都是基于Seurat5.2.0&#xff08;截止2025/3/6&#xff09;来进行撰写。 参考的官方教程来进行学习&#xff08;上图中的 Guided tutorial-2.700 PBMCs&#xff09;&#xff0c;肯定没有官方文档那么全面…

(undone) MIT6.S081 Lec14 File systems 学习笔记

url: https://mit-public-courses-cn-translatio.gitbook.io/mit6-s081/lec14-file-systems-frans Why Interesting 从一个问题开始&#xff1a;既然你每天都使用了文件系统&#xff0c;XV6的文件系统与你正在使用的文件系统有什么区别。接下来我会点名&#xff1a; 学生回答…

【C++进阶学习】第一讲——继承(下)---深入挖掘继承的奥秘

目录 1.隐藏 1.1隐藏的概念 1.2隐藏的两种方式 2.继承与友元 3、继承与静态成员 4.单继承和多继承 4.1单继承 4.2多继承 5.菱形继承 问题1&#xff1a;冗余性 问题2&#xff1a;二义性 6.虚拟继承 7.总结 1.隐藏 1.1隐藏的概念 在 C 中&#xff0c;继承是一种机制…

UI自动化:利用百度ocr识别解决图形验证码登录问题

相信大家在做自动化测试过程中都遇到过图形验证码的问题&#xff0c;最近我也是遇到了&#xff0c;网上搜了很多方法&#xff0c;最简单的方法无非就是去掉图形验证码或者设置一个万能验证码&#xff0c;但是这个都需要开发来帮忙解决&#xff0c;对于我们这种自学的人来说就不…

C/C++蓝桥杯算法真题打卡(Day1)

一、LCR 018. 验证回文串 - 力扣&#xff08;LeetCode&#xff09; 算法代码&#xff1a; class Solution { public:bool isPalindrome(string s) {int n s.size();// 处理一下s为空字符的情况if (n 0) {return true; // 修正拼写错误}// 定义左右指针遍历字符串int left …

蓝桥杯备考:动态规划路径类DP之矩阵的最小路径和

如题&#xff0c;要求左上角到右下角的最短路径&#xff0c;我们还是老样子按顺序做 step1:确定状态表示 f[i][j]表示(1,1)到(i,j)的最短距离 step2 :推导状态表达方程 step3:确定填表顺序&#xff0c;应该是从上到下&#xff0c;从左到右 step4:初始化 step5 找结果&#…

18类创新平台培育入库!长沙经开区2025年各类科技创新平台培育申报流程时间材料及申报条件

长沙经开区打算申报企业研发中心、技术创新中心、工程技术研究中心、新型研发机构、重点实验室、概念验证中心和中试平台、工程研究中心、企业技术中心、制造业创新中心、工业设计中心等创新平台的可先备案培育入库&#xff0c;2025年各类平台的认定将从培育库中优先推荐&#…

CyberDefenders----WebStrike Lab

WebStrike Lab 实验室链接 简介: 公司网络服务器上发现了一个可疑文件,在内联网中发出警报。开发团队标记了异常,怀疑存在潜在的恶意活动。为了解决这个问题,网络团队捕获了关键网络流量并准备了一个 PCAP 文件以供审查。您的任务是分析提供的 PCAP 文件以发现文件的出现…