UNPKG

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
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