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

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

相关文章:

  • 使用STM32CubeMX实现LED灯每秒闪烁一次(STM32G070CBT6单片机)
  • 深入理解 HTML 元素:构建网页的基础
  • 贪心算法二
  • mosquitto ds笔记250306
  • Linux网络编程
  • Scala:case class(通俗易懂版)
  • 如何禁止电脑中某个应用联网
  • C++ 学生成绩管理系统
  • 腾讯云对象存储服务(COS)
  • 爬虫逆向:脱壳工具ZjDroid的使用详解
  • Oracle数据导入导出小工具(主要用于导入导出小批量含大字段的数据)
  • Linux - 网络套接字
  • MVC模式全解析
  • 鸿蒙全栈开发 D2
  • PromotionNotice对象获取异常记录
  • 十二、OSG学习笔记-Control
  • 手游ASO优化:2025年核心策略与未来趋势
  • DropDown的使用总结
  • C/C++蓝桥杯算法真题打卡(Day1)
  • 如何面向DeepSeek编程,打造游戏开发工具集,提升工作效率
  • 上海手机网站制作公司/百度推广电话客服
  • 哪个网站可以做视频播放器/长沙弧度seo
  • 登录建设官方网站/整站seo优化公司
  • 网页网站公司如何做备份/域名访问网站
  • 网站开发一般需要多久/常见的搜索引擎有哪些
  • 南昌金启网站建设/关键词优化seo外包