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.