Ho provato Google Text-to-Speech (con PHP) ed è una vera bomba

Alcuni di voi sanno che circa tre mesi fa ho lanciato un piccolo esperimento / side project, cryptoaud.io. Si tratta di un semplice aggregatore di notizie del mondo cryptocurrency con l’aggiunta di un insieme di integrazioni che si occupano di creare un riassunto della notizia e “leggerla” all’utente usando la sintesi vocale di Amazon Polly.

Il mondo della sintesi vocale mi ha sempre appassionato ed è stato molto piacevole scoprire un servizio come Polly, che fa molto bene il suo lavoro nonostante ci sia ancora tanta ricerca da fare in questo campo.

Poi, nemmeno una settimana fa, durante il mio consueto giro mattutino di lettura delle notizie, un articolo su TheVerge ha catturato la mia attenzioneGoogle ha da poco rilasciato un suo servizio di cloud TTS (text-to-speech). Indoviniamo il nome? Cloud Text-to-Speech.

Such originality, tuttavia non è per il nome che ho deciso di scrivere questo articolo. L’elemento fondamentale che mi ha fatto drizzare le orecchie, infatti, è che a differenza degli altri sistemi in circolazione questo ha un motore, nel cofano, da non sottovalutare: WaveNet, prodotto creato dall’inglese DeepMind.

Dovevo provarlo

Così eccomi qui, a raccontare di com’è andata la mia prima prova con Google Cloud Text-to-Speech, il suo primo vero confronto con Amazon Polly e sull’ovvio perché, alla fine, abbia deciso di integrarlo (a breve) in cryptoaud.io.

Qualche dato in più e il primo test

Vediamo di capire meglio come si presenta Cloud Text-to-Speech e cosa offre. Ecco gli elementi più interessanti che hanno catturato la mia attenzione, considerando la mia necessità principale:

  • creazione di interazioni molto più naturali rispetto ai “concorrenti” grazie all’uso, under the hood, di WaveNet;
  • disponibilità di REST API per creare velocemente un’integrazione con la propria applicazione;
  • pricing model interessante, con un free tier di un milione di caratteri e da quel punto in poi appena $16 per milione di caratteri. Il prezzo si abbassa a $4 per le voci “non WaveNet” che però non mi interessano;

Ok dai, convincente.

Sulla home page di Cloud Text-to-Speech c’è un modulo che permette di fare una prova inserendo del testo. Sono così andato su Cointelegraph, ho preso il primo paragrafo del primo articolo che ho trovato (questo: https://cointelegraph.com/news/cisco-developing-confidential-communications-via-blockchain-in-patent-filing) e l’ho dato in pasto al form, curioso di sentire il risultato.

Questo il paragrafo scelto:

Cisco, a worldwide leader in IT and networking, is developing a method of confidential group communications based on Blockchain technology, according to a patent application released by the US Patent and Trademark Office (USPTO) March 29.

Ecco come viene letto da AWS Polly:

Questo di seguito è invece lo stesso testo letto da Cloud Text-to-Speech:

C’è poco da dire: la differenza si sente. Certo, si sente anche in termini di grandezza del file: siamo a ~90kB per il file sintetizzato da AWS Polly mentre per Cloud Text-to-Speech siamo a ~750kB. Sia chiaro, è possibile ottimizzare questo aspetto in mille modi diversi: l’ho riportato più per curiosità che per altro.

A questo punto non rimane che creare…

Il primo script PHP di conversione text-to-speech

Nulla di complesso e soprattutto nulla da scrivere da zero: è possibile trovare tutto su questo repository GitHub, per comodità.

Per lavorare con le API avremo bisogno almeno di una API key, che possiamo creare usando questa pagina dedicata alla gestione delle credenziali Google Cloud.

Ecco il contenuto del file script.php, in tutto il suo basilare splendore.

<?php 

    require 'vendor/autoload.php'; 
    
    $googleAPIKey = 'YOUR_API_KEY_HERE'; 
    $articleText = 'Cisco, a worldwide leader in IT and networking, is developing a method of confidential group communications based on Blockchain technology, according to a patent application released by the US Patent and Trademark Office (USPTO) March 29.'; 

    $client = new GuzzleHttp\Client(); 
    $requestData = [ 'input' =>[
            'text' => $articleText
        ],
        'voice' => [
            'languageCode' => 'en-US',
            'name' => 'en-US-Wavenet-F'
        ],
        'audioConfig' => [
            'audioEncoding' => 'MP3',
            'pitch' => 0.00,
            'speakingRate' => 1.00
        ]
    ];


    try {
        $response = $client->request('POST', 'https://texttospeech.googleapis.com/v1beta1/text:synthesize?key=' . $googleAPIKey, [
            'json' => $requestData
        ]);

    } catch (Exception $e) {
        die('Something went wrong: ' . $e->getMessage());
    }


    $fileData = json_decode($response->getBody()->getContents(), true);
    file_put_contents('tts.mp3', base64_decode($fileData['audioContent']));

Bisogna effettuare una POST request all’endpoint dedicato. Nel mio caso specifico ho aggiunto, nella query, la key per l’autenticazione. Per tenere le cose semplici ho, infatti, generato una API key dal pannello di controllo e via.

L’array $requestData contiene i dati necessari al servizio per ottenere il file audio di cui abbiamo bisogno. Per un approfondimento sul suo formato, la cosa migliore è guardare questa pagina della documentazione ufficiale.

Il risultato della richiesta, in formato JSON, si presenta più o meno così:

{
    "audioContent": "file_contents",
}

Per “file_contents” si intendono i contenuti del file audio risultante codificati in base64. Per questo motivo l’ho decodificati prima di salvarli con un semplice file_put_contents.

Eseguendo questo script si può ottenere un file audio tts.mp3, pronto all’ascolto! That’s it!

Conclusioni

Bene. Fatta l’introduzione, fatto il confronto ed uno script di prova, posso dire che ho i miei primi elementi per fare una valutazione.

Google Cloud Text-to-Speech mi piace. E molto. Il prodotto finale sintetizzato è davvero di qualità (sembra di parlare di una droga) e credo proprio di usarlo anche in cryptoaud.io, per cercare di creare un’esperienza utente migliore.

Certo, inizialmente quei $16 per milione di caratteri possono far storcere il naso… ma se ci si pensa bene, “Le avventure di Huckleberry Finn” di Mark Twain (circa 350 pagine) contano all’incirca 600.000 caratteri. No, dai, non è poi così male, vero?