Newer
Older
remotion_docker_devcontainer / voicevox-remotion-template / src / data / timing.ts
import {script, Sentence} from "./script";
import voicevoxManifest from "./voicevox-manifest.json";

type ManifestEntry = {
  id: string;
  file: string;
  durationSeconds: number;
};

const manifestEntries = voicevoxManifest as ManifestEntry[];
const manifestById = new Map(
  manifestEntries.map((entry) => [entry.id, entry])
);

export const FPS = 30;
export const GAP_FRAMES = 6;

export const hasAudioForSentence = (sentence: Sentence) =>
  manifestById.has(sentence.id);

export const durationForSentence = (sentence: Sentence, fps = FPS) => {
  const entry = manifestById.get(sentence.id);
  if (entry && Number.isFinite(entry.durationSeconds)) {
    return Math.max(1, Math.ceil(entry.durationSeconds * fps));
  }

  const estimatedSeconds = Math.max(1.2, sentence.text.length * 0.11);
  return Math.ceil(estimatedSeconds * fps);
};

export const totalDurationInFrames = (fps = FPS) =>
  script.reduce((sum, sentence, index) => {
    const gap = index < script.length - 1 ? GAP_FRAMES : 0;
    return sum + durationForSentence(sentence, fps) + gap;
  }, 0);