To call Azure Marketplace Translation (and Speech) service

Dependencies:   EthernetInterface-FRDM HTTPClient-SSL R_BSP SDFileSystem TLV320_RBSP USBHost mbed-rtos mbed-src

The program calls Azure Marketplace Translation (and Speech) service.

How to use - Create an account for Microsoft Azure Marketplace - Get client ID and client secret. - Change client ID and client secret in main.cpp

The program was created based on the following libraries.

CodePlex Text-To-Speech with Microsoft Translator Service http://translatorservice.codeplex.com/

MBED HTTPClient-SSL Library https://developer.mbed.org/teams/MultiTech/code/HTTPClient-SSL/

/media/uploads/ksekimoto/gr-peach_cloud_speech_01.jpg

Revision:
0:40a09c55e5be
diff -r 000000000000 -r 40a09c55e5be SpeechSynthesizer.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SpeechSynthesizer.cpp	Sat Nov 07 12:21:19 2015 +0000
@@ -0,0 +1,148 @@
+////////////////////////////////////////////////////////////////////////////
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+//  Copyright (c) Microsoft Corporation.  All rights reserved.
+//  Portions Copyright (c) Kentaro Sekimoto All rights reserved.
+//
+//  Based on Text-To-Speech for .NET Micro Framework with Microsoft 
+//  Translator Service
+//  https://code.msdn.microsoft.com/Text-To-Speech-for-NET-9cea4462
+//
+////////////////////////////////////////////////////////////////////////////
+
+#include "mbed.h"
+#include "SpeechSynthesizer.h"
+#include "AdmAuthentication.h"
+#include "HTTPClient.h"
+#include "HTTPFile.h"
+#include "USBHostMSD.h"
+#include "string.h"
+
+#define MAX_STREAM  (256*256*16)
+#define BASE_URL    "http://api.microsofttranslator.com/v2/Http.svc/"
+#define AUTHORIZATION_HEADER    "Authorization"
+#define AUDIOFORMAT     "audio/wav"
+#define AUDIOQUALITY    "MinSize"       // "MaxQuality"
+#define LANGUAGE    "en"
+//#define TEST_TOKEN  "Bearer http%3a%2f%2fschemas.xmlsoap.org%2fws%2f2005%2f05%2fidentity%2fclaims%2fnameidentifier=netmf_speech&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=1446517938&Issuer=https%3a%2f%2fdatamarket.accesscontrol.windows.net%2f&HMACSHA256=h%2bgxg4uaVMnlB8PYzFhCn9Q2KGPtE2%2bwZHuseh2nQxY%3d"
+
+static char url[1024];
+static char encoded_text[1024];
+static char encoded_format[32];
+static char encoded_language[32];
+static char buf[MAX_STREAM];
+static HTTPText inText(buf, MAX_STREAM);
+static char header[1024];
+static char encoded_from[256];
+static char encoded_to[256];
+static char translated[256];
+
+void urlencode(char *src, char *dst)
+{
+    int c;
+    char *hex = "0123456789ABCDEF";
+
+    while( (c = *src++) != 0 ){
+        if( ('a' <= c && c <= 'z')
+        || ('A' <= c && c <= 'Z')
+        || ('0' <= c && c <= '9') ){
+            *dst++ = c;
+        } else {
+            *dst++ = '%';
+            *dst++ = hex[c >> 4];
+            *dst++ = hex[c & 15];
+        }
+    }
+}
+
+void SpeechSynthesizer::UpdateToken()
+{
+    char *ptoken;
+    printf("UpdateToken...\r\n");
+    AdmAuthentication auth = AdmAuthentication(id, secret);
+    ptoken = auth.GetAccessToken();
+    sprintf(token, "Bearer %s", ptoken);
+}
+
+void SpeechSynthesizer::GetSpeakStream(char *filename, char *text, char *language)
+{
+    printf("GetSpeakStream...\r\n");
+    HTTPClient hc;
+    HTTPFile inFile(filename);
+    urlencode(text, encoded_text);
+    urlencode(audioFormat, encoded_format);
+    urlencode(language, encoded_language);
+    sprintf(url, "%sSpeak?text=%s&language=%s&format=%s&options=%s", 
+        BASE_URL, encoded_text, encoded_language, encoded_format, audioQuality);
+#ifdef DEBUG_SPEECH
+    printf("url:%s\r\n", url);
+#endif
+#ifndef TEST_TOKEN
+    sprintf(header, "%s: %s\r\n", AUTHORIZATION_HEADER, token);
+#else
+    sprintf(header, "%s: %s\r\n", AUTHORIZATION_HEADER, TEST_TOKEN);
+#endif
+#ifdef DEBUG_SPEECH
+    printf("header:%s\r\n", header);
+#endif
+    hc.setHeader(header);
+    hc.get((const char*)url, &inFile, 10000);
+    inFile.close();
+}
+
+char *SpeechSynthesizer::Translate(char *from, char *to)
+{
+    printf("Translate...\r\n");
+    HTTPClient hc;
+    urlencode(from, encoded_from);
+    urlencode(to, encoded_to);
+    sprintf(url, "%sTranslate?text=%s&to=%s&contentType=text/plain", 
+        BASE_URL, encoded_from, encoded_to);
+#ifdef DEBUG_SPEECH
+    printf("url:%s\r\n", url);
+#endif
+#ifndef TEST_TOKEN
+    sprintf(header, "%s: %s\r\n", AUTHORIZATION_HEADER, token);
+#else
+    sprintf(header, "%s: %s\r\n", AUTHORIZATION_HEADER, TEST_TOKEN);
+#endif
+    hc.setHeader(header);
+    hc.get((const char*)url, &inText, 10000);
+    char *pTokenStart = strstr(buf, ">");
+    if (pTokenStart == NULL) {
+        return (char *)NULL;
+    }
+    pTokenStart += 1;
+    char *pTokenEnd = strstr(pTokenStart, "<");
+    if (pTokenEnd == NULL) {
+        return (char *)NULL;
+    }
+    strncpy(translated, pTokenStart, (pTokenEnd - pTokenStart));
+    translated[pTokenEnd - pTokenStart] = 0;
+    printf("%s -> %s\r\n", from, translated);
+    return (char *)translated;
+}
+    
+SpeechSynthesizer::SpeechSynthesizer(const char *clientID, const char *clientSecret)
+{
+    id = (char *)clientID;
+    secret = (char *)clientSecret; 
+    language = (char *)LANGUAGE;
+    audioFormat = (char *)AUDIOFORMAT;
+    audioQuality = (char *)AUDIOQUALITY;
+}
+
+SpeechSynthesizer::~SpeechSynthesizer()
+{
+}
+