AMB82-MINI speech to text

i am working on ameba speech to ext with the help of google speech to text api now facing problem in File file = fs.open("/voice.mp4", FA_READ); // OK my complete code is `#include <WiFi.h>
#include “StreamIO.h”
#include “AudioStream.h”
#include “AudioEncoder.h”
#include “MP4Recording.h”
#include “AmebaFatFS.h”
#include <HttpClient.h>

// Wi-Fi and API Configuration
char ssid = “YOUR_WIFI_SSID”;
char password = “YOUR_WIFI_PASSWORD”;
const char* googleSTTEndpoint = “https://speech.googleapis.com/v1/speech:recognize?key=YOUR_GOOGLE_API_KEY”;

// Audio Setup
AudioSetting configA(3); // 16kHz digital PDM mic
Audio audio;
AAC aac;
MP4Recording mp4;
StreamIO audioStreamer1(1, 1);
StreamIO audioStreamer2(1, 1);

AmebaFatFS fs;
File audioFile;

// Lightweight base64 encoder
String base64Encode(uint8_t* data, size_t length) {
const char base64_chars = “ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”;
String encoded = “”;
int i = 0;
uint8_t a3[3];

while (length–) {
a3[i++] = *(data++);
if (i == 3) {
encoded += base64_chars[(a3[0] & 0xfc) >> 2];
encoded += base64_chars[((a3[0] & 0x03) << 4) | ((a3[1] & 0xf0) >> 4)];
encoded += base64_chars[((a3[1] & 0x0f) << 2) | ((a3[2] & 0xc0) >> 6)];
encoded += base64_chars[a3[2] & 0x3f];
i = 0;
}
}

if (i) {
for (int j = i; j < 3; j++) {
a3[j] = ‘\0’;
}

encoded += base64_chars[(a3[0] & 0xfc) >> 2];
encoded += base64_chars[((a3[0] & 0x03) << 4) | ((a3[1] & 0xf0) >> 4)];
encoded += (i == 1) ? '=' : base64_chars[((a3[1] & 0x0f) << 2) | ((a3[2] & 0xc0) >> 6)];
encoded += '=';

}

return encoded;
}

void setup() {
Serial.begin(115200);
delay(500);

// Connect Wi-Fi
WiFi.begin(ssid, password);
Serial.print(“Connecting to Wi-Fi”);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(“.”);
delay(500);
}
Serial.println(“\nWi-Fi connected!”);

// Mount filesystem
if (!fs.begin()) {
Serial.println(“File system init failed!”);
return;
}

// Configure audio
audio.configAudio(configA);
audio.begin();

aac.configAudio(configA);
aac.begin();

mp4.configAudio(configA, CODEC_AAC);
mp4.setRecordingDuration(5); // Record for 5 seconds
mp4.setRecordingFileCount(1);
mp4.setRecordingFileName(“voice”);
mp4.setRecordingDataType(STORAGE_AUDIO);

audioStreamer1.registerInput(audio);
audioStreamer1.registerOutput(aac);
if (audioStreamer1.begin() != 0) {
Serial.println(“StreamIO1 start failed”);
}

audioStreamer2.registerInput(aac);
audioStreamer2.registerOutput(mp4);
if (audioStreamer2.begin() != 0) {
Serial.println(“StreamIO2 start failed”);
}

// Start Recording
Serial.println(“Recording 5 seconds…”);
mp4.begin();
delay(6000);
Serial.println(“Recording finished.”);

// Send to Google STT
sendToGoogleSTT(“/voice.mp4”);
}

void loop() {
// No repeated action required
}

void sendToGoogleSTT(String filename) {

File file = fs.open(“/voice.mp4”, FA_READ); // OK

if (!file) {
Serial.println(“Failed to open audio file”);
return;
}

size_t fileSize = file.size();
uint8_t* buffer = (uint8_t*)malloc(fileSize);
if (!buffer) {
Serial.println(“Memory allocation failed”);
file.close();
return;
}

file.read(buffer, fileSize);
file.close();

String audioBase64 = base64Encode(buffer, fileSize);
free(buffer);

// Build JSON request
String payload = “{”;
payload += “"config":{”;
payload += “"encoding":"MP4",”;
payload += “"sampleRateHertz":16000,”;
payload += “"languageCode":"en-US"”;
payload += “},”;
payload += “"audio":{”;
payload += “"content":"” + audioBase64 + “"”;
payload += “}}”;

WiFiClientSecure client;
HttpClient http(client, “speech.googleapis.com”, 443);

http.beginRequest();
http.post(“/v1/speech:recognize?key=YOUR_GOOGLE_API_KEY”);
http.sendHeader(“Content-Type”, “application/json”);
http.sendHeader(“Content-Length”, payload.length());
http.beginBody();
http.print(payload);
http.endRequest();

int status = http.responseStatusCode();
Serial.print("Google STT response code: ");
Serial.println(status);

if (status > 0) {
String response = http.responseBody();
Serial.println(“Response:”);
Serial.println(response);

int start = response.indexOf("\"transcript\":\"") + 14;
int end = response.indexOf("\"", start);
if (start > 13 && end > start) {
  String transcript = response.substring(start, end);
  Serial.print("Recognized Speech: ");
  Serial.println(transcript);
} else {
  Serial.println("No transcript found.");
}

} else {
Serial.println(“STT request failed.”);
}

http.stop();
}
`