Guest post: Microsoft Translator, traduzioni automatiche (o quasi) semplici

Questo Guest Post è stato scritto da Massimo Bonanni, MVP Visual Basic Development

Introduzione

In questo post vorrei occuparmi di Microsoft Translator, la piattaforma che Microsoft mette a disposizione per la traduzione automatica (o quasi) di testi.

Prima di entrare nel vivo dell’aspetto tecnico, vorrei cercare di individuare quali sono gli scenari in cui Microsoft Translator, ed in genere la traduzione automatica, può avere senso.

Microsoft Translator non ha lo scopo di sostituire un traduttore professionale e il suo obiettivo è quello di favorire la comunicazione e la comprensione di testi scritti in una lingua da parte di chi quella lingua non la parla. Tale comprensione può avvenire anche con una traduzione non accuratissima come accade per i traduttori automatici.

Scenari adattissimi al’utilizzo di Microsoft Translator sono, quindi, quelli dei blog, dei siti tecnici o delle news.

Se abbiamo, bisogno invece, di fornire contenuti in lingua straniera in cui la sola comprensione non basta ma serve incisività e dettaglio di traduzione (ad esempio campagne di marketing o contenuti altamente professionali), dovremo, evidentemente, ricorrere al buon traduttore umano.

Gli Strumenti

Abbiamo due possibili strumenti a disposizione:

  • il web widget
  • le API (JSON, REST o SOAP)

Il web widget è un controllo web (un pezzo di codice HTML) che i web master possono inserire nel proprio sito e che consente tradurre la pagina.

Le API, invece, sono dei web services che lo sviluppatore (di un sito web, di una applicazione desktop o, perchè no, di una applicazione mobile) può richiamare per ottenere dei servizi di traduzione.

Il web Widget

Il web widget, come detto in precedenza, permette, in maniera semplice ed immediata, la traduzione delle nostre pagine semplicemente inserendo uno snippet di codice all’interno del nostro HTML.

La versione base del widget è utilizzabile senza registrazioni di sorta, mentre per le funzioni avanzate dello stesso è necessario registrarsi (gratuitamente). L’utilizzo del Widget è, comunque, gratuito (Microsoft mette il suo logo nell’HTML e “sfrutta” la visibilità).

Per configurare ed ottenere l’HTML necessario alla visualizzaione del widget è sufficiente andare all’indirizzo http://www.microsofttranslator.com/widget/.

La pagina di generazione dello snippet è molto semplice, come mostrato nella seguente figura:

clip_image002[1]

Per ottenere l’HTML da inserire nel nostro sito, è sufficiente:

  1. inserire l’indirizzo del sito che si intende tradurre;
  2. inserire la lingua del sito;
  3. configurare il tipo di traduzione tra manuale, notifica e automatica:
    1. manuale: nella nostra pagina apparirà il widget e sarà l’utente, se vorrà, a tradurre il contenuto premendo il tasto apposito;
    2. notifica: all’utente verrà notificato (tramite una barra in alto nella pagina) del fatto che è possibile tradurre il contenuto e sarà, comunque, lui a tradurlo se vuole;
    3. automatica : il contenuto verrà automaticamente tradotto nella lingua dell’utente che visita il sito e questo potrà, se vuole, vedere il contenuto originale;
  4. scegliere colore e dimensione del widget
  5. accettare i termini di utilizzo
  6. generare l’HTML da inserire nel proprio sito.

La seguente pagina mostra come si presenta il widget all’interno di una pagina web:

clip_image004[1]

In realtà il widget è formato di due controlli: uno è quello indicato nella precedente figura mentre l’altro è costituito da una barra orizzontale che compare in alto nella pagina e che segnala lo stato di avanzamento della traduzione o la notifica della stessa:

clip_image006[1]

Se non eseguiamo modifiche al nostro HTML, tutto il contenuto viene tradotto. Se vogliamo evitare che parte del nostro contenuto sia tradotto, è sufficiente inserire nel tag da non tradurre l’attributo custom translate=on oppure la classe di stile notranslate.

La pagina tradotta (sia in automatico che in manuale) ha la peculiarità di permettere la visualizzazione del contenuto originale semplicemente passando il cursore al di sopra dello stesso.

clip_image008[1]

Il widget permette di abilitare anche la funzionalità di traduzione collaborativa. Questa funzionalità consente agli utenti definiti come contributors di suggerire delle traduzioni alternative a quela automatica.

Per attivare questa funzionalità è necessario loggarsi alla pagina del widget tramite il proprio live id,e inserire il codice di invito che si può richiedere all’indirizzo: http://go.microsoft.com/?linkid=9713557&ProgramID=4678&SurveyID=10539

Una volta ricevuto il codice di invito si può accedere al pannello di attivazione della traduzione collaborativa. Questo richiede l’access token di Bing di cui parleremo in seguito e permette di abilitare le traduzioni automatiche alla revisione degli utenti.

clip_image009[1]

Gli utenti possono proporre o modificare le traduzioni alternative (loggandosi con il proprio liveid) ma solo il web master può moderarle. Quest’ultimo può abilitare alla moderazione anche altri utenti utilizzando l’apposito pannello di controllo.

clip_image010[1]

L’invito avviene tramite un link inviato tramite mail ed ha una scadenza temporale ben definita.

Attivare la suttoscrizione a Microsoft Translator

Per poter utilizzare le funzionalità di Microsoft Translator è necessario sottoscrivere un abbonamento sull’Azure Data Marketplace (https://datamarket.azure.com/dataset/1899a118-d202-492c-aa16-ba21c33c06cb) utilizzando il proprio LiveId.

clip_image012[1]

Abbiamo a disposizione numerose offerte tra cui una gratuita che permette di avere 2000 traduzioni mensili. Oltre le 2000 traduzioni mensili è necessario un abbonamento a pagamento. Per grossi volumi di traduzioni si può contattare il supporto clienti per offerte specifiche.

Una volta che abbiamo sottoscritto un abbonamento (per le prove va benissimo quello gratuito), dobbiamo registrare la nostra applicazione all’indirizzo https://datamarket.azure.com/developer/applications/.

clip_image014[1]

Il tasto Register permette di registrare una nuova applicazione:

clip_image016[1]

Il client id ed il nome dell’applicazione sono obbligatori, la descrizione è facoltativa mentre, nel caso del Translator, ll Redirect URI non è utilizzato (anche se va inserito). Il clientId identifica la nostra applicazione e la sua scelta è a nostra discrezione.

Autenticazione

I servizi esposti da Microsoft Translator prevedono due possibili modi per autenticarsi: uno di tipo “legacy” (sfruttando l’autenticazione già esistente nei vecchi servizi di Bing) e uno oAuth.

Microsoft Translator è, di fatto, il successore di Bing Translator e, per tale motivo, prevede una autenticazione basata su appId come per tutti i servizi Bing (vedere il post http://codetailor.blogspot.com/2009/08/integrare-le-funzionalita-di-bing-nei.html per dettagli su come creare una appId).

Tutti i singoli metodi SOAP, le chiamate Http o Ajax prevedono, infatti, un argomento appId che contiene, appunto, il valore generato dal sito Bing per developer.

Oltre a questa modalità, Microsoft Translator prevede anche una autenticazione di tipo oAuth.

oAuth (Open Authorization) è, in parole povere, uno standard per l'autorizzazione che permette agli utenti di condividere le loro risorse private (ad esempio, foto, video, liste di contatti) memorizzati su un sito con un altro sito senza dover consegnare a quest’ultimo le credenziali.

Il meccanismo è, quello di recuperare un access token (con una scadenza precisa) da Microsoft Translator ed utilizzarlo per la/le successive richieste al server.

Per recuperare l’access token è sufficiente eseguire una richiesta POST all’indirizzo:

https://datamarket.accesscontrol.windows.net/v2/OAuth2-13.

utilizzando i seguenti dati di POST:

 grant_type=client_credentials&client_id={clientId}&client_secret={clientSecret}=&scope=http://api.microsofttranslator.com

dove clientId e clientSecret sono i valori presenti nella pagina di registrazione dell’applicazione vista in precedenza. La risposta del server è di tipo JSON, e si presenta in questo modo:

 {"access_token":"http%3a%2f%2fschemas.xmlsoap.org%2fws%2f2005%2f05%2fidentity%2fclaims%2fnameidentifier=TestTranslator1&http%3a%2f%2fschemas.microsoft.com%2faccesscontrolservice%2f2010%2f07%2fclaims%2fidentityprovider=https%3a%2f%2fdatamarket.accesscontrol.windows.net%2f&Audience=http%3a%2f%2fapi.microsofttranslator.com&ExpiresOn=1322642739&Issuer=https%3a%2f%2fdatamarket.accesscontrol.windows.net%2f&HMACSHA256=e%2bwcAA%2b53YAHGyNyKdoGWV6x7k1Ench7EG3vuiaJIK0%3d", "token_type":"http://schemas.xmlsoap.org/ws/2009/11/swt-token-profile-1.0", "expires_in":"599", "scope":"http://api.microsofttranslator.com"}

La classe riportata di seguito espone un metodo per recuperare l’access token a partire dal clientId e dal secretClient:

 Public Class TranslatorTokenService
 Private Const AccessControlUri As String = "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13"
 Private Function GetAccessControlPostData(clientId As String, clientSecret As String) As String
 Return String.Format("grant_type=client_credentials&client_id={0}&client_secret={1}&scope=http://api.microsofttranslator.com", clientId, HttpUtility.UrlEncode(clientSecret))
 End Function
 
 Public Function GetAccessToken(clientId As String, clientSecret As String) As AccessToken
 Dim request As WebRequest = CreateRequest(clientId, clientSecret)
 Try
 Dim response = request.GetResponse()
 If response Is Nothing Then Return Nothing
 Dim serializer = New DataContractJsonSerializer(GetType(AccessToken))
 Dim token = CType(serializer.ReadObject(response.GetResponseStream()),AccessToken)
 Return token
  Catch ex As Exception
 Throw
 End Try
 Return Nothing
 End Function
 
 Private Function CreateRequest(clientId As String, clientSecret As String) As WebRequest
 Dim request = WebRequest.Create(AccessControlUri)
 request.ContentType = "application/x-www-form-urlencoded"
 request.Method = "POST"
 Dim bytes = Encoding.ASCII.GetBytes(GetAccessControlPostData(clientId, clientSecret))
 request.ContentLength = bytes.Length
 Try
 Using os As Stream = request.GetRequestStream()
 os.Write(bytes, 0, bytes.Length)
 End Using
 Catch ex As Exception
 Throw
 End Try
 Return request
 End Function
 End Class
 

La classe AccessToken contiene i dati relativi al token recuperato:

 <DataContract()>
 
Public Class AccessToken
 
 <DataMember(Name:="access_token")>
 
 Public Property Token As String
 
 <DataMember(Name:="token_type")>
 
 Public Property Type As String
 
 <DataMember(Name:="expires_in")>
 
 Public Property Duration As Integer
 
 <DataMember(Name:="scope")>
 
 Public Property Scope As String
 
 End Class
 

Gli attributi DataContract() e DataMember() permettono la deserializzazione dal formato JSON.

Le API

Le funzionalità di Microsoft Translator sono esposte con tre diversi protocolli:: Ajax, Http e Soap.

La modalità Ajax è adatta per un utilizzo all’interno di pagine Web, mentre le altre due hanno il loro naturale utilizzo in tutti gli altri scenari.

La modalità Http prevede chiamate GET o POST a seconda delle funzionalità richieste (ad esempio la traduzione di un testo è una chiamata GET mentre il metodo per recuperare le descrizioni delle lingue di traduzione è una chiamata POST) ed è indicata nell’utilizzo con quei linguaggi in cui non è semplice l’interazione con web services.

Le API Soap, infine, sono delle classiche chiamate a Web Services.

I metodi messi a disposizione sono i seguenti:

AddTranslation

Permette di suggerire un traduzione alternative per un testo.

AddTranslationArray

Permette di suggerire un insieme di traduzioni alternative per un insieme di testi.

BreakSentences

Consente di suddividere la stringa in ingress in single frasi.

Detect

Esegue il riconoscimento della lingua di un testo.

DetectArray

Esegue il riconoscimento della lingua di un insieme di testi.

GetAppIdToken

Restituisce l’appId da utilizzare nelle chiamate ai servizi.

GetLanguageNames

Recupera l’elenco delle lingue supportate dal Translator.

GetLanguagesForSpeak

Recupera l’elenco delle lingue supportate dal Translator per la sintesi vocale.

GetLanguagesForTranslate

Recupera l’elenco dei codici delle lingue supportate dal Translator.

GetTranslations

Restituisce un elenco di traduzioni alternative per un testo.

GetTranslationsArray

Restituisce un elenco di traduzioni alternative per un insieme di testi.

Speak

Restituisce l’url (in caso di Ajax o Soap) o lo stream (in caso di Http) del file wave con la pronuncia della traduzione di un testo in un lingua.

Translate

Esegue la traduzione da un lingua ad un’altra di un testo passato come parametro.

TranslateArray

Esegue la traduzione da un lingua ad un’altra di un insieme di testi passati come parametro.

Nell’esempio che vedremo in questo post utilizzeremo il protocollo Soap ed in particolare creeremo un metodo per tradurre un testo da una lingua ad un altra e un metodo per recuperare il file wave della pronuncia di un testo.

Per prima cosa referenziamo il web service Soap il cui url è:

http://api.microsofttranslator.com/V2/Soap.svc

utilizzando il menù “Add Service Reference” di Visual Studio:

clip_image017[1]

Possiamo, ad esempio, richiedere la traduzione di un testo attraverso l’uso del metodo:

Function Translate(appId As String, text As String, from As String, to As String, contentType As String, category As String) As String

Un esempio di utilizzo di questo metodo è:

 Public Function Translate(sourceText As String,
 sourceLanguage As String,
 targetLanguage As String) As String
 Dim targetText As String
 Try
 ' Aggiungo l'header oAuth
 Dim httpRequestProperty = New HttpRequestMessageProperty()
 httpRequestProperty.Method = "POST"
 httpRequestProperty.Headers.Add("Authorization", String.Format("Bearer {0}", AccessToken.Token))
 Using scope = New OperationContextScope(_MTService.InnerChannel)
 OperationContext.Current.OutgoingMessageProperties(HttpRequestMessageProperty.Name) = httpRequestProperty
 ' Eseguo la chiamata al servizio
 targetText = _MTService.Translate("", sourceText, sourceLanguage, targetLanguage, "text/plain", "general")
 End Using
 Catch ex As Exception
 Throw
 End Try
 Return targetText
 End Function

_MTService è un’istanza del proxy generato tramite il menù “Add Service Reference”.

Possiamo osservare che, prima di eseguire l’effettiva chiamata al metodo Translate, viene riempito l’header oAuth con il token recuperato dal server. In questo caso il campo appId del metodo Translate viene lasciato vuoto (non è necessario se si utilizza l’autenticazione oAuth).

SourceLanguage e TargetLanguage sono i codici, rispettivamente, della lingua di partenza e di destinazione. L’elenco delle lingue a disposizione per le traduzioni è recuperabile tramite il metodo GetLanguagesForTranslate o all’indirizzo http://msdn.microsoft.com/en-us/library/hh456380.aspx

In questo caso si è scelto come ContentType “text/plain” (ma può anche essere “text/html”) e Category “general” (attualmente l’unica supportata).

Interessante l’utilizzo del metodo Speak per recuperare l’url del file wave contenente la pronuncia di un testo. Nel seguente metodo vediamo come utilizzarlo, questa volta scegliendo l’autenticazione “

 Public Function GetSpeakAudioUrl(text As String, targetLanguage As String) As String
 Dim speakUrl As String
 Try
 speakUrl = _MTService.Speak("MyApp", text, targetLanguage, "audio/wav", Nothing)
 Catch ex As Exception
 Throw
 End Try
 Return speakUrl
 End Function

Conclusioni

La piattaforma di traduzione automatica Microsoft fornisce interessanti funzionalità per tutti quegli scenari in cui una traduzione automatica, con tutte le limitazioni del caso, può essere utilizzata tranquillamente (news, blog, documentazione tecnica). I contenuti tradotti automaticamente possono, poi, essere arricchiti da contributors che possono migliorare il risultato. Il tutto in maniera molto semplice e soprattutto con un ventaglio di protocolli che la rendono fruibile anche da linguaggio non Microsoft.