UNPKG

short-video-maker

Version:

Creates short videos for TikTok, Instagram Reels, and YouTube Shorts using the Model Context Protocol (MCP) and a REST API.

62 lines (61 loc) 2.08 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Kokoro = void 0; const kokoro_js_1 = require("kokoro-js"); const shorts_1 = require("../../types/shorts"); const config_1 = require("../../config"); class Kokoro { tts; constructor(tts) { this.tts = tts; } async generate(text, voice) { const splitter = new kokoro_js_1.TextSplitterStream(); const stream = this.tts.stream(splitter, { voice, }); splitter.push(text); splitter.close(); const output = []; for await (const audio of stream) { output.push(audio); } const audioBuffers = []; let audioLength = 0; for (const audio of output) { audioBuffers.push(audio.audio.toWav()); audioLength += audio.audio.audio.length / audio.audio.sampling_rate; } const mergedAudioBuffer = Kokoro.concatWavBuffers(audioBuffers); config_1.logger.debug({ text, voice, audioLength }, "Audio generated with Kokoro"); return { audio: mergedAudioBuffer, audioLength: audioLength, }; } static concatWavBuffers(buffers) { const header = Buffer.from(buffers[0].slice(0, 44)); let totalDataLength = 0; const dataParts = buffers.map((buf) => { const b = Buffer.from(buf); const data = b.slice(44); totalDataLength += data.length; return data; }); header.writeUInt32LE(36 + totalDataLength, 4); header.writeUInt32LE(totalDataLength, 40); return Buffer.concat([header, ...dataParts]); } static async init(dtype) { const tts = await kokoro_js_1.KokoroTTS.from_pretrained(config_1.KOKORO_MODEL, { dtype, device: "cpu", // only "cpu" is supported in node }); return new Kokoro(tts); } listAvailableVoices() { const voices = Object.values(shorts_1.VoiceEnum); return voices; } } exports.Kokoro = Kokoro;