Compatibile con Xcode 8

SpeechSynthesizer in Swift. Fai parlare la tua app iOS!

ENTRA NEL NOSTRO GRUPPO FACEBOOK

Ti piacerebbe far parlare la tua applicazione?

Sappiamo bene quanto stiano diventando sempre più preponderati le intelligenze artificiali come Siri o Cortana: chiedi qualcosa e loro sono pronti a risolverla. Tecnologie quasi mature che, si spera, diventeranno accessibili a tutti tra qualche anno.

Dico si spera perché ancora non è possibile poter utilizzare le funzionalità di Siri all’interno della propria app iOS. L’unica cosa che è possibile fare, anche se non riguarda Siri, è quella della lettura vocale dei testi presenti nella tua applicazione.

Qualcosa che si avvicina molto ad un’AI ma alla quale non è possibile fare delle domande.

Far parlare la tua app, all’apparenza, può sembrare un processo complicato. Vedrai che la semplicità con cui potrai implementare questa funzionalità è, a dir poco, impressionante. Cosa da non sottovalutare, aumenterà enormemente la User Experience e renderà la tua app decisamente appetibile agli occhi dei tuoi utenti.

Come ci riuscirai? Semplice!

Cominciamo subito presentando la classe AVSpeechSynthesizer in Swift. Altro non è che il contenitore che gestisce le funzionalità di Text To Speech.

Attraverso lo SpeechSynthesizer in Swift sarai in grado di far parlare il tuo device in ben 37 lingue diverse. Lo SpeechSynthesizer, inoltre, ti permetterà di personalizzare a tuo piacimento la velocità, l’intonazione ed il volume (oltre che, ovviamente la lingua).

Unendo le funzionalità di TextToSpeech a quelle che abbiamo già visto in precedenza con l’internazionalizzazione dell’app, potrai creare un traduttore vocale, una app per insegnare le lingue e chi più ne ha più ne metta. Le possibilità sono davvero infinite!

Il Progetto di partenza

Imparerai ad utilizza l’AVSpeechSynthesizer in Swift creando una piccola applicazione. L’applicazione conterrà una Text Field all’interno della quale scriverai il testo che la tua applicazione pronuncerà per te.

Do per scontato che tu conosca il linguaggio Swift e che conosca le basi per creare una semplice app (nel caso ti mancassero questi due requisiti, ti consiglio di mettere da parte questo tutorial e fare qualche passo indietro. Per esempio, parti dai consigli di Giuseppe).

Premessa fatta. Cominciamo!

Crea un nuovo progetto iOS Single View utilizzando il linguaggio Swift. Il mio progetto l’ho chiamato Repeat. A fine tutorial troverai il progetto completo che potrai scaricare.

Imposta come unica Device Orientation Portrait, per semplicità, così da non dover perdere troppo tempo con le impostazioni di layout. Se hai bisogno di ulteriori specifiche sulla creazioni dei layout le trovi comunque qui:

Adesso apri lo storyboard e inserisci subito una Label, un TextField e un Button, nella parte alta dello schermo, e tre slider con un PickerView nella parte bassa, dove selezionerai la lingua.

Il risultato finale dovrebbe essere più o meno questo (ho inserito un’icona per il bottone, per rendere il tutto esteticamente più apprezzabile). Se vuoi puoi scaricare il progetto base da qui:

[wpdm_package id=’42749′]

TextToSpeech

Se non hai scaricato il progetto base, ricordati di creare le IBOutlet che collegano gli oggetti grafici al codice:

E la IBAction per il bottone:

Ti ricordo che trovi il progetto completo a fine lezione nel caso dovessi incontrare dei problemi. Se invece stai avendo difficoltà già adesso, ti consiglio di  dare un’occhiata ai nostri corsi.

AVSpeechSynthesizer e AVSpeechUtterance

La classe AVSpeechSynthesizer è una sottoclasse di AVFoundation. Quindi, per prima cosa, devi importare AVFoundation nel tuo ViewController.

Dichiara ed inizializza la costante speechSynthesizer assegnandogli un nuovo oggetto AVSpeechSynthesizer. Questo è l’oggetto fondamentale che si occuperà della sinterizzazione della voce.

Dichiariamola in testa, subito dopo la definizione di classe, in modo da poterla richiamare quando vogliamo.

Se la classe AVSpeechSynthesizer permette di leggere un testo, la classe AVSpeechUtterance incapsula e “formatta” il testo per poter essere interpretato e trasformato in segnale audio dall’AVSpeechSynthesizer. 

L’AVSpeechUtterance leggerà il testo dalla TextField e passerà il testo al tuo sintetizzatore.

Quindi, Inserisci questo codice dentro la func Ripeti (cioè la tua IBAction per il bottone):

Fatto?

Se adesso avvii l’applicazione, come per magia, il tuo iPhone prenderà vita e comincerà a parlare (mi raccomando, scrivi qualcosa nel TextField… altrimenti….)

Ma non è finita qui, abbiamo ancora un po’ di strada da fare, ci sono diverse personalizzazioni che dobbiamo aggiungere a questo progetto:

Modificare la Tonalità, Velocità e Volume

Puoi cambiare la tonalità audio modificando la proprietà pitchMultiplier. Tale proprietà può assumere valore float da 0.50 a 2.00 (il valore di default è 1.00)

Per fare una prova, cambia il valore a 0.50, subito dopo l’inizializzazione di speechUtterance:

e poi, per sentire la differenza, cambialo a 2.00 e riprova. Hai notato?

Maggiore è il valore, più è acuta la voce. Viceversa, man mano che riduci il valore, la voce si fa più bassa e “profonda”.

Ok! Adesso facciamo un piccolo passo in avanti e sfruttiamo lo slider che hai creato all’inizio. Comincia creando una variabile Float. Io l’ho chiamata tonalità:

Sostituisci il valore del .pitchMultiplier con la variabile appena creata:

Modifichiamo la tonalità in base al valore dello Slider.

Cambia il valore minimo e massimo (come già detto, da 0.50 a 2.00) dello slider. Infine, associa il valore dello slider alla proprietà tonalità. Così, ad ogni variazione dello slider, si aggiornerà anche la tonalità della nostra voce. Non male, no?

Quindi setta i parametri del minimo e massimo valore dello slider nel ViewDidLoad:

Crea una IBAction per lo Slider della tonalità ed assegna il suo valore alla proprietà totalità:

La stessa procedura ripetila anche per gli altri parametri, cioè velocità e volume. Cominciamo con la creazione delle variabili in testa, insieme alla variabile tonalità già creata.

La velocità ha un valore standard che va da 0.00 a 1.00, così come il volume.

Quindi, sempre all’interno di ViewDidLoad:

Crea l’action anche per i due slider rimasti e associa la variabile Float corrispondente.  In questo modo la modifica dello slider avrà effetto sul sintetizzatore:

Infine, ultimo passaggio, le nostre tre variabili devono essere associate allo speechUtterance.

All’interno della func Ripeti, subito dopo la definizione della costante speechUtterance:

In questo modo ogni modifica che effettuerai nei tre slider avrà effetto alla successiva pressione del bottone.

A questo punto, nuovo Build & Run, avrai il pieno controllo della voce, modificando gli slider potrai sentire tutte le differenze di volume, tono, velocità…

Cambiare la lingua dello SpeechSynthesizer

Forse la più grande feature, che affronteremo adesso, è la numerosità di lingue che questa classe ti mette a disposizione.

Nella parte bassa della View, non a caso, ho aggiunto un PickerView. Questo verrà popolato con tutte le lingue supportate dalla classe ed il Picker ti permetterà di poterle selezionare a tuo piacimento.

Per fare questo hai bisogno di due array. Questi array conterranno i valori delle lingue supportate (aggiungili sotto tutte le altre proprietà della classe):

Il primo array mi serve ad ottenere il nome della lingua, e andrà a popolare il PickerView.

L‘informazione che andrà passata a speechUtterance non è esattamente il nome, ma un codice in stringa (per esempio, il codice per l’italiano in Italia è: “it-IT”), perciò il secondo array conterrà appunto il codice corrispondente.

Andiamo innanzitutto ad alimentare questi array. Crea un ciclo for all’interno del ViewDidLoad per ogni elemento del parametro speechVoices all’interno della classe AVSpeechSynthesisVoice. La comodità di utilizzare questo metodo è che, quando Apple implementerà nuove lingue, le avrai immediatamente disponibili senza bisogno di mettere di nuovo mano al codice.

Nel tuo viewDidLoad, inserisci il seguente codice:

Noterai subito che ho creato due nuove costanti, voiceLanguageCode e languageName, che andranno nei miei due array, pescando le informazioni del codice della lingua, e del nome corrispondente, dall’elemento voice.

A questo punto devi alimentare il tuo PickerView… andrò un po’ veloce perché anche questa parte non è core nel nostro tutorial, se hai difficoltà fai pure riferimento al  Corso Sviluppo Applicazioni iOS dove l’utilizzo di questo ed altri elementi è ben spiegato.

Innanzitutto alla dichiarazione del ViewController aggiungo: UIPickerViewDelegate, UIPickerViewDataSource

e in ViewDidLoad definisco in self sia il delegate che il dataSource del mio PickerView:

Ricordati di creare le func fondamentali per il PickerView:

Il numero delle righe che comporranno il PickerView sarà pari al numero degli elementi del mio array che andrà ad alimentare il Picker stesso.

Adesso utilizza i nomi delle lingue per riempire le righe del PickerView:

E infine, vai a controllare la reazione alla selezione di una lingua nel metodo didSelectRow. In una nuova proprietà che devi aggiungere sotto le altre della classe, var linguaSelezionata: String!, passa l’elemento dell’array codiceLingueSupportate corrispondente al nome della lingua selezionato:

Fatto? Benissimo, ora, l’ultimissimo passaggio è quello di passare il valore della voce selezionata dal Picker allo SpeechUtterance. Aggiungi queste due righe di codice alla func Ripeti (prima dell’ultima riga: speakUtterance(speechUtterance) )

Ed ora la nostra missione è completata.

Speaker Swift

Lancia un ultimo Build&Run.

Considerazioni e Download del progetto

Ora hai il pieno controllo di tutte le principali funzionalità del tuo nuovo SpeechSynthesizer in Swift. Uno degli utilizzi principali di questo oggetto è quello di fornire supporto ai non vedenti o ad attività che non permettono la visione dello schermo del dispositivo. Per esempio, potrebbe essere utilizzato durante la guida per evitare di dover tenere in mano il dispositivo o addirittura mentre si lavora.

I campi d’utilizzo sono realmente infiniti.

Di seguito trovi il download del progetto finale:

[sociallocker][wpdm_package id=’42751′][/sociallocker]

Buona programmazione!

Start typing and press Enter to search

UIImagePickerController in Swift