pdftomp3
Trasforma i PDF in audiolibri da ascoltare
Cosa fa
Converte documenti PDF in file audio da ascoltare come un audiolibro, usando la voce sintetica dell'AI.
Come guadagna
Presentato su Hacker News dal suo creatore, che non dichiara incassi. Idee nostre per guadagnare con un progetto simile: pagamento per pagina o abbonamento mensile.
Rendilo tuo
- Per studenti: le dispense universitarie da ascoltare in macchina o in palestra.
- Per persone con difficoltà di lettura (dislessia) o di vista.
Le frasi da scrivere all'AI
1. Base del sito e grafica
Crea un'app web in italiano chiamata "Leggimelo": trasforma i propri documenti PDF (dispense, relazioni, manuali, libri senza diritti) in audio da ascoltare in macchina o in palestra, con una voce sintetica naturale in italiano. Usa React, Vite, TypeScript e Tailwind CSS.
Pagine da creare:
1. Pagina iniziale con un esempio da ascoltare e prezzi
2. Registrazione e accesso
3. Carica il PDF, scegli voce e velocità, togli le parti da saltare
4. Lettore con capitoli, velocità e segnalibro
5. La mia libreria
Stile: rilassante e leggibile: sfondo crema #FBF8F3, blu notte #1E293B, arancione #EA580C per il pulsante play, carattere "Inter", lettore grande con onde sonore. 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:
- "documenti": titolo, pagine, voce, stato, file audio dei capitoli nello Storage, posizione di ascolto, collegati all'utente
Regole di sicurezza obbligatorie:
- ogni utente vede solo i suoi documenti e audio
- gli audio stanno in uno spazio privato
- i crediti non si modificano dal browser
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. Dal PDF all'audio
Il PDF si legge nel browser con pdf.js per estrarre il testo. Il sito toglie in automatico intestazioni e piè di pagina ripetuti, numeri di pagina e note a fondo pagina; l'utente vede l'anteprima del testo e può escludere pagine (indice, bibliografia).
Il testo si divide in pezzi che finiscono sempre alla fine di una frase (codice nei Dettagli tecnici), che vengono inviati uno alla volta a un servizio di sintesi vocale. I pezzi audio si uniscono in capitoli.
Si scalano i crediti in base ai caratteri. Avviso: "Carica solo documenti tuoi o di cui hai i diritti: gli audio sono per uso personale".
4. Lettore e libreria
Lettore con capitoli, velocità da 0,75× a 2×, salto di 15 secondi, e segnalibro automatico: riprende da dove si era rimasti, anche su un altro dispositivo. Funziona a schermo spento con la Media Session API (comandi sulla schermata di blocco).
Libreria con avanzamento di ascolto per ogni documento e download degli audio in MP3.
5. Pagamenti con Stripe
Aggiungi pacchetti di crediti: 100 pagine a 4,99 €, 500 pagine a 14,99 €. Ogni nuovo utente riceve 20 crediti gratis. Ogni pagina convertita costa un credito. 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. Testo: converti un PDF con intestazioni e numeri di pagina: nell'audio non devono comparire ripetuti a ogni pagina.
Correggi quello che non va e scrivimi cosa hai cambiato.
Dettagli tecnici
Dividere il testo alla fine delle frasi
I servizi di sintesi vocale accettano testi di lunghezza limitata. Questa funzione divide il testo in pezzi senza mai tagliare una frase a metà.
export function dividiInPezzi(testo: string, massimo = 3500): string[] {
// Divide in frasi: punto, punto esclamativo o interrogativo seguiti da spazio
const frasi = testo.replace(/\s+/g, " ").match(/[^.!?]+[.!?]+["»)]?\s*|[^.!?]+$/g) ?? [];
const pezzi: string[] = [];
let corrente = "";
for (const frase of frasi) {
if ((corrente + frase).length > massimo && corrente) {
pezzi.push(corrente.trim());
corrente = "";
}
// Frase più lunga del massimo (raro): si taglia alla virgola o allo spazio
if (frase.length > massimo) {
for (let i = 0; i < frase.length; i += massimo) pezzi.push(frase.slice(i, i + massimo).trim());
} else corrente += frase;
}
if (corrente.trim()) pezzi.push(corrente.trim());
return pezzi;
}
// Toglie le righe che si ripetono su quasi tutte le pagine (intestazioni, piè di pagina)
export function togliRipetute(pagine: string[][]): string[][] {
const conteggio = new Map<string, number>();
for (const righe of pagine) for (const r of new Set(righe)) conteggio.set(r, (conteggio.get(r) ?? 0) + 1);
return pagine.map((righe) =>
righe.filter((r) => (conteggio.get(r) ?? 0) < pagine.length * 0.6 && !/^\d+$/.test(r.trim())),
);
}Comandi sulla schermata di blocco
Con la Media Session API il telefono mostra titolo e comandi del lettore anche a schermo spento.
export function attivaComandi(audio: HTMLAudioElement, titolo: string, capitolo: string) {
if (!("mediaSession" in navigator)) return;
navigator.mediaSession.metadata = new MediaMetadata({ title: capitolo, artist: titolo, album: "Leggimelo" });
navigator.mediaSession.setActionHandler("play", () => audio.play());
navigator.mediaSession.setActionHandler("pause", () => audio.pause());
navigator.mediaSession.setActionHandler("seekbackward", () => { audio.currentTime -= 15; });
navigator.mediaSession.setActionHandler("seekforward", () => { audio.currentTime += 15; });
}
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.
- Sintesi vocale (TTS)
- La tecnologia che legge un testo ad alta voce con una voce generata dal computer.