← Tutte le idee Marketing e social

AutoSubtitles

Sottotitoli automatici e precisi per i tuoi video

Incasso mensile: 3500 USD (fonte indicata nella scheda)

Cosa fa

Strumento web che trascrive l'audio dei video e crea i sottotitoli da modificare ed esportare, anche già impressi nel video.

Come guadagna

Ha entrate ricorrenti ogni mese, verificate su TrustMRR. Prezzi e piani esatti sono indicati sul sito del progetto.

Rendilo tuo

  • Stili di sottotitoli alla moda per TikTok e Reels, con parole evidenziate.
  • Traduzione automatica dei sottotitoli in altre lingue.

Le frasi da scrivere all'AI

1. Base del sito e grafica

Crea un'app web in italiano chiamata "Sottotitola": trascrive l'audio dei video e crea sottotitoli in italiano da correggere, esportare o imprimere nel video per Reels, TikTok e YouTube. Usa React, Vite, TypeScript e Tailwind CSS.

Pagine da creare:
1. Pagina iniziale con un video di esempio con sottotitoli animati e prezzi
2. Registrazione e accesso
3. Caricamento del video
4. Editor: video a sinistra, righe dei sottotitoli a destra con i tempi
5. I miei video

Stile: creativo e veloce: sfondo scuro #111827, giallo #FDE047 come accento (il colore classico dei sottotitoli), testo bianco, carattere "Inter", anteprima del video grande. Nessuna immagine generica di stock.

Tutto deve funzionare perfettamente da telefono. Tutti i testi in italiano, chiari e senza parole tecniche.

2. Database, account e sicurezza

Collega il progetto a Supabase e attiva la registrazione con email e password.

Crea queste tabelle:
- "video": file nello Storage, durata, lingua, stato (caricato, in trascrizione, pronto), stile dei sottotitoli, collegati all'utente
- "segmenti": ogni riga dei sottotitoli con inizio, fine e testo

Regole di sicurezza obbligatorie:
- ogni utente vede solo i suoi video e sottotitoli
- i minuti disponibili non si modificano dal browser
- i video si cancellano da soli dopo 30 giorni

Usa esattamente il codice SQL che trovi nei "Dettagli tecnici" di questa scheda: eseguilo nel SQL Editor di Supabase prima di continuare, poi collega le pagine alle tabelle.

3. Trascrizione ed editor

L'utente carica un video (massimo 500 MB e 30 minuti). Una Edge Function estrae l'audio e lo invia a un servizio di trascrizione con i tempi di ogni parola, poi divide il testo in righe brevi (massimo 42 caratteri, 2 righe, da 1 a 6 secondi ciascuna) e le salva in "segmenti".

L'editor mostra il video con i sottotitoli sopra e l'elenco delle righe: cliccando una riga il video salta a quel punto; il testo si corregge scrivendo e i tempi si spostano con i pulsanti +/- 0,1 secondi. Cerca e sostituisci per correggere un nome ripetuto.

Si scala il numero di minuti del video dai minuti disponibili dell'utente.

4. Esportazione e stile

Esportazione in SRT (codice nei Dettagli tecnici) e VTT per YouTube, e testo semplice.

Per i social: stili di sottotitoli impressi nel video (classico, grande al centro una parola alla volta, con parola evidenziata) con carattere, colore e posizione scelti. Il video finale si crea sul server con FFmpeg e si scarica in verticale 9:16, quadrato o orizzontale.

5. Pagamenti con Stripe

Aggiungi pacchetti di crediti: 60 minuti a 9 €, 300 minuti a 29 €. Ogni nuovo utente riceve 10 crediti gratis. Ogni minuto di video trascritto costa un credito (minuto); modifiche ed esportazioni sono gratis. Mostra sempre in alto quanti crediti restano e, quando finiscono, un riquadro per comprarne altri.

A pagamento riuscito il webhook aggiunge i crediti del pacchetto con la funzione aggiungi_crediti.

Per la sessione di pagamento e il webhook segui la guida "Pagamenti con Stripe" di Fattibile.

6. Controlli specifici di questo progetto

Oltre ai controlli della guida "Controllo finale", verifica in particolare:
1. Tempi: esporta un SRT e caricalo su YouTube con lo stesso video: i sottotitoli devono essere a tempo dall'inizio alla fine.
Correggi quello che non va e scrivimi cosa hai cambiato.

Dettagli tecnici

Creare il file SRT

Trasforma le righe dei sottotitoli nel formato SRT, quello accettato da YouTube, Premiere, CapCut e quasi tutti i programmi video.

type Segmento = { inizio: number; fine: number; testo: string };   // tempi in secondi

// 75.5 -> "00:01:15,500"
function tempoSrt(secondi: number): string {
  const ms = Math.round(secondi * 1000);
  const due = (n: number) => String(n).padStart(2, "0");
  return due(Math.floor(ms / 3_600_000)) + ":" +
    due(Math.floor((ms % 3_600_000) / 60_000)) + ":" +
    due(Math.floor((ms % 60_000) / 1000)) + "," +
    String(ms % 1000).padStart(3, "0");
}

export function creaSrt(segmenti: Segmento[]): string {
  return segmenti
    .map((s, i) => (i + 1) + "\n" + tempoSrt(s.inizio) + " --> " + tempoSrt(s.fine) + "\n" + s.testo)
    .join("\n\n") + "\n";
}

// Divide un testo lungo in righe di massimo 42 caratteri senza spezzare le parole
export function dividiRighe(testo: string, massimo = 42): string[] {
  const righe: string[] = [];
  let riga = "";
  for (const parola of testo.split(" ")) {
    if ((riga + " " + parola).trim().length > massimo) { righe.push(riga); riga = parola; }
    else riga = (riga + " " + parola).trim();
  }
  if (riga) righe.push(riga);
  return righe;
}

Tabelle del database

I video e le righe dei sottotitoli, in ordine di tempo.

create table video (
  id uuid primary key default gen_random_uuid(),
  utente_id uuid not null references auth.users(id) on delete cascade,
  file_path text not null,
  durata_secondi int,
  lingua text not null default 'it',
  stato text not null default 'caricato'
    check (stato in ('caricato', 'in_trascrizione', 'pronto', 'errore')),
  stile jsonb not null default '{}',
  creato_il timestamptz not null default now()
);

create table segmenti (
  id bigint generated always as identity primary key,
  video_id uuid not null references video(id) on delete cascade,
  utente_id uuid not null references auth.users(id) on delete cascade,
  inizio numeric(8, 3) not null,
  fine numeric(8, 3) not null,
  testo text not null,
  check (fine > inizio)
);
create index on segmenti (video_id, inizio);

alter table video enable row level security;
create policy "le mie righe" on video
  for all using (auth.uid() = utente_id) with check (auth.uid() = utente_id);

alter table segmenti enable row level security;
create policy "le mie righe" on segmenti
  for all using (auth.uid() = utente_id) with check (auth.uid() = utente_id);

Pezzi comuni a tutti i progetti

Glossario

Storage
Lo spazio di Supabase dove si salvano i file, come foto e audio, con le sue regole di accesso.
JSONB
Un tipo di colonna che contiene dati strutturati flessibili, come un piccolo documento.
SRT
Il formato più diffuso per i sottotitoli: un file di testo con numero, tempi di inizio e fine, e testo di ogni riga.
FFmpeg
Un programma gratuito che lavora i video: taglia, converte e imprime scritte sopra le immagini.