← Tutte le idee Strumenti online

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.