ESP32+INMP441+DHT11+OLED+网页+Arduino——“智能”语音天气站(4):百度语音识别API(2)(片外RAM的使用)

本文讲述了在ESP32上实现智能语音天气站时遇到的SPIFFS读写速度问题,转而使用片外RAM存储录音数据,并通过百度语音识别API进行识别的过程。在调试中,作者详细描述了如何分配和调试片外RAM,以及解决写入数据错误的方法。最后指出,虽然识别率问题尚存,但后续会继续改进并整合前端模块。
摘要由CSDN通过智能技术生成

上回书说到,我们将录音保存成wav文件,上传到SPIFFS,再用HTTPClient,用RAW方式上传文件数据到百度语音是被API进行识别。然而,问题发生了,这个识别率很低。上一章中我列举出了我猜想的几个原因,在测试过其他原因无果之后,就只剩下一个——SPIFFS的读写速度问题。这次我们弃用SPIFFS,将录音数据存入buffer中,再传到服务端。此过程中,由于使用的buffer过大,不能将buffer放在内存当中,所幸查了官方资料,有片外RAM的存在,所以顺带也学习了一下片外RAM的调用和调试。

片外RAM的调用

官方文件里的调用函数贴在下方:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
根据官方的指示,可以得到如下调用代码:

byte* i2s_read_buff = (byte*) heap_caps_malloc(i2s_read_len, MALLOC_CAP_8BIT);
    // 是否分配成功
    if(i2s_read_buff == NULL)
      Serial.println("read buffer allocate error!");
    else
      Serial.println("read buffer allocate success.");
byte* sound_buff = (byte*) heap_caps_malloc
ESP32使用InMMP441麦克风配合百度语音识别服务,你需要分几个步骤完成。首先,请注意百度已经停止提供语音识别服务API,如果你需要进行语音识别,建议考虑使用百度的云语音识别服务或其他开源的语音识别平台。然而,为了给你一个概念,我会给出一个基本的示例,展示如何获取音频数据并通过HTTP请求发送至云端,假设你有一个虚拟的语音识别服务: ```cpp #include <WiFiClientSecure.h> // 如果你的网络是HTTPS #include <WiFi.h> #include <ArduinoJson.h> // 替换为你的百度语音识别服务地址和API密钥 const char* server_url = "http://your_baidu_recognition_service.com"; const char* api_key = "your_api_key"; // InMMP441麦克风相关的配置 const int micPin = A0; // 这里假设麦克风连接到A0 int buffer[BUF_SIZE]; int bufIndex = 0; void setup() { // WiFi和服务器连接设置 WiFi.begin("Your_SSID", "Your_Password"); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("Connected to WiFi"); Serial.begin(115200); // 开始串口通信,方便查看日志 // 初始化音频捕获 // 参考上面的"初始化麦克风硬件"部分 } void loop() { // 获取音频数据 for (int i = 0; i < BUF_SIZE; ++i) { buffer[i] = analogRead(micPin); } // 包装音频数据作为HTTP POST请求体 DynamicJsonDocument doc(BUF_SIZE); JsonArray& arr = doc.createNestedArray(); for (int i = 0; i < BUF_SIZE; ++i) { arr.add(buffer[i]); } String jsonData = doc.toStyledString(); // 发送HTTP请求 WiFiClientSecure client; if (!client.connect(server_url)) { Serial.println("Connection failed"); return; } client.print(String("POST /api/voice_recognition HTTP/1.1\r\n")); client.print("Content-Type: application/json\r\n"); client.print("Authorization: Bearer "); client.print(api_key); client.print("\r\n\r\n"); client.print(jsonData); size_t contentLength = client.write(jsonData.c_str(), jsonData.length()); if (contentLength <= 0) { Serial.println("Error sending data"); client.stop(); } // 接收响应并处理(这里只是一个简化版本,实际应用中可能需要解析JSON响应) client.stop(); // 假设服务器返回的是空响应 Serial.println("Request sent"); delay(1000); // 控制频率,避免过于频繁的请求 } ``` 请注意,这只是一个基础示例,实际操作中你可能需要处理更多细节,比如错误处理、断点续传以及异步请求等。同时,由于百度不再直接提供语音识别服务,上述代码可能无法直接工作,你需要查阅替代方案的文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值