Add Athena Whisper dictation provider to OpenClaw Talk plugin
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
import assert from "node:assert/strict";
|
||||
import { createServer } from "node:http";
|
||||
import { test } from "node:test";
|
||||
import plugin from "./dist/index.js";
|
||||
|
||||
test("dictation registers separately and sends G.711 audio to Athena Whisper", async () => {
|
||||
let transcription;
|
||||
plugin.register({
|
||||
registerRealtimeTranscriptionProvider: (value) => { transcription = value; },
|
||||
registerRealtimeVoiceProvider: () => {},
|
||||
registerHttpRoute: () => {},
|
||||
});
|
||||
assert.equal(transcription.id, "athena-talk");
|
||||
|
||||
let uploads = 0;
|
||||
const server = createServer(async (req, res) => {
|
||||
uploads += 1;
|
||||
assert.equal(req.url, "/v1/audio/transcriptions");
|
||||
assert.equal(req.headers.authorization, "Bearer test-key");
|
||||
const form = await new Request("http://localhost", {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": req.headers["content-type"] },
|
||||
body: req,
|
||||
duplex: "half",
|
||||
}).formData();
|
||||
const wav = Buffer.from(await form.get("file").arrayBuffer());
|
||||
assert.equal(wav.toString("ascii", 0, 4), "RIFF");
|
||||
assert.equal(wav.readUInt32LE(24), 8000);
|
||||
assert.equal(wav.readUInt16LE(34), 16);
|
||||
assert.equal(wav.length, 48);
|
||||
assert.equal(form.get("language"), "de");
|
||||
assert.equal(form.get("model"), "whisper-1");
|
||||
res.writeHead(200, { "Content-Type": "application/json" }).end(JSON.stringify({ text: "Hallo Athena" }));
|
||||
});
|
||||
await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
|
||||
const cfg = { talk: { realtime: { providers: { "athena-talk": {
|
||||
baseUrl: `http://127.0.0.1:${server.address().port}/v1`, apiKey: "test-key", language: "de",
|
||||
} } } } };
|
||||
const providerConfig = transcription.resolveConfig({ cfg, rawConfig: {} });
|
||||
assert.equal(transcription.isConfigured({ cfg, providerConfig }), true);
|
||||
try {
|
||||
const result = new Promise((resolve, reject) => {
|
||||
const session = transcription.createSession({
|
||||
cfg, providerConfig,
|
||||
onTranscript: resolve,
|
||||
onError: reject,
|
||||
});
|
||||
session.connect().then(() => {
|
||||
session.sendAudio(Buffer.from([0xff, 0xff]));
|
||||
session.close();
|
||||
}, reject);
|
||||
});
|
||||
assert.equal(await result, "Hallo Athena");
|
||||
assert.equal(uploads, 1);
|
||||
} finally {
|
||||
server.closeAllConnections();
|
||||
await new Promise((resolve) => server.close(resolve));
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user