react-edge-tts
Version:
Generate text-to-speech narration for React content using Microsoft Edge TTS
67 lines • 2.57 kB
JavaScript
const { EdgeTTS } = require('node-edge-tts');
const fs = require('fs');
const path = require('path');
const { promisify } = require('util');
const readFile = promisify(fs.readFile);
const writeFile = promisify(fs.writeFile);
const mkdir = promisify(fs.mkdir);
class NarrationGenerator {
constructor(options = {}) {
this.tts = new EdgeTTS();
this.options = {
inputDir: options.inputDir || 'narration-content',
outputDir: options.outputDir || 'narration-audio'
};
}
async generateAudio(narrationContent) {
const { metadata, content } = narrationContent;
const { title, voice = 'en-US-JennyNeural', rate = 1, volume = 1, pitch = 1, outputPath } = metadata;
// Create output directory if it doesn't exist
const outputDir = path.join(process.cwd(), this.options.outputDir);
await mkdir(outputDir, { recursive: true });
// Determine output file path
const outputFile = outputPath || path.join(outputDir, `${title}.mp3`);
try {
// Configure TTS options
const ttsOptions = {
voice,
rate: rate.toString(),
volume: volume.toString(),
pitch: pitch.toString()
};
// Generate audio
await this.tts.createAudio(content, ttsOptions, outputFile);
return outputFile;
}
catch (error) {
console.error(`Error generating audio for ${title}:`, error);
throw error;
}
}
async processNarrationFile(filePath) {
try {
const content = await readFile(filePath, 'utf8');
const narrationContent = JSON.parse(content);
return await this.generateAudio(narrationContent);
}
catch (error) {
console.error(`Error processing file ${filePath}:`, error);
throw error;
}
}
async processDirectory() {
const inputDir = path.join(process.cwd(), this.options.inputDir);
try {
const files = await fs.promises.readdir(inputDir);
const jsonFiles = files.filter((file) => file.endsWith('.json'));
const results = await Promise.all(jsonFiles.map((file) => this.processNarrationFile(path.join(inputDir, file))));
return results;
}
catch (error) {
console.error('Error processing directory:', error);
throw error;
}
}
}
export default NarrationGenerator;
//# sourceMappingURL=generator.js.map