当前位置: 首页 > news >正文

esp32s3聊天机器人(三)

先放上最新的硬件图

在这里插入图片描述
添加了按钮、600毫安锂电池和充电板
在这里插入图片描述
在这里插入图片描述

关于 sherpa-onnx 语音生成的打断

按说明实现了一下,但是偶尔还是有问题,毕竟不是直接立刻打断生成

        private int OnAudioData(nint samples, int n){//Console.WriteLine("OnAudioData n:" + n);if (stopped){sendQueue.Clear();sendQueue = new(10240000 * 2);Console.WriteLine("停止生成");stopped = false;return 0;}float[] floatData = new float[n];Marshal.Copy(samples, floatData, 0, n);short[] shortData = new short[n];for (int i = 0; i < n; i++){shortData[i] = Math.Clamp((short)(floatData[i] * 32768f), short.MinValue, short.MaxValue);}HandleFloatData(shortData);return n;}

在生成过程中返回0就是停止生成,但是这个OnAudioData是个回调,需要等到有音频返回的时候才能停止…… 不知道为啥没有别的停止方法

关于语音增强

去除了之前的RNNoise.Net,改用OfflineSpeechDenoiser

           OfflineSpeechDenoiserGtcrnModelConfig osdgmc = new OfflineSpeechDenoiserGtcrnModelConfig();osdgmc.Model = Environment.CurrentDirectory + "/gtcrn_simple.onnx";OfflineSpeechDenoiserModelConfig osdmc = new OfflineSpeechDenoiserModelConfig();osdmc.NumThreads = numThreads;osdmc.Provider = "cpu";osdmc.Debug = 0;osdmc.Gtcrn = osdgmc;OfflineSpeechDenoiserConfig osdc = new OfflineSpeechDenoiserConfig();osdc.Model = osdmc;offlineSpeechDenoiser = new OfflineSpeechDenoiser(osdc);
        DenoisedAudio denoisedAudio;/// <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;}// 语音增强denoisedAudio = offlineSpeechDenoiser.Run(floatArray, sampleRate);floatArray = denoisedAudio.Samples; keyword.Recognize(floatArray);offlineStream = recognizer.CreateStream();offlineStream.AcceptWaveform(sampleRate, floatArray);recognizer.Decode(offlineStream);string result = offlineStream.Result.Text;offlineStream.Dispose();Console.WriteLine("识别结果:" + 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);}}}

关于多用户

最初的构想是服务端可以接入多个客户端,实际用发现,我电脑性能太差,而且ASR和TTS的初始化挺费时间的,直接改成了单用户

using Fleck;
using Newtonsoft.Json;namespace server
{public class Server{WebSocketServer webSocketServer = null;Asr asr = null;Tts tts = null;Llm llm = null;public Server(){asr = new Asr();llm = new Llm();tts = new Tts();llm.tts = tts;asr.llm = llm;Console.WriteLine("tts llm asr ok");webSocketServer = new WebSocketServer("ws://192.168.0.164:9999");//webSocketServer.Certificate =//    new System.Security.Cryptography.X509Certificates.X509Certificate2(//        Environment.CurrentDirectory + "/usherpa.xuefei.net.cn.pfx", "xb5ceehg");//webSocketServer.EnabledSslProtocols = System.Security.Authentication.SslProtocols.Tls12; //开启监听webSocketServer.Start(OnStart);}private void OnStart(IWebSocketConnection connection){connection.OnOpen += () => OnOpen(connection);connection.OnBinary = bytes => OnBinary(connection, bytes);connection.OnMessage = msg => OnMessage(connection, msg);connection.OnClose += () => OnClose(connection);}private void OnOpen(IWebSocketConnection connection){ tts.UpdateClient(connection);asr.UpdateClient(connection);Console.WriteLine("上线了");}private void OnBinary(IWebSocketConnection connection, byte[] bytes){if (asr != null){asr.Receive(bytes);}}private 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 0时,心跳消息if (baseMsg.code == 0){}// 收到code 1时,开始录音if (baseMsg.code == 1){if (tts != null){tts.Interrupt();}}// 收到code 2时,开始识别if (baseMsg.code == 2){if (asr != null){asr.EndReceive();}}}}private void OnClose(IWebSocketConnection connection){tts.UpdateClient(null);asr.UpdateClient(null);Console.WriteLine("下线了");}~Server(){if (asr != null){asr.Stop();}if (tts != null){tts.Stop();}webSocketServer.Dispose();}}
}

esp32s3聊天机器人

工程地址,持续修改中
https://github.com/xue-fei/homeai
https://gitee.com/awnuxcvbn/homeai

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

相关文章:

  • QTcpSocket多线程连接慢问题
  • Tekton系列之实践篇-从触发到完成的完整执行过程
  • 蓝桥杯高频考点——搜索(含C++源码)
  • C++学习:六个月从基础到就业——C++基础语法回顾:指针与引用基础
  • html和css 实现元素顺时针旋转效果(椭圆形旋转轨迹)
  • 【react】在react中async/await一般用来实现什么功能
  • 【Java】Springboot集成itextpdf制作pdf(内附pdf添加表格、背景图、水印,条形码、二维码,页码等功能)
  • 从医疗大模型到综合医疗智能体:算法、架构与路径全流程分析
  • aws S3利用lambda edge实现图片缩放、质量转换等常规图片处理功能
  • Java 线程池全面解析
  • Linux输入系统应用编程
  • 【linux重设gitee账号密码 克隆私有仓库报错】
  • 3、孪生网络/连体网络(Siamese Network)
  • 【WebGIS教程1】WebGIS学习初步知识了解 · 概述
  • 2025最新版Ubuntu Server版本Ubuntu 24.04.2 LTS下载与安装-详细教程,细致到每一步都有说明
  • Linux--环境变量
  • 向量数据库学习笔记(1) —— 基础概念
  • djinn: 1靶场渗透测试
  • 微服务面试题:分布式事务和服务监控
  • 中学数学几百年重大错误:将无穷多各异假R误为R——两数集相等的必要条件