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/
dec_wav.h
- Committer:
- ksekimoto
- Date:
- 2015-11-07
- Revision:
- 1:a2bd45c3b373
- Parent:
- 0:40a09c55e5be
File content as of revision 1:a2bd45c3b373:
/**************************************************************************//**
* @file dec_wav.h
* @brief wav
******************************************************************************/
#include "mbed.h"
/** A class to communicate a dec_wav
*
*/
class dec_wav {
public:
/** analyze header
*
* @param p_title title tag buffer
* @param p_artist artist tag buffer
* @param p_album album tag buffer
* @param tag_size tag buffer size
* @param fp file pointer
* @return true = success, false = failure
*/
bool AnalyzeHeder(uint8_t * p_title, uint8_t * p_artist, uint8_t * p_album, uint16_t tag_size, FILE * fp) {
bool result = false;
size_t read_size;
uint8_t wk_read_buff[36];
uint8_t *data;
uint32_t chunk_size;
uint32_t sub_chunk_size;
uint32_t list_index_max;
bool list_ok = false;
uint32_t read_index = 0;
uint32_t data_index = 0;
uint16_t wk_len;
if (fp == NULL) {
return false;
}
music_data_size = 0;
music_data_index = 0;
wav_fp = fp;
if (p_title != NULL) {
p_title[0] = '\0';
}
if (p_artist != NULL) {
p_artist[0] = '\0';
}
if (p_album != NULL) {
p_album[0] = '\0';
}
read_size = fread(&wk_read_buff[0], sizeof(char), 36, wav_fp);
if (read_size < 36) {
// do nothing
} else if (memcmp(&wk_read_buff[0], "RIFF", 4) != 0) {
// do nothing
} else if (memcmp(&wk_read_buff[8], "WAVE", 4) != 0) {
// do nothing
} else if (memcmp(&wk_read_buff[12], "fmt ", 4) != 0) {
// do nothing
} else {
read_index += 36;
channel = ((uint32_t)wk_read_buff[22] << 0) + ((uint32_t)wk_read_buff[23] << 8);
sampling_rate = ((uint32_t)wk_read_buff[24] << 0)
+ ((uint32_t)wk_read_buff[25] << 8)
+ ((uint32_t)wk_read_buff[26] << 16)
+ ((uint32_t)wk_read_buff[27] << 24);
block_size = ((uint32_t)wk_read_buff[34] << 0) + ((uint32_t)wk_read_buff[35] << 8);
while (1) {
//printf("dev_wav1\r\n");
read_size = fread(&wk_read_buff[0], sizeof(char), 8, wav_fp);
read_index += 8;
if (read_size < 8) {
break;
} else {
chunk_size = ((uint32_t)wk_read_buff[4] << 0)
+ ((uint32_t)wk_read_buff[5] << 8)
+ ((uint32_t)wk_read_buff[6] << 16)
+ ((uint32_t)wk_read_buff[7] << 24);
if (memcmp(&wk_read_buff[0], "data", 4) == 0) {
result = true;
music_data_size = chunk_size;
if (list_ok == true) {
break;
} else {
data_index = read_index;
fseek(wav_fp, chunk_size, SEEK_CUR);
read_index += chunk_size;
}
//printf("dev_wav2\r\n");
} else if (memcmp(&wk_read_buff[2], "data", 4) == 0) {
read_index += 2;
chunk_size = ((uint32_t)wk_read_buff[6] << 0)
+ ((uint32_t)wk_read_buff[7] << 8);
result = true;
music_data_size = chunk_size;
if (list_ok == true) {
break;
} else {
data_index = read_index;
fseek(wav_fp, chunk_size, SEEK_CUR);
read_index += chunk_size;
}
} else if (memcmp(&wk_read_buff[0], "LIST", 4) == 0) {
list_ok = true;
list_index_max = read_index + chunk_size;
read_size = fread(&wk_read_buff[0], sizeof(char), 4, wav_fp);
read_index += 4;
while (read_index < list_index_max) {
read_size = fread(&wk_read_buff[0], sizeof(char), 8, wav_fp);
read_index += 8;
if (read_size < 8) {
break;
} else if (memcmp(&wk_read_buff[0], "INAM", 4) == 0) {
data = p_title;
} else if (memcmp(&wk_read_buff[0], "IART", 4) == 0) {
data = p_artist;
} else if (memcmp(&wk_read_buff[0], "IPRD", 4) == 0) {
data = p_album;
} else {
data = NULL;
}
if ((data != NULL) && (tag_size != 0)) {
sub_chunk_size = ((uint32_t)wk_read_buff[4] << 0)
+ ((uint32_t)wk_read_buff[5] << 8)
+ ((uint32_t)wk_read_buff[6] << 16)
+ ((uint32_t)wk_read_buff[7] << 24);
if (sub_chunk_size > (tag_size - 1)) {
wk_len = (tag_size - 1);
} else {
wk_len = sub_chunk_size;
}
read_size = fread(data, sizeof(char), wk_len, wav_fp);
read_index += sub_chunk_size;
fseek(wav_fp, read_index, SEEK_SET);
data[wk_len] = '\0';
}
}
if (data_index != 0) {
break;
} else {
fseek(wav_fp, list_index_max, SEEK_SET);
}
//printf("dev_wav3\r\n");
} else {
fseek(wav_fp, chunk_size, SEEK_CUR);
read_index += chunk_size;
//printf("dev_wav4\r\n");
}
}
}
if (data_index != 0) {
fseek(wav_fp, data_index, SEEK_SET);
//printf("dev_wav5\r\n");
}
}
return result;
};
/** get next data
*
* @param buf data buffer address
* @param len data buffer length
* @return get data size
*/
size_t GetNextData(void *buf, size_t len) {
if (block_size == 24) {
// Add padding
int write_index = 0;
int wavfile_index;
int read_len;
int pading_index = 0;
uint8_t * p_buf = (uint8_t *)buf;
size_t ret;
if ((music_data_index + len) > music_data_size) {
len = music_data_size - music_data_index;
}
while (write_index < len) {
read_len = (len - write_index) * 3 / 4;
if (read_len > sizeof(wk_wavfile_buff)) {
read_len = sizeof(wk_wavfile_buff);
}
music_data_index += read_len;
ret = fread(wk_wavfile_buff, sizeof(char), read_len, wav_fp);
if (ret < read_len) {
break;
}
wavfile_index = 0;
while ((write_index < len) && (wavfile_index < read_len)) {
if (pading_index == 0) {
p_buf[write_index] = 0;
} else {
p_buf[write_index] = wk_wavfile_buff[wavfile_index];
wavfile_index++;
}
if (pading_index < 3) {
pading_index++;
} else {
pading_index = 0;
}
write_index++;
}
}
return write_index;
} else {
if ((music_data_index + len) > music_data_size) {
len = music_data_size - music_data_index;
}
music_data_index += len;
return fread(buf, sizeof(char), len, wav_fp);
}
};
/** get channel
*
* @return channel
*/
uint16_t GetChannel() {
return channel;
};
/** get block size
*
* @return block size
*/
uint16_t GetBlockSize() {
return block_size;
};
/** get sampling rate
*
* @return sampling rate
*/
uint32_t GetSamplingRate() {
return sampling_rate;
};
private:
#define FILE_READ_BUFF_SIZE (3072)
FILE * wav_fp;
uint32_t music_data_size;
uint32_t music_data_index;
uint16_t channel;
uint16_t block_size;
uint32_t sampling_rate;
uint8_t wk_wavfile_buff[FILE_READ_BUFF_SIZE];
};