30471fa2dc
refactor: migrate from nodemon to http-server for development build: add type module and update package.json scripts
73 lines
2.7 KiB
JavaScript
73 lines
2.7 KiB
JavaScript
// download_models.js
|
|
// This script downloads the required models from Hugging Face to the local 'models' directory.
|
|
|
|
import { exec } from 'child_process';
|
|
import { fileURLToPath } from 'url';
|
|
import path from 'path';
|
|
import fs from 'fs/promises';
|
|
|
|
// Get the directory name of the current module
|
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
|
|
// Define the models to download
|
|
const models = {
|
|
'Xenova/whisper-tiny': 'https://hf-mirror.com/Xenova/whisper-tiny',
|
|
'Xenova/LaMini-Flan-T5-77M': 'https://hf-mirror.com/Xenova/LaMini-Flan-T5-77M',
|
|
'Xenova/speecht5_tts': 'https://hf-mirror.com/Xenova/speecht5_tts',
|
|
};
|
|
|
|
// Define where to save the models
|
|
const modelsPath = path.resolve(__dirname, 'models');
|
|
|
|
// Promisify exec
|
|
const execPromise = (command) => {
|
|
return new Promise((resolve, reject) => {
|
|
exec(command, (error, stdout, stderr) => {
|
|
if (error) {
|
|
console.error(`exec error: ${error}`);
|
|
return reject(error);
|
|
}
|
|
console.log(stdout);
|
|
console.error(stderr);
|
|
resolve(stdout);
|
|
});
|
|
});
|
|
};
|
|
|
|
async function download() {
|
|
console.log('Starting model download process using git clone...');
|
|
await fs.mkdir(modelsPath, { recursive: true });
|
|
|
|
for (const [modelName, modelUrl] of Object.entries(models)) {
|
|
const targetDir = path.join(modelsPath, modelName);
|
|
console.log(`\nCloning ${modelName} from ${modelUrl}...`);
|
|
try {
|
|
// Use --depth 1 for a shallow clone to save space and time
|
|
await execPromise(`git clone --depth 1 ${modelUrl} ${targetDir}`);
|
|
console.log(`Successfully cloned ${modelName}`);
|
|
} catch (error) {
|
|
console.error(`\nFailed to clone ${modelName}:`, error);
|
|
}
|
|
}
|
|
|
|
// Also download the speaker embeddings for TTS
|
|
console.log('\nDownloading speaker embeddings...');
|
|
try {
|
|
const url = 'https://hf-mirror.com/datasets/Xenova/transformers.js-docs/resolve/main/speaker_embeddings.bin';
|
|
const response = await fetch(url);
|
|
if (!response.ok) {
|
|
throw new Error(`HTTP error! status: ${response.status}`);
|
|
}
|
|
const buffer = await response.arrayBuffer();
|
|
const ttsModelDir = path.join(modelsPath, 'Xenova/speecht5_tts');
|
|
await fs.mkdir(ttsModelDir, { recursive: true }); // Ensure directory exists
|
|
await fs.writeFile(path.join(ttsModelDir, 'speaker_embeddings.bin'), Buffer.from(buffer));
|
|
console.log('Successfully downloaded speaker_embeddings.bin');
|
|
} catch (error) {
|
|
console.error('\nFailed to download speaker_embeddings.bin:', error);
|
|
}
|
|
|
|
console.log('\nModel download process finished.');
|
|
}
|
|
|
|
download(); |