Google Translate API aanroepen vanuit SQL of Power BI

Met de Google Translate API kunnen eenvoudig grote hoeveelheden tekst vertaald worden tussen vrijwel alle talen. Aan het gebruik van de Google Translate API zijn geen kosten verbonden voor de eerste 500.000 karakters per maand. Daarna kost het USD 20 per miljoen tekens (zie Pricing  |  Cloud Translation  |  Google Cloud).

Een vergelijkbaar geprijsd alternatief die bijzonder sterk is in Europese talen is DeepL. Ook DeepL kan vanuit Invantive SQL benaderd worden zoals beschreven in DeepL API aanroepen vanuit SQL of Power BI.

In dit artikel wordt uitgelegd hoe via Invantive SQL en afgeleide platformen zoals Azure Data Factory en Power BI het gebruik van de Google Translate API voor het automatisch vertalen mogelijk is. De gepresenteerde SQL statements werken met enige beperkingen ook met de gratis versies van SQL in het Invantive Query Tool.

De beschreven aanpak kan gebruikt worden om buiten de ruim 70 ondersteunde platformen relatief eenvoudige API’s aan te roepen als bron voor datareplicatie of verwerkingsprocessen.

Mogelijkheden Google Translate

De Google Translate API is een eenvoudige reeks van API’s om gegevens uit te wisselen met Google Translate. Denk hierbij aan:

  • vertalen,
  • taal bepalen van een tekst,
  • talen opvragen.

De API’s zijn allen gelijkend qua structuur en mogelijkheden.

Voorbereidingen Google Translate API

Voor gebruik van de Google Translate API is een API-sleutel nodig. Die is online te verkrijgen binnen enkele minuten door de stappen te volgen op Setup  |  Cloud Translation  |  Google Cloud.

Voor grote volumes kan het nodig zijn om de API-dagquota te verhogen (zie 配额和限制  |  Cloud Translation  |  Google Cloud).

Google Translate translate API

De API “translate” biedt de mogelijkheid om een of meerdere teksten te vertalen naar een andere taal. De invoer wordt aangeboden via POST zoals:

key=secret&source=en&target=de&q=how+to+write+a+text%3F

Door het voorgaand bericht op te sturen samen met content-type application/x-www-form-urlencoded komt een resultaat terug zoals:

{
  "data": {
    "translations": [
      {
        "translatedText": "Wie schreibe ich einen Text?"
      }
    ]
  }
}

Het resultaat bevat de Duitse vertaling. Voor andere doeltalen is een aparte API-aanroep nodig.

SQL Google Translate API Aanroep

Vanuit Invantive SQL kan de Google Translate API aangeroepen worden met httpdownload@DataDictionary. Het content type wordt als header doorgegeven en de rest als payload als volgt via een POST; het resultaat wordt met jsontable omgezet naar een tabelvorm:

select jte.*
from   httpdownload@datadictionary
       ( url => 'https://translation.googleapis.com/language/translate/v2'
       , acceptMimeType => 'application/json'
       , contentType => 'application/x-www-form-urlencoded'
       , method => 'POST'
       , diskCache => true
       , diskCacheMaxAgeSec => 86400*2
       , cacheKey => 'en' || '.' || 'de' || md5('how to write a text using the =-sign?')
       , textPayload 
         => 
         'key=secret'
         || '&source=' || 'en'
         || '&target=' || 'de'
         || '&format=text'
         || '&q=' || 'how to write a text using the =-sign?'
       ) htp
join   jsontable
       ( 'data.translations[*]'
         passing htp.contents_char
         columns text                     varchar2 null path 'translatedText'
       ) jte

Het resultaat ziet er dan ongeveer zo uit:

In- en uitvoer met Tabellen

Soms is het wenselijk om een lijst van te vertalen teksten te verwerken en die weg te schrijven naar een tabel. Dergelijke output kan ook verwerkt worden door bijvoorbeeld Power Query of bijvoorbeeld door in Invantive Control for Excel een Excel tabel (TABELNAAM@InvantiveControl) uit te lezen en de gevalideerde resultaten in een blok weer te retourneren in Excel.

Een voorbeeld hiervan is de volgende query die een lijst van teksten maakt, vertaalt en wegschrijft in naar een in-memory tabel output:

create or replace table input@inmemorystorage
as
select 'en' source_lang
,      'de' lge_code
,      'This is text number ' || to_char(rge.value) source_text
from   range(100)@datadictionary rge

create or replace table output@inmemorystorage
as
select inp.source_text
,      jte.*
from   input@inmemorystorage inp
join    httpdownload@datadictionary
       ( url => 'https://translation.googleapis.com/language/translate/v2'
       , acceptMimeType => 'application/json'
       , contentType => 'application/x-www-form-urlencoded'
       , method => 'POST'
       , diskCache => true
       , diskCacheMaxAgeSec => 86400*2
       , cacheKey => inp.source_lang || '.' || inp.lge_code || md5(inp.source_text)
       , textPayload 
         => 
         'key=secrt'
         || '&source=' || inp.source_lang
         || '&target=' || inp.lge_code
         || '&format=text'
         || '&q=' || urlencode(inp.source_text)
       ) htp
join   jsontable
       ( 'data.translations[*]'
         passing htp.contents_char
         columns text                     varchar2 null path 'translatedText'
       ) jte

select *
from   output@inmemorystorage

Het verwerken duurt circa 250 ms per vertaling. Het resultaat ziet er als volgt uit:

image