Il problema
Qualche settimana fa ho pubblicato un post sul mio blog che parla di sperimentazione come fattore di successo. A un certo punto, durante la scrittura, volevo mostrare un esempio di quanto fosse possibile innovare in poco tempo e con qualcosa di pratico, utile, e magari divertente.
Inizialmente ho pensato di creare un podcast con Notebook LM di Google che, se non lo sapete, è una nuova interfaccia verso le AI di Google che vuole uscire dal puro concetto di bot conversazionale, offrendo uno spazio di lavoro aumentato dall’AI. Tra le varie funzionalità offre quella di generare un podcast tra due personaggi, un uomo e una donna, che parlino dell’argomento desiderato. Devo dire che si tratta di un’applicazione tuttora molto interessante e di un modo di lavorare con l’AI che sicuramente ci porteremo avanti in futuro.
Unico problema: il podcast è solo in inglese, il che limita la possibilità di raggiungere un pubblico più ampio, specialmente chi non è a proprio agio con la lingua.
Quindi ho pensato: quanto ci metterò a rifare questa funzionalità con l’AI? Magari avendo pieno controllo dello script, potendo generare podcast in ogni lingua e, possibilmente, mettendo una musica di sfondo?
Ingredienti
- ChatGPT per la generazione del codice e la gestione delle modifiche successive. Con il modello o1-preview.
- Canvas di ChatGPT per l’ottimizzazione finale del codice e la creazione di un’interfaccia più user-friendly.
- Claude per revisionare il codice e adattare le chiamate API obsolete.
- Suno.AI per la generazione della musica di sottofondo.
- Cursor: Un editor di codice sorgente. Ma potete usare anche Visual Studio code o l’editor che preferite.
Difficoltà
4/5: Espresso Challenging, alto contenuto di caffeina per contenuti complessi. Bisogna destreggiarsi tra più modelli AI, linguaggi di programmazione e interazioni ripetute.
Tempo di preparazione
Circa 2 ore (perché ho esagerato, una prima revisione era pronta dopo 45 minuti)
Risultato
Il risultato è un’applicazione Python in grado di creare un podcast con due voci, basato su un file di testo, e sulla possibilità di aggiungere una musica di sottofondo. L’applicazione include funzionalità come la selezione del file tramite interfaccia grafica, la gestione multithreading per migliorare l’efficienza, un sistema di logging per tracciare gli errori e la persistenza delle ultime impostazioni in un file JSON. Inoltre, è presente un’interfaccia grafica per gestire tutte le impostazioni in maniera semplice e immediata.
Qui potete ascoltare un podcast generato da questo progetto. Magari non è perfetto ma… giudicate voi!
Procedura (raccontata veloce)
Dopo aver deciso di replicare la funzionalità di creazione di un podcast, ho iniziato con il generare un primo script utilizzando ChatGPT. L’obiettivo era creare un podcast con due personaggi che dialogassero sull’argomento scelto, in qualsiasi lingua desiderata.
Ho iniziato con la Ricetta #2, chiedendo a ChatGPT di riscriverla completamente per adattarsi alla nuova funzionalità. Successivamente ho deciso di evolvere lo script, aggiungendo una seconda voce maschile e rendendo l’interazione più coinvolgente. Ho optato per un’app locale in Python, utilizzando un file .txt selezionato tramite interfaccia grafica, poiché Python è particolarmente adatto per la prototipazione rapida e offre numerose librerie per la gestione dell’audio e delle interfacce grafiche.
La prima versione dell’applicazione risultava quasi funzionante, ma utilizzava una vecchia chiamata API ad OpenAI, ormai deprecata. A questo punto ho utilizzato Claude per sistemare la parte di codice che non funzionava. Dopo diverse interazioni, finalmente avevo uno script funzionante: l’applicazione apriva una finestra di dialogo, selezionava un file di testo e generava un podcast con due voci.
Nonostante il risultato soddisfacente, ho deciso di alzare ulteriormente il livello delle mie richieste, aggiungendo anche la possibilità di inserire una musica di sottofondo per rendere il podcast più coinvolgente e migliorare l’esperienza d’ascolto. Dopo qualche ulteriore iterazione con Claude, lo script era finalmente in grado di generare il podcast completo, includendo la musica.
A questo punto, per evitare il continuo copia e incolla dei pezzi di codice, sono passato a ChatGPT con Canvas, chiedendo di modificare il codice direttamente nell’ambiente editor. Qui ho migliorato l’interfaccia grafica, reso multithreading l’applicazione e aggiunto un sistema di logging degli errori, oltre a persistenti configurazioni.
Procedura (lunga e completa )
Per iniziare il tutto, in modo un po’ inconsueto, ho provato timidamente a chiedere a o1-Preview su ChatGPT:
I have this google script that resumes a lot of emails.
I want to modify It so that, when i save a draft EMAIL in my mailbox that contains the words "PODCAST THIS", it reads the e-Mail content and create a podcast exactly as in the process below but only with the contents of this email? Is it clear? If not make me questions:
Quindi, essendo molto pigro, ho inserito il codice della Ricetta #2, chiedendogli di riscriverla completamente.
o1-preview mi ha assecondato pazientemente e, come vedete nella conversazione seguente, si è messo a spiegarmi quello che avrei dovuto fare. (sì troverete un’API Key ma ormai è disabilitata 🙂 )
https://chatgpt.com/share/670eed42-1a78-800a-839d-697d88a1c660
Durante il dialogo però ho pensato che mi sarebbe piaciuto fare una cosa più interattiva, più comoda da usare che con un servizio e-mail.
Allora, a un certo punto, ho chiesto, non preoccupandomi dei mie strafalcioni.
ottimo. Secondo te è fattibile ipotizzare di creare un podcast tra due personaggi che si parlino utilizzando
questo script ed evolvendolo?
Magari intorudccendo una seconda voce, maschile, e facendo interagire i due personaggi che riassumono il contenuto
per un podcast più avvincente e interessante?
Farei il tutto però in python utilizzando un file txt che viene selezionato da un’interfaccia grafica.
che ne pensi? Fammi domande prima di inizare
Per chi non è esperto di codice: in poche richieste ho chiesto di riscrivere completamente un’app in Javascript salvo poi cambiare idea e chiedere di riscriverla in python come app locale. Quest’ultimo passaggio ha richiesto 18 secondi, che io rispondessi ad un po’ di domande chiarificatrici e poi altri 44 secondi di ‘pensiero’ di o1-Preview.
Come vedete nella conversazione ChatGPT mi ha spacchettato il codice corredandolo da una breve analisi ma, essendo aggiornato ad ottobre 2023, non era al corrente di alcuni servizi disponibili con Whisper per il servizio di Text to Speech. E ha deciso di propormi il meglio di ciò che sapeva lui.
In questo caso cos’ho fatto: ho recuperato un pezzo di codice funzionante (dallo snippet originariamente caricato), gli ho ribadito che funziona. Lui non ci credeva e… gli ho chiesto di fidarsi di me.
Il risultato? Una prima app quasi funzionante che fa partire una finestra di dialogo per scegliere un file da convertire in un podcast a due. Lo script genera il dialogo, converte il testo in audio e combina gli audio in un unico file mp3.
Peccato però che…
Non funzionasse! Il codice generato utilizzava una vecchia chiamata API ad OpenAI, ora deprecata. Non avendo voglia di mettermi a litigare con GPT ho copiaincollato il codice in Claude e gli ho chiesto di sistemare la cosa:
parti da questo codice:
[codice generato da ChatGPT]
la parte in cui chiamo OpenAI è obsoleta e va sostituita con questa, magari dentro ad una funzione.
[il codice che avevo già pronto e funzionante]
Tre interazioni (per non funzionamenti vari, sempre spiegando le cose in linguaggio naturale e preoccupandomi molto poco del codice generato) e avevo uno script funzionante.
Potevo fermarmi qui…
il risultato era raggiunto. E fino a questa fase ci ho messo solo 20 minuti circa. La serata era ancora giovane e ho pensato di aumentare il livello delle mie richieste.
Ma se io ti fornissi un file MP3 con una musica di sottofondo tu riusciresti ad inserirla?
Il file MP3 viene selezionato dopo il file di testo.
Anche qui qualche interazione e, come vedete, uno dei vizietti di Claude: ad un certo punto smette di generare tutto il codice concentrandosi solo sui cambiamenti richiesti per ridurre la context window, risparmiare token inutili (e quindi ridurre lo spreco di energia). Scatenando la necessità di copia e incolla selettivi nell’editor che eseguiva il codice (di cui parleremo tra poco).
Comunque gli ho chiesto solo, a questo punto, di crearmi una bella interfaccia grafica per controllare meglio l’applicazione, selezionare il file di testo, la musica di sottofondo (che nel frattempo avevo generato con suno.ai) e un’area di testo per modificare il prompt di volta in volta. Sono passato all’inglese senza volerlo… devo dire che il più delle volte funziona molto meglio.
La GUI non mi piaceva molto (ve la risparmio) e non avevo voglia di fare copia incolla selettivi e gli ho allora chiesto:
Write me the whole code and create a more beautiful GUI
e… devo dire che è stato bravino per un primo tentativo!
A questo punto, però, si è scatenato il mio ego perfezionista da persona che ha seguito decine (forse centinaia) di progetti software e… ho deciso di andare avanti fino ad ottenere quasi un prodotto finito.
Ho chiesto la possibilità di copiaincollare il contenuto della text-area, di avere un’area di editing dello script generato prima di produrre il podcast, ho cercato di capire quali altri stili grafici avesse la libreria TTK (quel nero non mi piaceva!) ho sofferto quando ha completamente sbagliato l’ordine di merge dei diversi mp3 con le due voci o ha smesso di produrre mp3 corretti (ma è bastato dirgli: PLEASE FIX IT!)
Quasi alla fine
Ero stanco però di copiaincollare e mi sono ricordato della nuova funzionalità Canvas di Chat GPT.
Ho copiaincollato (ancora) lo script in una nuova conversazione, selezionando ChatGPT 4o con Canvas, e gli ho chiesto, semplicemente:
modify this in canvas: [e qui tutto il codice precedente]
Perché l’ho fatto?
Perché mi aspettavo una sessione interminabile di errori, tentativi e modifiche per quello che stavo per chiedere:
Come vedete l’ambiente è più user friendly e la chat occupa una minima parte della schermata mentre un editor di codice, semplice ma al contempo con funzionalità molto interessanti, mi permetteva di fare modifiche o richieste su singole righe di codice.
Tra le funzionalità interessanti la code review: vengono inserite da ChatGPT delle note da ‘dev senior’ che suggeriscono modifiche più o meno ovvie.
Cosa ho chiesto? Di creare un’interfaccia grafica, di rendere multithreading l’applicazione, rendere più robuste le chiamate alle API, aggiungere un sistema di logging degli errori, combinare i file in una cartella temporanea ed eliminarli al termine, persistere le ultime impostazioni e lo script in un file json. Tutte cose importanti che hanno richiesto circa… 15 minuti di lavoro extra.
Mi sono inoltre cimentato ad usare l’AI di Cursor.ai, un editor di codice in stile Visual Studio Code con cui mi sto molto divertendo, per alcune finiture finali. Notate la chat a destra.
E dopo circa 2 ore complessive di lavoro mi sono ritenuto finalmente soddisfatto avendo a disposizione la mia versione personalizzata di un generatore di podcast:
Potete scaricare lo script finale da GitHub
Cosa manca.
Beh, le voci non sono così entusiasmanti come quelle di Google Notebook LM… ma potete sperimentare le Realtime API di OpenAI se volete divertirvi un po’.
L’interfaccia non è web, ma in tal caso sarebbe servito mettere in piedi un server locale o sul cloud e avrebbe allungato i tempi di preparazione e complicato un po’ le cose.
In ogni caso mi sembra soddisfacente, che ne dite?
Quindi…
- Un’AI da sola non basta: Sfruttare al massimo diversi modelli offre risultati migliori. In questo progetto ne abbiamo usati tre!
- Ci vuole tempo: La prima soluzione non è quasi mai quella giusta, ma spesso le proposte di correzione di queste AI sono molto efficaci e fantasiose.
- Il codice va sempre ottimizzato: Come sempre, vale la metafora dello stagista: il product manager siete voi, ed è vostro compito capire se il risultato è sufficiente.
- Collaborazione tra AI: Usare diversi modelli AI è come avere più specialisti in un team. Ognuno ha il proprio punto di forza, e combinarli dà risultati incredibili.
- Non scoraggiarsi davanti agli errori: Gli errori e i bug fanno parte del processo. Ciò che conta è avere pazienza e trovare la giusta soluzione, spesso con l’aiuto dello stesso modello AI.
- Sperimentare per imparare: Ogni piccolo esperimento aiuta a comprendere meglio le potenzialità degli strumenti a disposizione, anche quando il risultato non è perfetto.
Feedback
Cosa ne pensate di questo approccio? Avete mai combinato più AI per un progetto simile? Condividete la vostra esperienza e fatemi sapere se pensavate si potesse fare qualcosa di simile in così poco tempo!
A presto!
Massimiliano
Dietro le quinte
Come sapete ci tengo molto alla trasparenza su come viene utilizzata l’AI e quindi al termine racconto quanto, dove e come l’ho usata anche per la generazione dei contenuti.
Questo post è nato in modo ancora diverso dagli altri. Prima ho scritto il codice e l’ho fatto funzionare. Poi ho descritto i vari passaggi scrivendo di mio pugno il procedimento lento.
Al termine ho chiesto al mio GPT di scrivere le parti mancanti, ho fatto un po’ di editing in Canvas di ChatGPT e ho riletto tutto. Perchè è sempre bene controllare il risultato di un’AI Generativa.
Poi ho passato il titolo a Midjourney per produrre un immagine e… sono finalmente andato a dormire!
Uso sa diverso tempo NotebookLM. Interessante esperimento il tuo. Complimenti