Recommendation (short):
Use an edit-timed, per-cut TTS approach: export your edit decision list (EDL) or a simple CSV of cuts, generate one ElevenLabs audio file per cut (using SSML/prosody fixes), then import those clips into your NLE and snap them to cut start times. Export subtitles from the same CSV. This gives the most reliable auto-sync and batchability for 90–150s product videos.
Why this works
- Per-cut TTS guarantees alignment to the edit (no messy forced-alignment).
- Batching via the ElevenLabs API is fast and reproducible.
- Using the same timestamp source for audio and SRT keeps captions exact.
Decision criteria (pick approach based on):
- Budget: API costs scale with total characters & generation attempts. Per-cut calls are slightly more API calls but smaller payloads; total chars determine cost.
- Skill level: If you’re comfortable scripting, automating via a small Python/Node script + ffmpeg/NLE import is best. If not, do manual per-clip generation in the ElevenLabs Studio.
- Team size & speed: Teams needing bulk output should automate batching; solo creators can do manual batches.
- Output quality vs. time: Per-cut + SSML tweaks gets near-lifelike. If you need absolute human prosody, consider a voice actor or a custom ElevenLabs voice (higher cost/time).
Practical end-to-end checklist (step-by-step)
1) Prepare edit metadata
- Export EDL, FCPXML, or make a CSV: clip_id,start_time,end_time,text_for_that_cut
- Use 00:00:00.000 format or milliseconds.
2) Script polishing
- Short sentences per cut; add natural punctuation.
- Optional: pass each cut’s text through a rewrite step (ChatGPT) to ensure natural cadence and mark emphasis.
3) Batch TTS generation (ElevenLabs API)
- For each CSV row, call ElevenLabs TTS to synthesize that segment. Use a consistent voice_id and settings (stability/similarity_boost if available).
- Use SSML tags for breathing and micro-pauses: or explicit commas/ellipses when needed.
- Request 48kHz WAV or 48kHz/24-bit for video use.
- Implement simple concurrency + retry/backoff for rate limits.
4) Post-process audio files
- Normalize LUFS to target (e.g., -16 LUFS for social/video), trim leading/trailing silence, apply tiny fades (5–10ms) to avoid clicks.
- Optionally append a short breath sample or use ElevenLabs breath tokens if supported for realism.
5) Auto-sync in your NLE
- Name files with start_time prefix (e.g., 00_00_12_500_clip3.wav) so you can “import & sort” then snap to timeline start.
- If tiny timing changes needed, use time-stretch/pitch-preserve (Premiere/Resolve/FCP) — avoid re-synthesis unless major changes.
6) Subtitle export
- Create .srt from the same CSV timestamps + text. Use the final timeline times if you changed any timing in step 5.
- Burn-in or sidecar as needed.
7) Final QC
- Listen through with music and sound effects to check intelligibility and masking; adjust levels and EQ.
Best-for / Avoid-if
- Best-for: teams producing many short product videos that must match exact cuts and be iterated quickly.
- Avoid-if: you need highly expressive emotional narration (then use a human or invest in a custom ElevenLabs voice and more SSML tuning).
Quick tooling notes
- Primary: ElevenLabs (use API for batching and precise control). See ElevenLabs Studio/Voice API to manage voices and settings.
- Optional: ChatGPT to rewrite lines for cadence before generation.
Mini implementation tips
- Keep lines under ~15–20 words per cut for natural TTS pacing.
- Use small SSML breaks rather than long commas; test speeds with a few iterations.
- Cache generated audio for re-renders to avoid re-costing API calls.
If you want, I can draft a sample CSV schema + a short Python snippet to batch-call ElevenLabs and produce SRTs to drop straight into your NLE.