const WebSocket = require("ws");
const fs = require("fs");
const API_KEY = process.env.SMALLEST_API_KEY;
const AUDIO_FILE = "path/to/audio.wav";
const url = new URL("wss://waves-api.smallest.ai/api/v1/lightning/get_text");
url.searchParams.append("language", "en");
url.searchParams.append("encoding", "linear16");
url.searchParams.append("sample_rate", "16000");
url.searchParams.append("word_timestamps", "true");
const ws = new WebSocket(url.toString(), {
headers: {
Authorization: `Bearer ${API_KEY}`,
},
});
ws.on("open", () => {
console.log("Connected to STT WebSocket");
const audioBuffer = fs.readFileSync(AUDIO_FILE);
const chunkSize = 4096;
let offset = 0;
const sendChunk = () => {
if (offset >= audioBuffer.length) {
console.log("Finished sending audio, sending end signal...");
ws.send(JSON.stringify({ type: "end" }));
return;
}
const chunk = audioBuffer.slice(offset, offset + chunkSize);
ws.send(chunk);
offset += chunkSize;
setTimeout(sendChunk, 50); // 50ms delay between chunks
};
sendChunk();
});
ws.on("message", (data) => {
try {
const message = JSON.parse(data.toString());
console.log("Received:", JSON.stringify(message, null, 2));
// Handle partial transcripts
if (!message.is_final) {
console.log(`Partial: ${message.transcript}`);
} else {
console.log(`Final: ${message.transcript}`);
console.log(`Full transcript: ${message.full_transcript}`);
if (message.is_last) {
console.log("Transcription complete!");
ws.close();
}
}
} catch (error) {
console.error("Error parsing message:", error);
}
});
ws.on("error", (error) => {
console.error("WebSocket error:", error.message);
});
ws.on("close", (code, reason) => {
console.log(`Connection closed: ${code} - ${reason.toString()}`);
});