In questo post illustro come: estrarre tracce audio da filmati (usando, per esempio, YouTube), eseguire una conversione del parlato in testo (speech to text), estrarre conoscenza dal testo non strutturato della trascrizione.

Utilizzo le funzionalità di IBM Watson accessibili mediante Watson Developer Cloud e il linguaggio di programmazione Python.

La scelta di Watson non è vincolante. Funzionalità analoghe potrebbero essere ottenute utilizzando altre soluzioni comparabili come quelle fornite da Microsoft Azure ML, Google Cloud Platform, Amazon AWS ML e una pletora di servizi online come MonkeyLearn e altri. Per esempio, il riconoscimento vocale accessibile con le Speech API di Google supporta 80 lingue che è un numero ben superiore alle attuali capacità di Watson. Ciononostante, grazie anche alla varietà e profondità della sua offerta, Watson assolve sul mercato un ruolo di riferimento con cui è necessario e utile misurarsi.

Anzitutto, che cos’è IBM Watson? Nella sua strategia di diversificazione, IBM ha sempre mostrato una particolare attenzione per l’intelligenza artificiale, anche contribuendo allo sviluppo tecnologico con passaggi importanti: nel 1997, dopo 8 anni di sviluppi, IBM Deep Blue si aggiudicò una rivincita storica a scacchi contro il campione del mondo Kasparov e nel 2011 il nuovo IBM Watson1, partecipando al famoso quiz televisivo “Jeopardy!”, fu in grado di battere i due campioni in carica.

Il Watson dell’edizione di “Jeopardy!” aveva alle spalle circa 6 anni di sviluppi2. In essenza, Watson nasce come un sofisticato sistema di Question Anwering (QA) predisposto alla comprensione del linguaggio naturale, alla generazione di ipotesi e all’apprendimento. Un suo elemento fondamentale è il framework DeepQA che è definito come una massive parrallel probabilistic evidence-based architecture3 e si basa sull’impiego concorrente di molteplici algoritmi di analisi della domanda in linguaggio naturale, ricerca delle risposte, classificazione delle risposte secondo la loro plausibilità (e conseguente scelta delle risposte probabilisticamente più giuste in relazione all’input); il tutto combinato per ottenere miglioramenti consistenti nell’accuratezza, nel livello di confidenza e nella velocità di processazione. Gli antichi latini dicevano “mens sana in corpore sano” e, il “corpo” che ospita la mente di Watson, è indubbiamente sano: i dati più recenti descrivono una griglia di 90 server basati su processori in tecnologia proprietaria POWER7 estremamente parallelizzati, per una potenza complessiva di calcolo di 80 teraFLOPS4 e 16 teraByte di RAM. Il progettista e consulente IBM Tony Pearson aveva stimato i costi dell’hardware di Watson in tre milioni di dollari. L’architettura del sistema è certamente in evoluzione stante i continui progressi tecnologici.

Ad ogni modo, per essere pienamente compreso, Watson non dovrebbe essere considerato come un supercomputer5 ma, più correttamente, è un ecosistema6 basato su:

  • continui investimenti e sperimentazioni in un’ampia varietà di contesti operativi: campo finanziario, burocratico, medico, bancario, servizi governativi, viaggi e customer care, culinario. Questi investimenti sono dei veri e propri apripista,
  • prodotti commerciali pronti all’uso e offerti da IBM come servizi a canone su cloud SaaS. Alcuni esempi: Watson Virtual Agent, Watson Explorer, Watson Analytics, Watson Knowledge Studio,
  • un esteso set di servizi cognitivi denominati Watson Developer Cloud e accessibili mediante API e SDK attraverso la piattaforma PaaS IBM Bluemix.

Con Watson Developer Cloud, IBM declina i servizi cognitivi di Watson allo sviluppo personalizzato: aziende e sviluppatori possono aggiungere valore combinando le tecnologie di base (classificazione, conversazione, analisi del contenuto, ecc.), sfruttando i vantaggi del PaaS per tutte le necessità di scaling verticale/orizzontale e confezionando il risultato in una forma direttamente commerciabile sul marketplace proprietario preposto allo scopo.

Alle funzionalità originarie di QA che ritroviamo nei servizi Natural Language Classifier, Dialog, Retrieve e Rank e Document Conversion, Watson Developer Cloud aggiunge ulteriori servizi per rendere l’offerta cognitiva flessibile e multisettoriale (p.e. comprensione contenuto e contesto del testo, analisi emozionale, conversione e sintesi della voce umana, analisi delle immagini, ecc.). La combinazione delle continue sperimentazioni con prodotti commerciali e il Watson Developer Cloud, appare oggi essere l’espressione più completa dell’idea che spinse alla creazione di Watson stesso: avere uno strumento per risolvere problemi concreti all’interno di realtà che hanno a che fare con l’analisi quotidiana di grosse quantità di dati.

Prima di proseguire, ecco di cosa abbiamo bisogno:

  • un account su IBM Bluemix (se sei nuovo su Bluemix puoi partire dalla pagina di registrazione),
  • un ambiente Python 2.7 o 3.2+ con libreria pandas installata.

Estrazione delle tracce audio da un video

Attenzione! La scelta di estrarre una traccia audio da un video YouTube è da intendersi come pura sperimentazione, nel pieno rispetto delle policy Google per il download dei video e la loro diffusione. Il video usato per l’analisi è stato scelto casualmente. Per eventuali questioni relative ai diritti di proprietà sul contenuto del video, rinvio all’autore/publisher. Tutte le operazioni di analisi descritte in questo post sono applicabili a qualsiasi file audio (a prescindere dalla sorgente, YouTube è un esempio). Dopo le sperimentazioni, il file wav contenente la traccia audio del video è stato cancellato.

Un modo semplice per estrarre una traccia audio da un video YouTube consiste nell’usare il tool youtube-dl7. youtube-dl è installabile nel modo usuale per i package di Python:

pip install youtube-dl

In particolare, ho casualmente scelto il video What is Machine Learning accessibile all’indirizzo https://www.youtube.com/watch?v=ty-kTUzMnjk.

Il comando usato per l’estrazione è:

youtube-dl "https://www.youtube.com/watch?v=ty-kTUzMnjk" \	
	--extract-audio \
	--audio-format wav \
	--audio-quality 16K \
	--id

Il codice alfanumerico ty-kTUzMnjk usato nel comando di estrazione è l’identificativo univoco del video nell’archivio di YouTube. Una volta acceduto alla pagina del video su YouTube, il codice univoco può essere recuperato dalla barra dell’indirizzo del browser o facendo click sul pulsante “Condividi”.

youtube-dl potrebbe richiede l’installazione della libreria libav. Sui sistemi Debian/Ubuntu questa libreria è inclusa nel package libav-tools.

Dall’esecuzione di youtube-dl ottengo un file wav (ty-kTUzMnjk.wav) contenente la traccia audio opportunamente codificata (secondo i requisiti del servizio di speech recognition).

Predisposizione dei servizi Watson su Bluemix

Assumendo che siamo già registrati su Bluemix, il passo successivo consiste nel configurare un set di credenziali per l’accesso a due servizi specifici:

  • Speech To Text: converte la voce umana in testo scritto
  • AlchemyAPI: è un insieme di API che consentono l’analisi del testo attraverso NLP (Natural Language Processing). Mediante queste API è possibile utilizzare diverse funzioni come: estrazione di parole chiave, estrazione di entità, analisi delle opinioni, analisi emozionali, tagging concettuale, estrazione di relazioni, classificazione tassonomica e altro ancora.

Ci sono diverse modalità per l’attivazione dei servizi e la configurazione delle credenziali. Il metodo più semplice consiste, partendo dal cruscotto di Bluemix, nel fare click su “Catalogo” e scrivere nella search bar il nome (o parte di esso) del servizio a cui siamo interessati e poi fare click sul pulsante “Filtro”. Per esempio, se scriviamo speech e facciamo click su “Filtro”, il cruscotto visualizzerà un elenco di servizi incluso quello di nostro interesse: “Speech To Text”. Facciamo click sul servizio, per accedere alla sua pagina descrittiva. Dalla pagina descrittiva, nella barra a fondo pagina, facciamo click sul pulsante “Crea”, per accedere alla sezione di gestione del servizio. Dalla sezione di gestione, facciamo click su “Credenziali del servizio” e quindi su “Visualizza credenziali”, per ottenere le credenziali nel seguente formato:

{
  "url": "https://stream.watsonplatform.net/speech-to-text/api",
  "password": "V6l*******",
  "username": "d6c7fe4f-6644-437f-baf2-*******"
}

Procediamo in modo analogo con il servizio AlchemyAPI, ottenendo un blocco di credenziali simile al seguente:
{
  "url": "https://gateway-a.watsonplatform.net/calls",
  "note": "It may take up to 5 minutes for this key to become active",
  "apikey": "a0e8bb2**************************"
}

Dalla pagina descrittiva di un servizio di Bluemix, cliccando su “Gestisci”, è possibile accedere alla documentazione dettagliata del servizio con informazioni sul funzionamento dello stesso, requisiti, opzioni impostabili, caratteristiche dell’output generato.

Predisposizione ambiente Python per l’accesso ai servizi di Watson Developer Cloud

Per l’accesso ai servizi di Watson Developer Cloud è disponibile il package Watson Developer Cloud Python SDK installabile nel modo usuale:

pip install --upgrade watson-developer-cloud

Non c’è altro da aggiungere. A questo punto, ho tutto quello che serve per interagire con i servizi di Watson.

Conversione della voce in testo

Il blocco di codice seguente include le istruzioni per richiedere al servizio Speech to Text la processazione del file wav precedentemente generato.

import json
from os.path import join, dirname
from watson_developer_cloud import SpeechToTextV1
import pickle

speech_to_text = SpeechToTextV1(
    username='d6c7fe4f-6644-437f-baf2-*******',
    password='V6l*******',
    x_watson_learning_opt_out=False
)

filename='./ty-kTUzMnjk'

with open(filename+'.wav', 'rb') as audio_file:
    results=speech_to_text.recognize(audio_file, 
                                     content_type='audio/wav', 
                                     continuous=True, 
                                     timestamps=True, 
                                     word_confidence=True, 
                                     profanity_filter=False, 
                                     word_alternatives_threshold=0.4)

pickle.dump(results, open(filename+'.watson.p','wb'))

Un oggetto fondamentale è l’istanza speech_to_text della classe SpeechToTextV1. Di questo oggetto, richiamo la funzione recognize. Alla funzione è necessario passare alcuni parametri obbligatori: il contenuto del file audio audio_file e il formato audio content_type='audio/wav'. Inoltre specifico dei parametri di input aggiuntivi: timestamps=True per ottenere i timestamp inizio/fine della parola, espressi in secondi, a partire dall’inizio dell’audio; word_confidence=True per attribuzione ad ogni parola di un grado di confidenza variabile nell’intervallo reale [0 – 1.0] (un grado 0.5 significa che la parola ha il 50% di possibilità di essere corretta); profanity_filter=False per la disattivazione della censura automatica di parole offensive; word_alternatives_threshold=0.4 per l’impostazione di una soglia minima di confidenza (definita nell’intervallo rale [0 – 1.0]) utilizzata per scartare parole potenzialmente corrispondenti alle specifiche porzioni di segnale acustico; continous=True per l’attivazione del riconoscimento continuo che permette di gestire lunghe pause e lunghi intervalli di parlato (di default la processazione terminerebbe alla prima breve pausa). Un quadro dettagliato dei parametri impostabili è contenuto in Transcribing audio: Output features and parameters accessibile dalla pagina descrittiva del servizio.

Per ottimizzare l’impiego dei servizi Cloud e agevolarne il riuso, solitamente preferisco salvare le risposte su disco mediante serializzazione. Questo semplice accorgimento consente, in fase di sviluppo e test, di evitare di richiamare il servizio remoto plurime volte per lo stesso tipo di elaborazione. Nel codice utilizzo la libreria pickle per questo scopo. L’output del servizio è serializzato nel file 9uYwifRCGpA.watson.p.

Elaborazione della risposta di Watson

La risposta del servizio Speech to Text è una codifica JSON sufficientemente estesa, ma facile da interpretare. La funzione recognize restituisce la risposta del servizio in un python dictionary che rappresenta un passo in avanti rispetto alla codifica JSON cruda. Comunque, per semplificare il recupero dei dati, preferisco usare la funzione parse_transcript nel blocco di codice seguente8. La funzione restituisce due dictionary, words e lines, agevolmente incorporabili in oggetti DataFrame di pandas e, come tali, anche più comodamente esportabili in formato CSV.

def parse_transcript(data):
    """
    data (dict): as derived from standard Watson API JSON
    returns: two dicts of lists of dicts:
    {
        words: [],
        lines: []
    }
    This is something that can be converted to CSV easily
    {
        'start': 1.00
        'end': 3.00
        'confidence': 0.77
        'words': "Hello world"
        'pregap': 0.5,
        'postgap': 1.2
    }
    """
    lines = []
    words = []
    prev_line_end = 0
    line_results = data['results']
    for linenum, result in enumerate(line_results): # each result is a  line
        if result.get('alternatives'): # each result may have many alternatives
            # just pick best alternative
            lineobj = result.get('alternatives')[0]
            # each line has timestamps per word
            # filter out the HESITATIONs
            # Watson adds %HESITATION to indicate things like Uh, Um, Ah, etc.
            word_timestamps = [o for o in lineobj['timestamps'] if o[0] != '%HESITATION']
            if word_timestamps: # for some reason, timestamps can be empty in some cases
                linewords = []
                # confidence value per word is stored in its own list
                word_confidences = [o for o in lineobj['word_confidence'] if o[0] != '%HESITATION']
                prev_word_end = 0
                for wordpos, txtobj in enumerate(word_timestamps):
                    # we track the word's position in the line so that we can extract the
                    # corresponding word confidence for the current word
                    word = {}
                    word["line_position"] = wordpos
                    word["line_number"] = linenum
                    word['confidence'] =  round(word_confidences[wordpos][1], 3)
                    word["text"] = txtobj[0]
                    word["start"] = txtobj[1]
                    word["end"] = txtobj[2]
                    word["audible_duration"] = round(word["end"] - word["start"], 2)
                    # calculate delay until previous word
                    word["pregap"] = round(word["start"] - prev_word_end, 2)
                    prev_word_end = word["end"]
                    linewords.append(word)

                words.extend(linewords)
                
                line = {}
                line['line_number'] = linenum
                line['start'] = linewords[0]['start']
                line['end'] = linewords[-1]['end']
                line['text'] = " ".join([w['text'] for w in linewords])
                line['audible_duration'] = round(line['end'] - line['start'], 2)
                line['confidence'] = round(lineobj['confidence'], 3)
                line['word_count'] = len(words)
             
                lines.append(line)
                

    return {'lines': lines, 'words': words}

Per la conversione in dataframe:

import pandas as pd

# if you need to unserialize:
# results=pickle.load(open('./9uYwifRCGpA.watson.p','rb'))

data=parse_transcript(results)
lines=pd.DataFrame(data['lines'])
words=pd.DataFrame(data['words'])

Nella figura seguente è mostrato il contenuto dei dataframe lines e words (limitato alle prime 4 righe di ciascuno):

schermata-2016-11-01-alle-22-09-35

Ogni riga del dataframe lines corrisponde ad una frase riconosciuta. I campi di dati sono:

  • audible_duration: durata in secondi della frase
  • confidence: grado di confidenza complessivo sulla frase
  • start: timestamp di inizio frase, espresso in secondi, dall’inizio dello stream audio
  • end: timestamp di fine frase, espresso in secondi, dall’inizio dello stream audio
  • line_number: indice numerico univoco della frase
  • text: testo della frase
  • word_count: numero totale delle parole riconosciute dalla prima fase a quella corrente inclusa

Ognia riga del dataframe words corrisponde ad una parola riconosciuta nel flusso del parlato. I campi di dati sono:

  • audible_duration: durata in secondi della parola
  • confidence: grado di confidenza complessivo sulla parola
  • start: timestamp di inizio parola, espresso in secondi, dall’inizio dello stream audio
  • end: timestamp di fine parola, espresso in secondi, dall’inizio dello stream audio
  • line_number: indice della frase a cui è associata la parola
  • line_position: posizione della parola nella frase
  • text: testo della parola
  • pregap: intervallo di silenzio tra la fine della parola precedente e la parola corrente

L’intera trascrizione può essere ottenuta con una riga di codice:

transcript="\n".join((lines['text']).tolist())
print (transcript)

ed ecco l’output:

machine learning is a method of teaching computers to make predictions based on some data
it is a branch of artificial intelligence
which automatically improves programs using data
for example a machine learning system could be trained on email messages
to learn to distinguish between spam and non spam messages
after learning it can be used to classify new email messages into spam and non spam folders
various fields where machine learning is frequently used our medical diagnosis
brain machine interfaces
chem informatics
self driving cars
stock market analysis
a recommendation engine using machine learning could be used to recommend the right product to the right customer
over time as more data is added and used by the algorithm the performance of the system improves

A titolo comparativo, questa la trascrizione scaricabile dal sito di YouTube:

0:00
machine learning is a method of teaching computers to make predictions based on
0:05
some data it is a branch of artificial intelligence which automatically
0:10
improves programs using data for example a machine learning system could be
0:16
trained on email messages to learn to distinguish between spam and non-spam
0:20
messages after learning it can be used to classify new email messages into spam
0:27
and non-spam folders various fields where machine learning is frequently
0:33
used our medical diagnosis brain-machine interfaces chem informatics self-driving
0:40
cars stock market analysis a recommendation engine using machine
0:45
learning could be used to recommend the right product to the right customer over
0:50
time as more data is added and used by the algorithm the performance of the
0:54
system improves

Analisi del testo attraverso NLP (Natural Language Processing)

Il blocco di codice seguente include le istruzioni per richiedere al servizio AlchemyAPI di Watson specifiche elaborazioni della trascrizione precedentemente generata. In particolare queste le funzioni richieste:

  • estrazione di parole chiave: individuazione delle parole chiave nel testo, attribuzione di un grado di rilevanza, analisi del sentiment di ogni parola
  • tagging concettuale: identifica concetti generali che potrebbero non essere stati esplicitamente citati nel testo di input ma che sono ad esso correlabili
  • classificazione tassonomica: classifica il contenuto del testo di input in una gerarchia di categorie
  • analisi emozionale: analisi emozionale di specifiche frasi target in relazione al testo processato. L’identificazione emozionale avviene sulla base di Rabbia/Anger, Paura/Fear, Gioia/Joy, Tristezza/Sadness, Disgusto/Disgust con relativa attribuazione di punteggio
  • analisi del sentiment: analisi del sentiment di specifiche frasi target e del testo complessivo della trascrizione
  • tipizzazione automatica di relazioni tra entità nel testo: individuazione delle relazioni di dipedenza tra entità individuate automaticamente nel testo. Le entità tipicamente sono nomi di persona, brand, organizzazioni, città ed altre presenti nel testo.

import json
from os.path import join, dirname
from watson_developer_cloud import AlchemyLanguageV1

alchemy_language = AlchemyLanguageV1(api_key='a0e8bb2**************************')

# get entity, keyword, taxonomy, concepts with a single call
comb=alchemy_language.combined(text=transcript, sentiment=True)

concepts=pd.DataFrame(comb['concepts'])
keywords=pd.DataFrame(comb['keywords'])
taxonomy=pd.DataFrame(comb['taxonomy'])
language_detection=comb['language']

target_phrases=['machine learning', 'spam',
                'stock market analysis', 
                'recommendation engine',
                'right product',
                'right customer'
                'data',
                'predictions']

# get targeted sentiment
res_targ_sent=alchemy_language.targeted_sentiment(text=transcript, 
                                    targets=target_phrases, 
                                    language='english')

target_sent=pd.DataFrame(res_targ_sent['results'])

# get targeted emotion
res_targ_emot=alchemy_language.targeted_emotion(text=transcript, 
                                    targets=target_phrases, 
                                    language='english')

target_emot=pd.DataFrame(res_targ_emot['results'])

# get document emotion
emot=alchemy_language.emotion(text=transcript)

# get typed relations
relat=alchemy_language.typed_relations(text=transcript)

Con riferimento al blocco di codice precedente, l’oggetto chiave è l’istanza alchemy_language della classe AlchemyLanguageV1. La funzione combined consente di circoscrive ad una singola chiamata multiple richieste, nel caso particolare recuperiamo l’elenco dei concetti concepts, l’elenco delle parole chiave keywords, la classificazione tassonomica taxonomy e la detection automatica della lingua del parlato language_detection. Nella figura seguente sono mostrate le prime righe dei dataframe concepts, keywords e taxonomy.

watson-concepts-keywords-taxonomy

I concetti individuati, in ordine di rilevanza, sono: Machine learning, Computer, Learning, Artificial intelligence, E-mail spam, Cognitive science, Psychology, Scientific method, Computer science, E-mail, Intelligence, Artificial neural network, Alan Turing, Education, Skill, Algorithm, Computer program, Computer vision, Debut albums, Knowledge, Marketing, Fuzzy logic, Information theory, Computational intelligence, Data, Bayesian network, Natural language processing, Stock, Cybernetics, Engine, Medical diagnosis, Machine, Right-wing politics. Ad ogni concetto è attribuito un grado di rilevanza e una serie di collegamenti a risorse su web per la caratterizzazione semantica secondo specifiche ontologie.

Le parole chiave individuate, in ordine di rilevanza, sono: machine learning, non spam, non spam folders, non spam messages, email messages, new email messages, stock market analysis, artificial intelligence, chem informatics, recommendation engine, various fields, medical diagnosis, brain machine, right product, right customer, data, predictions, example, algorithm, branch, method, computers, interfaces, programs, self, cars. Ad ogni parola è attribuito un grado di rilevanza e un sentiment che può essere positive oppure negative con relativo punteggio.

Per quanto concerne la tassonomia, Watson ha correttamente inquadrato l’argomento centrale, assegnando il punteggio più alto alla classificazione /science/computer science/artificial intelligence. Poichè il video si sofferma qualche secondo sull’impiego degli algoritmi di ML nella discriminazione di mail spamming, compare anche la classificazione /technology and computing/internet technology/email ma con un punteggio più basso. Interessante l’individuazione di /automotive and vehicles/cars (in virtù dei riferimenti nella trascrizione alle capacità di guida automatica), questo è chiaramente un “fuori tema” che Watson ha però correttamente inquadrato come tale assegnandogli una confidence negativa.

Partendo da un elenco di target che ho liberamente scelto (machine learning, spam, stock market analysis, recommendation engine, right product, predictions) ho richiesto a Watson l’analisi del sentiment e dell’emotion di ogni target, stante il testo in input. Nella figura seguente sono visualizzati i dataframe contenenti i dati ricevuti:

watson-target-sent-emot

Notiamo che alla parola spam è stato associato un sentiment negative e una emotion sadness (bravo Watson!). Il sentiment è comprensibilmente neutral (data la brevità della citazione nella trascrizione) sulla parola stock market analysis con una emotion joy.

La valutazione del sentiment complessivo è così codificata (in emot):

{u'anger': u'0.515118', u'joy': u'0.140224', u'fear': u'0.207606', u'sadness': u'0.097711', u'disgust': u'0.125342'}

Infine le relazioni tipizzate sono così codificate (in relat):

u'language': u'english',
 u'model': u'en-news',
 u'status': u'OK',
 u'totalTransactions': u'2',
 u'typedRelations': [{u'arguments': [{u'entities': [{u'id': u'-E2',
       u'text': u'customer',
       u'type': u'Person'}],
     u'part': u'first',
     u'text': u'customer'},
    {u'entities': [{u'id': u'-E3',
       u'text': u'recommend',
       u'type': u'EventCommunication'}],
     u'part': u'second',
     u'text': u'recommend'}],
   u'score': u'0.548522',
   u'sentence': u'machine learning is a method of teaching computers to make predictions based on some data it is a branch of artificial intelligence which automatically improves programs using data for example a machine learning system could be trained on email messages to learn to distinguish between spam and non spam messages after learning it can be used to classify new email messages into spam and non spam folders various fields where machine learning is frequently used our medical diagnosis brain machine interfaces chem informatics self driving cars stock market analysis a recommendation engine using machine learning could be used to recommend the right product to the right customer over time as more data is added and used by the algorithm the performance of the system improves',
   u'type': u'affectedBy'}]

Con riferimento alla precedente codifica, Watson ci informa che nel testo analizzato l’entità customer è influenzata affectedBy dall’entità recommend e qualifica l’entità customer come Person e l’entità recommend come EventCommunication. In effetti, gran parte del testo è dedicata a: …a recommendation engine using machine learning could be used to recommend the right product to the right customer over time as more data is added and used by the algorithm the performance of the system improves…. L’analisi delle interdipendenze concettuali è particolarmente utile, per esempio, nella costruzione di agenti virtuali, chatbot e, in generale, per tutti quei sistemi che devono capire il contesto dell’interazione per selezionare le più appropiate regole di dialogo.

Conclusioni

I tempi di interazione con un sistema come Watson sono molto bassi (questo è un bene!) e le modalità di comunicazione sul piano programmatico sono semplificate al massimo. Cloud + API generation + ML elevano la qualità dell’interazione uomo-macchina ad un livello fatto di dati ed obiettivi. L’approccio procedurale classico è sempre più fortemente ridimensionato a favore di un approccio dichiarativo. Scompaiono le complicazioni infrastrutturali, grazie alla scalabilità intrinseca delle piattaforme SaaS che si dimensionano automaticamente in relazione alla complessità del problema da trattare. Il punto chiave oggi è: conoscere e selezionare i servizi, combinarli, armonizzarli per raggiungere l’obiettivo desiderato.

Infine, una struttura dati come il dataframe words – in cui per ogni parola riconosciuta è registrata la sua posizione (timestamp inizio/fine) nel flusso audio – apre a operazioni di ricerca audio/video con l’ausilio di query basate su parole, porzioni di parole o sequenze di parole. Si potrebbero, per esempio, cercare tutte le occorrenze di una o più parole ottenendo un elenco di timestamp utilizzabile per estrarre i blocchi di fotogrammi in cui esse sono pronunciate, come nel seguente esempio9:

Siamo su un piano di gestione dei file multimediali (dati non strutturati per definizione) dove categorizzazione e recupero possono essere fatti automaticamente in base al reale contenuto. Oppure, più fantasiosamente ma parimenti realizzabile, penso a sistemi di sorveglianza audio/video in grado di agevolare l’individuazione e/o il recupero completamente automatizzato di porzioni di registrazioni attraverso il potere espressivo di complessi filtri testuali applicabili in batch od online. Per non parlare del marketing. Più in generale, le possibilità di impiego sono veramente enormi. Ciò che apprezzo non è solo la vastità dei problemi che si possono indirizzare, quanto la facilità con cui si possono assemblare soluzioni altamente scalabili sia tecnicamente sia economicamente.

Per concludere su Watson, è interessante valutare l’impatto economico che potrebbe avere, in un contesto reale, l’impiego dei precedenti servizi, nella misura in cui li ho effettivamente utilizzati. Il servizio “Speech to Text” è contabilizzato sul tempo di impiego per ogni minuto di conversione (circa 0,02€/Minuto). Per la scrittura di questo post, ho convertito diverse tracce audio (complessivamente circa 350 secondi di flusso audio) e il totale addebitato è di 0,12€ (come rilevabile dal cruscotto di Bluemix). Per la traccia audio in esame, la conversione ha richiesto circa 0,04€. La contabilizzazione con “AlchemyAPI” è diversa e avviene in base al numero di singole chiamate all’API anche dette transazioni o eventi (0,00526€/Eventi). Per acquisire le informazioni usate in questo post, ho inoltrato 5 chiamate, per un totale di circa 0,02€. L’aspetto interessante di AlchemyAPI è che le prime 1000 chiamate giornaliere sono gratuite per Organizzazione10 su singola istanza. Il pricing di AlchemyAPI scala al ribasso in base alla quantità di chiamate, per esempio, per più di 5 milioni di chiamate il prezzo diventa 0,00015€/Eventi. Ovviamente il modello di pricing dei servizi Watson è sufficientemente articolato, per poter soddisfare una pluralità di possibili esigenze (p.e. richieste di impieghi massivi, istanze e modelli di calcolo dedicati, crittografia dei dati trasmessi, ecc.).

  1. Il nome è stato scelto in onore del primo presidente dell’IBM Thomas J. Watson.
  2. Cognitive computing and IBM Watson in in Research, Operations, and Medicine
  3. Building Watson: An Overview of the DeepQA Project
  4. FLOPS è un’abbreviazione di FLoating point Operations Per Second e indica il numero di operazioni in virgola mobile eseguite in un secondo dalla CPU. Il teraFLOP identifica la capacità di un componente, sia questo una GPU, una CPU o un sistema più complesso, di eseguire mille miliardi di operazioni in virgola mobile in un secondo.
  5. Watson è ben lontano dalle prestazioni dei supercomputer propriamente detti, per esempio se consideriamo il Titan di Cray (20 petaFLOPS e un costo di 100 milioni di dollari) o il cinese Sunway TaihuLight (con potenza di calcolo di 93 petaFLOPS e un costo di oltre 270 milioni di dollari). Ma questa è un’altra storia!
  6. Top 38 Questions about the Watson Services on Bluemix
  7. La pagina del progetto è https://rg3.github.io/youtube-dl/.
  8. Questa funzione è stata estratta dal progetto watson-word-watcher su GitHub e modificata secondo mia necessità.
  9. E’ un’idea parzialmente sviluppata su https://github.com/dannguyen/watson-word-watcher.
  10. L’Organizzazione è l’entità di più alto livello nella gestione di un account Bluemix. Le Organizzazioni sono usate per abilitare la collaborazione tra i membri del team e per facilitare il raggruppamento logico di risorse dei progetti. Un account può gestire più Organizzazioni. Per ulteriori informazioni fare riferimento a Essential of Cloud Application Development on IBM Bluemix.

Pubblicato da lorenzo

Full-time engineer. I like to write about data science and artificial intelligence.

1 Commento

  1. post molto interessante, grazie Lorenzo

    resto perplesso rispetto alla scelta costo per evento dell’API Alchemy; se volessi analizzare in modo puntuale i commenti a un video penso che questo approccio porterebbe a costi davvero eccessivi.

    in ogni caso la piattaforma IBM Watson si posiziona davvero molto bene

    Rispondi

Vuoi commentare?