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/
SpeechSynthesizer.cpp
- Committer:
- ksekimoto
- Date:
- 2015-11-07
- Revision:
- 1:a2bd45c3b373
- Parent:
- 0:40a09c55e5be
File content as of revision 1:a2bd45c3b373:
//////////////////////////////////////////////////////////////////////////// // 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() { }