Files
Bella/download_models.js
T
admin 30471fa2dc chore: update dependencies and remove unused files
refactor: migrate from nodemon to http-server for development
build: add type module and update package.json scripts
2025-07-21 18:19:22 +08:00

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();