UNPKG

react-edge-tts

Version:

Generate text-to-speech narration for React content using Microsoft Edge TTS

67 lines 2.57 kB
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