Serverless potenzia l'accessibilità: converti il ​​testo in voce con Amazon Polly

May 08 2023
Viviamo in un'era incredibile di progressi tecnologici e innovazioni che trasformano ogni aspetto della nostra vita. Dall'intelligenza artificiale e dall'apprendimento automatico all'automazione e ai big data, non si può negare che il futuro è qui.
Pappagallo DALL-E seduto su una nuvola che legge un libro mentre canta

Viviamo in un'era incredibile di progressi tecnologici e innovazioni che trasformano ogni aspetto della nostra vita. Dall'intelligenza artificiale e dall'apprendimento automatico all'automazione e ai big data, non si può negare che il futuro è qui.

Ad esempio, il titolo di questo post sul blog è stato scritto con l'aiuto di ChatGPT per renderlo ottimizzato per il SEO. L'immagine del pappagallo è stata realizzata con l'aiuto di DALL-E.

E il lettore audio che legge questo testo per te? Bene, si scopre che anche questo può essere automatizzato.

Ed è di questo che parleremo oggi, automatizzando la conversione da testo a voce (TTS) con l'aiuto di Amazon Polly.

Fornirò una soluzione Serverless completamente funzionante su GitHub con codice Python e AWS CDK. Puoi distribuire il codice e goderti la trasformazione della sintesi vocale in pochi minuti.

Fare clic qui per accedere al progetto GitHub.

https://www.ranthebuilder.cloud/

Questo post sul blog è stato originariamente pubblicato sul mio sito Web, "Ran The Builder".

L'accessibilità è importante

Ho avviato il mio sito Web, RanTheBuilder , per condividere le mie conoscenze su AWS e Serverless con il mondo. Un sito Web accessibile promuove l'inclusività e garantisce che tutte le persone possano accedere e interagire con i contenuti. L'accessibilità ha preso il sopravvento negli ultimi anni e molti siti web se ne accorgono.

Di recente ho notato che Medium ha aggiunto un lettore audio per i post del blog che legge i post per te, che è un'ottima funzionalità di accessibilità.

Non avevo idea di come avessero fatto, e sembrava fuori portata.

Tuttavia, sono stato ispirato ad agire immediatamente dopo aver visto il seguente video su YouTube:

Nel video, il costruttore della community AWS Johannes Koch intervista Jimmy Dahlqvist , un collega costruttore. Discutono di come Jimmy abbia automatizzato la creazione del suo blog con AWS Step Functions, che ha portato alla versione vocale del testo del post con Amazon Polly.

Non ho mai sentito parlare di Amazon Polly, ma mi sono sentito ispirato a provarlo da solo e finalmente a risolvere un'importante funzione di accessibilità mancante del mio sito web.

Ho progettato una soluzione semplice che risponde perfettamente alle mie esigenze, che sono relativamente modeste.

Prima di passare ai dettagli, impariamo a conoscere Amazon Polly.

Introduzione al servizio di sintesi vocale di Amazon Polly

Amazon Polly è un servizio di sintesi vocale (TTS) basato su cloud. Utilizza tecnologie avanzate di deep learning per convertire il testo scritto in parlato realistico, consentendo agli sviluppatori di creare applicazioni abilitate al parlato con voci dal suono naturale.

Polly supporta una vasta gamma di lingue (24 al momento della scrittura) e gli utenti possono scegliere tra diverse voci maschili e femminili con accenti e toni diversi (47 in totale). Il servizio fornisce anche funzionalità avanzate come il riconoscimento vocale automatico (ASR) e il linguaggio di markup della sintesi vocale (SSML), consentendo agli sviluppatori di mettere a punto la pronuncia, l'enfasi e l'intonazione dell'output vocale.

Uno dei punti di forza di Amazon Polly è che si tratta di un servizio Serverless. Produrrà i file audio direttamente su un bucket S3, semplificando l'integrazione in qualsiasi architettura basata su eventi. Gestirà automaticamente qualsiasi dimensione del testo che gli lanci, non è necessario far girare più macchine e paghi solo per il numero di caratteri che trasformi in voce.

Dal mio breve periodo di utilizzo, è semplice; il testo entra, il file mp3 esce in un bucket S3.

il testo entra, il discorso esce

Il livello gratuito è impressionante e soddisferà le esigenze di molte persone, inclusa la mia.

Ulteriori informazioni sui prezzi .

Vediamo come automatizzare la creazione di sintesi vocale con l'API di Amazon Polly.

Il mio servizio Python Text to Speech

Esaminiamo l'obiettivo del servizio, i dettagli di progettazione e implementazione.

L'obiettivo

Voglio essere in grado di creare file .mp3 dei post del mio blog e caricarli sul mio sito Web quando lavoro su nuovi post. Il servizio deve essere serverless, semplice da utilizzare e distribuito con AWS CDK.

Voglio che l'utilizzo sia il più semplice possibile:

  • Aggiungere un nuovo file di testo alla cartella "testo" del servizio TST (sintesi vocale).
  • Distribuisci il servizio in AWS.
  • Ricevi un file mp3 consegnato al mio indirizzo email.

Per riassumere: aggiungi un file di testo alla cartella "text", esegui la distribuzione su AWS, attendi un minuto e ricevi un file mp3 nella tua casella di posta. Semplice!

Se vuoi provarlo tu stesso, vai al progetto su GitHub e segui il file Leggimi per le istruzioni e l'utilizzo.

Design di alto livello

Dal punto di vista del design, il servizio è abbastanza semplice. Hai la tua entità di archiviazione cloud che viene utilizzata per l'input e l'elaborazione intermedia.

Quindi hai due attori principali: produttore e consumatore.

Il produttore carica i file di testo nel cloud storage, che vengono inviati al consumatore.

Il consumatore trasformerà il file di testo in un file mp3 e lo invierà via e-mail a un indirizzo e-mail come allegato.

Design di alto livello

Architettura dei servizi

Diamo un'occhiata all'architettura e vediamo come ho implementato ciascuna entità.

Dichiarazione di non responsabilità: questo servizio a livello di POC fornisce l'automazione per le mie esigenze nel modo più semplice possibile. I contributi al codice sono i benvenuti!

Architettura dei servizi

Flusso di eventi

  1. L'utente aggiunge un nuovo file di testo alla cartella "text" nella cartella principale del progetto.
  2. L'utente distribuisce il servizio con AWS CDK (può utilizzare il comando 'make deploy').
  3. Il file viene caricato su S3.
  4. La funzione Consumer Lambda viene attivata con un evento "oggetto creato in S3" e legge il nome del file e il nome del bucket dall'evento.
  5. La funzione Consumer Lambda invia i contenuti di testo ad Amazon Polly e dorme/esegue il polling fino al completamento dell'attività.
  6. Una volta completata l'attività, il file mp3 di output viene scaricato dal bucket S3 e viene eliminato da esso. Poiché lo inviamo tramite e-mail, non è necessario archiviarlo su S3, ma puoi disabilitarlo e inviare tramite e-mail il collegamento dell'oggetto anziché il file mp3.
  7. La funzione Lambda utilizza Amazon SES per inviare tramite e-mail il file mp3 come allegato a un indirizzo e-mail predefinito.

Utilizziamo un bucket Amazon S3 sia per l'archiviazione di input che per quella di output di Amazon Polly per l'entità di archiviazione nel cloud. Polly ha un'integrazione nativa con Polly, quindi ha perfettamente senso. Il codice CDK del bucket è disponibile qui .

Il produttore è uno speciale costrutto AWS CDK che carica i file in S3 da una cartella specifica. Di solito aggiungo un file alla volta e distribuisco il servizio. Puoi anche caricare manualmente un file nel bucket, ma ciò vanifica lo scopo; vogliamo l'automazione. Il codice CDK del produttore può essere trovato qui .

Il consumatore è una funzione Lambda che sottoscrive gli eventi "on object create" del bucket S3 e viene attivata quando vengono scritti nuovi oggetti.

La funzione prenderà ogni evento, lo leggerà e invierà i suoi contenuti ad Amazon Polly. Utilizza l' API 'start_speech_synthesis_task' . Ho utilizzato il wrapper SDK di esempio ufficiale di Amazon Polly , che ottiene il contenuto del file di testo e restituisce il file mp3 come output: piuttosto semplice!

Il codice CDK consumer può essere trovato qui .

E il codice della funzione Lambda può essere trovato qui .

L'utilizzo del wrapper Polly nel mio codice può essere trovato qui .

Prestazioni e problemi aperti

Per il mio caso d'uso, un post sul blog di 11.000 caratteri impiega circa 40-50 secondi per trasformarsi in un file mp3 nel mio indirizzo e-mail una volta completata la distribuzione. Non è male.

Potresti chiederti perché elimino il file mp3 da S3 e lo invio come allegato di posta elettronica.

Bene, voglio che il file mp3 venga eliminato e inviato come allegato e-mail perché voglio caricarlo sul mio sito Web, dove lo spazio di archiviazione è già pagato, invece di archiviarlo e riprodurlo dal mio account di sviluppo AWS personale.

Potresti anche chiederti, beh, è ​​​​una bella implementazione, ma è ottimale? È la migliore opzione di design?

Beh no.

La funzione Lambda del consumatore attende ed esegue il polling di Polly fino al termine dell'attività di sintesi, il che è una cattiva pratica sia in termini di prestazioni che di costi. Tuttavia, per un progetto POC che viene eseguito una volta ogni due settimane (quando pubblico un nuovo post), è accettabile, almeno per ora.

Una soluzione migliore consiste nell'utilizzare Step Functions con uno stato di attesa. Polly può notificare un argomento SNS quando l'attività è completata; quel SNS può inviare un messaggio a un messaggio SQS e quindi a un Lambda che riattiverà la funzione step con un token di attesa per continuare a inviare il file alla mia email.

Quindi, perché ho scelto una funzione Lambda rispetto a un'implementazione della macchina a stati della funzione passo? Un paio di motivi:

  1. Il wrapper AWS Polly mi ha permesso di avanzare rapidamente e fa tutto nello stesso processo (fa lo sleep & poll per te), quindi la funzione Lambda è semplice da usare rispetto alla funzione step, che non sarà in grado di utilizzare il SDK.
  2. Non puoi sviluppare ed eseguire il debug di funzioni step nell'IDE, a differenza delle funzioni Lambda. Volevo fornire valore il più velocemente possibile per questo caso d'uso e ottenere rapidamente i risultati.
  3. Si tratta più di fornire accessibilità e apprendere qualcosa di nuovo, e meno di creare la migliore soluzione possibile pronta per la produzione.

Sì, naturalmente. Lo farò come parte della v2 del servizio, ma sono benvenuti anche i contributi al codice!

Un'altra area di miglioramento è che non sto usando lessici o linguaggio di markup di sintesi (SSML), che consente agli sviluppatori di mettere a punto la pronuncia, l'enfasi e l'intonazione dell'output vocale. Questo può essere un punto di svolta, ma richiede ulteriori ricerche per comprendere la funzionalità e come automatizzarla.

Infine, la gestione degli errori, i tentativi e i test devono ancora essere creati. Ho testato il codice nell'IDE (chiamato gestore Lambda con un evento generato) e durante il tempo di distribuzione come test end-to-end.

Vuoi saperne di più su come testare le applicazioni Serverless? Dai un'occhiata al mio post qui .