Spaces:
Running
Running
//load the candle Whisper decoder wasm module | |
import init, { Decoder } from "./build/m.js"; | |
async function fetchArrayBuffer(url) { | |
const res = await fetch(url, { | |
cache: "force-cache", | |
headers: { | |
"Cache-Control": "public, max-age=31536000", | |
}, | |
}); | |
const data = await res.arrayBuffer(); | |
return new Uint8Array(data); | |
} | |
class Whisper { | |
static instance = {}; | |
// Retrieve the Whisper model. When called for the first time, | |
// this will load the model and save it for future use. | |
static async getInstance(weightsURL, modelID, tokenizerURL, mel_filtersURL) { | |
// load individual modelID only once | |
if (!this.instance[modelID]) { | |
await init(); | |
self.postMessage({ status: "loading", message: "Loading Model" }); | |
const [weightsArrayU8, tokenizerArrayU8, mel_filtersArrayU8] = | |
await Promise.all([ | |
fetchArrayBuffer(weightsURL), | |
fetchArrayBuffer(tokenizerURL), | |
fetchArrayBuffer(mel_filtersURL), | |
]); | |
this.instance[modelID] = new Decoder( | |
weightsArrayU8, | |
tokenizerArrayU8, | |
mel_filtersArrayU8 | |
); | |
} else { | |
self.postMessage({ status: "loading", message: "Model Already Loaded" }); | |
} | |
return this.instance[modelID]; | |
} | |
} | |
self.addEventListener("message", async (event) => { | |
const { weightsURL, modelID, tokenizerURL, mel_filtersURL, audioURL } = | |
event.data; | |
try { | |
self.postMessage({ status: "decoding", message: "Starting Decoder" }); | |
const decoder = await Whisper.getInstance( | |
weightsURL, | |
modelID, | |
tokenizerURL, | |
mel_filtersURL | |
); | |
self.postMessage({ status: "decoding", message: "Loading Audio" }); | |
const audioArrayU8 = await fetchArrayBuffer(audioURL); | |
self.postMessage({ status: "decoding", message: "Running Decoder..." }); | |
const segments = decoder.decode(audioArrayU8); | |
// Send the segment back to the main thread as JSON | |
self.postMessage({ | |
status: "complete", | |
message: "complete", | |
output: JSON.parse(segments), | |
}); | |
} catch (e) { | |
self.postMessage({ error: e }); | |
} | |
}); | |