whisper-onnx-speech-to-text
Version:
Node.js plugin for speech recognition that works with OpenAI's Whisper models using ONNX.
78 lines • 3.54 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
import wavefile from 'wavefile';
import fs from 'fs';
import path from 'path';
import util from 'util';
import { pipeline, env } from '@xenova/transformers';
import { DEFAULT_MODEL, MODELS_LIST, NODE_MODULES_MODELS_PATH } from './constants.js';
env.local_files_only = true;
env.localModelPath = NODE_MODULES_MODELS_PATH;
env.backends.onnx.wasm.numThreads = 1;
const readFile = util.promisify(fs.readFile);
const modelPromise = (modelName) => {
return new Promise((resolve, reject) => __awaiter(void 0, void 0, void 0, function* () {
try {
if (!MODELS_LIST[modelName])
throw `[whisper-onnx-speech-to-text] modelName "${modelName}" not found in list of models.\n`;
if (!fs.existsSync(`${NODE_MODULES_MODELS_PATH}/${MODELS_LIST[modelName]}`))
throw `[whisper-onnx-speech-to-text] '${modelName}' not downloaded! Run 'npx whisper-onnx-speech-to-text download'\n`;
resolve(yield pipeline("automatic-speech-recognition", MODELS_LIST[modelName], { quantized: false }));
}
catch (err) {
reject(err);
}
}));
};
const prepareAudio = (filePath) => __awaiter(void 0, void 0, void 0, function* () {
const wav = new wavefile.WaveFile(yield readFile(path.normalize(filePath)));
wav.toBitDepth('32f');
wav.toSampleRate(16000);
let audioData = wav.getSamples();
if (Array.isArray(audioData)) {
if (audioData.length > 1) {
const SCALING_FACTOR = Math.sqrt(2);
for (let i = 0; i < audioData[0].length; ++i) {
audioData[0][i] = SCALING_FACTOR * (audioData[0][i] + audioData[1][i]) / 2;
}
}
audioData = audioData[0];
}
return audioData;
});
class Whisper {
constructor(model) {
this.model = model;
}
transcribe(filePath, language) {
return __awaiter(this, void 0, void 0, function* () {
try {
const audioData = yield prepareAudio(filePath);
const lang = language ? { language } : {};
return this.model(audioData, Object.assign({ chunk_length_s: 30, stride_length_s: 5, return_timestamps: true }, lang));
}
catch (error) {
console.log("[whisper-onnx-speech-to-text] Problem:", error);
}
});
}
disposeModel() {
return __awaiter(this, void 0, void 0, function* () {
return this.model.dispose();
});
}
}
export const initWhisper = (modelName) => __awaiter(void 0, void 0, void 0, function* () {
if (!modelName)
console.log("[whisper-onnx-speech-to-text] No 'modelName' provided. Trying default model:", DEFAULT_MODEL, "\n");
const model = yield modelPromise(modelName || DEFAULT_MODEL);
return new Whisper(model);
});
//# sourceMappingURL=index.js.map