UNPKG

bing-translate-result

Version:

A simple translate API for Bing Translator. Exports translate, audio and detect. ## Install ``` npm i bing-translate-result ``` ## Usage Translate: ```javascript import bing from 'bing-translate-result';

347 lines (346 loc) 12.9 kB
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; import { fetchData, getError } from './utils'; import { detect } from './detect'; import { LANGUAGE_NOT_SOPPORTED, RESULT_ERROR } from './error-codes'; import { getTokenAndKey } from './getTokenAndKey'; export var audio = function (_a) { var text = _a.text, _b = _a.from, from = _b === void 0 ? '' : _b, _c = _a.com, com = _c === void 0 ? true : _c; return __awaiter(void 0, void 0, void 0, function () { var _d, _e, region, token, url, _f, lang, gender, name, rawXML, res, data_1, dataURL, err_1; return __generator(this, function (_g) { switch (_g.label) { case 0: _d = from; if (_d) return [3 /*break*/, 2]; return [4 /*yield*/, detect({ text: text, com: com })]; case 1: _d = (_g.sent()); _g.label = 2; case 2: from = _d; return [4 /*yield*/, getAuthorization(com)]; case 3: _e = _g.sent(), region = _e.region, token = _e.token; url = "https://" + region + ".tts.speech.microsoft.com/cognitiveservices/v1"; _f = getXMLParams(from), lang = _f.lang, gender = _f.gender, name = _f.name; if (!lang) { throw getError(LANGUAGE_NOT_SOPPORTED); } rawXML = "\n <speak version='1.0' xml:lang='" + lang + "'>\n <voice xml:lang='" + lang + "' xml:gender='" + gender + "' name='" + name + "'>\n <prosody rate='-20.00%'>\n " + text + "\n </prosody>\n </voice>\n </speak>\n "; return [4 /*yield*/, fetchData(url, { method: 'POST', headers: { 'X-MICROSOFT-OutputFormat': 'audio-16khz-32kbitrate-mono-mp3', 'Authorization': "Bearer " + token }, body: rawXML })]; case 4: res = _g.sent(); _g.label = 5; case 5: _g.trys.push([5, 8, , 9]); return [4 /*yield*/, res.blob()]; case 6: data_1 = _g.sent(); return [4 /*yield*/, new Promise(function (resolve) { var reader = new FileReader(); reader.onload = function () { resolve(reader.result); }; reader.readAsDataURL(data_1); })]; case 7: dataURL = _g.sent(); return [2 /*return*/, dataURL]; case 8: err_1 = _g.sent(); throw getError(RESULT_ERROR); case 9: return [2 /*return*/]; } }); }); }; var authorization = { expiry: 0, region: '', token: '' }; var getAuthorization = function (com) { return __awaiter(void 0, void 0, void 0, function () { var timestamp, _a, token, key, IG, IID, url, searchParams, res, data, err_2; return __generator(this, function (_b) { switch (_b.label) { case 0: timestamp = Number(new Date()); if (timestamp < authorization.expiry) { return [2 /*return*/, authorization]; } return [4 /*yield*/, getTokenAndKey(com)]; case 1: _a = _b.sent(), token = _a.token, key = _a.key, IG = _a.IG, IID = _a.IID; url = "https://" + (com ? 'www' : 'cn') + ".bing.com/tfetspktok?isVertical=1&IG=" + IG + "&IID=" + IID; searchParams = new URLSearchParams(); searchParams.append('token', token); searchParams.append('key', key.toString()); return [4 /*yield*/, fetchData(url, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: searchParams.toString() })]; case 2: res = _b.sent(); _b.label = 3; case 3: _b.trys.push([3, 5, , 6]); return [4 /*yield*/, res.json()]; case 4: data = _b.sent(); authorization = { expiry: timestamp + Number(data.expiryDurationInMS), region: data.region, token: data.token }; return [2 /*return*/, authorization]; case 5: err_2 = _b.sent(); throw getError(RESULT_ERROR); case 6: return [2 /*return*/]; } }); }); }; var getXMLParams = function (langCode) { var t = '', i = '', r = ''; switch (langCode) { case "ar": t = "ar-SA"; i = "Male"; r = "ar-SA-HamedNeural"; break; case "bg": t = "bg-BG"; i = "Male"; r = "bg-BG-BorislavNeural"; break; case "ca": t = "ca-ES"; i = "Female"; r = "ca-ES-JoanaNeural"; break; case "cs": t = "cs-CZ"; i = "Male"; r = "cs-CZ-AntoninNeural"; break; case "da": t = "da-DK"; i = "Female"; r = "da-DK-ChristelNeural"; break; case "de": t = "de-DE"; i = "Female"; r = "de-DE-KatjaNeural"; break; case "el": t = "el-GR"; i = "Male"; r = "el-GR-NestorasNeural"; break; case "en": t = "en-US"; i = "Female"; r = "en-US-AriaNeural"; break; case "es": t = "es-ES"; i = "Female"; r = "es-ES-ElviraNeural"; break; case "fi": t = "fi-FI"; i = "Female"; r = "fi-FI-NooraNeural"; break; case "fr": t = "fr-FR"; i = "Female"; r = "fr-FR-DeniseNeural"; break; case "fr-CA": t = "fr-CA"; i = "Female"; r = "fr-CA-SylvieNeural"; break; case "he": t = "he-IL"; i = "Male"; r = "he-IL-AvriNeural"; break; case "hi": t = "hi-IN"; i = "Female"; r = "hi-IN-SwaraNeural"; break; case "hr": t = "hr-HR"; i = "Male"; r = "hr-HR-SreckoNeural"; break; case "hu": t = "hu-HU"; i = "Male"; r = "hu-HU-TamasNeural"; break; case "id": t = "id-ID"; i = "Male"; r = "id-ID-ArdiNeural"; break; case "it": t = "it-IT"; i = "Male"; r = "it-IT-DiegoNeural"; break; case "ja": t = "ja-JP"; i = "Female"; r = "ja-JP-NanamiNeural"; break; case "ko": t = "ko-KR"; i = "Female"; r = "ko-KR-SunHiNeural"; break; case "ms": t = "ms-MY"; i = "Male"; r = "ms-MY-OsmanNeural"; break; case "nl": t = "nl-NL"; i = "Female"; r = "nl-NL-ColetteNeural"; break; case "nb": t = "nb-NO"; i = "Female"; r = "nb-NO-PernilleNeural"; break; case "pl": t = "pl-PL"; i = "Female"; r = "pl-PL-ZofiaNeural"; break; case "pt": t = "pt-BR"; i = "Female"; r = "pt-BR-FranciscaNeural"; break; case "pt-PT": t = "pt-PT"; i = "Female"; r = "pt-PT-FernandaNeural"; break; case "ro": t = "ro-RO"; i = "Male"; r = "ro-RO-EmilNeural"; break; case "ru": t = "ru-RU"; i = "Female"; r = "ru-RU-DariyaNeural"; break; case "sk": t = "sk-SK"; i = "Male"; r = "sk-SK-LukasNeural"; break; case "sl": t = "sl-SI"; i = "Male"; r = "sl-SI-RokNeural"; break; case "sv": t = "sv-SE"; i = "Female"; r = "sv-SE-SofieNeural"; break; case "ta": t = "ta-IN"; i = "Female"; r = "ta-IN-PallaviNeural"; break; case "te": t = "te-IN"; i = "Male"; r = "te-IN-ShrutiNeural"; break; case "th": t = "th-TH"; i = "Male"; r = "th-TH-NiwatNeural"; break; case "tr": t = "tr-TR"; i = "Female"; r = "tr-TR-EmelNeural"; break; case "vi": t = "vi-VN"; i = "Male"; r = "vi-VN-NamMinhNeural"; break; case "zh-Hans": t = "zh-CN"; i = "Female"; r = "zh-CN-XiaoxiaoNeural"; break; case "zh-Hant": t = "zh-CN"; i = "Female"; r = "zh-CN-XiaoxiaoNeural"; break; case "yue": t = "zh-HK"; i = "Female"; r = "zh-HK-HiuGaaiNeural"; break; default: break; } ; return { lang: t, gender: i, name: r }; };