From 939a22c3920805fc0092225d69e71471c7f1505f Mon Sep 17 00:00:00 2001 From: moonstar-x Date: Sat, 19 Mar 2022 23:38:40 -0500 Subject: [PATCH] Created MicrosoftProvider. --- src/app.js | 3 +- .../tts/providers/MicrosoftProvider.js | 83 +++++++++++++++++++ src/classes/tts/providers/ProviderManager.js | 3 +- 3 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 src/classes/tts/providers/MicrosoftProvider.js diff --git a/src/app.js b/src/app.js index d253889e..a19fd014 100644 --- a/src/app.js +++ b/src/app.js @@ -95,7 +95,8 @@ client.registry ['config', 'Configuration Commands'], ['google-tts', 'Google TTS Commands'], ['other-tts', 'Other TTS Commands'], - ['misc', 'Miscellaneous Commands'] + ['misc', 'Miscellaneous Commands'], + ['ms-tts', 'Microsoft TTS Commands'] ]) .registerCommandsIn(path.join(__dirname, './commands/main')); diff --git a/src/classes/tts/providers/MicrosoftProvider.js b/src/classes/tts/providers/MicrosoftProvider.js new file mode 100644 index 00000000..c28a27aa --- /dev/null +++ b/src/classes/tts/providers/MicrosoftProvider.js @@ -0,0 +1,83 @@ +const axios = require('axios'); +const AbstractProvider = require('./AbstractProvider'); +const Payload = require('../Payload'); +const languageData = require('../../../../provider-data/ttstool_microsoft_languages.json'); + +const POST_URL = 'https://support.readaloud.app/ttstool/createParts'; +const GET_URL = 'https://support.readaloud.app/ttstool/getParts'; + +/** + * A concrete TTS provider for TTS Tool Microsoft. + */ +class MicrosoftProvider extends AbstractProvider { + async createParts(sentence, extras) { + const { language, voice, volume, rate, pitch } = extras; + + const response = await axios.post(POST_URL, [{ + voiceId: voice, + ssml: `${sentence}` + }]); + + return response.data[0]; + } + + async createPayload(sentence, extras) { + const partId = await this.createParts(sentence, extras); + const url = `${GET_URL}?q=${partId}`; + + return new Payload(url, sentence, MicrosoftProvider.NAME, extras); + } + + getPlayLogMessage(payload, guild) { + const { sentence, extras: { language, voice, volume, rate, pitch } } = payload; + + return `(Microsoft): Saying ${sentence} with language ${language} - ${voice} with ${volume} volume, ${rate} rate and ${pitch} pitch in guild ${guild.name}.`; + } +} + +MicrosoftProvider.NAME = 'Microsoft'; +MicrosoftProvider.FRIENDLY_NAME = 'Microsoft (TTS Tool) Provider'; + +MicrosoftProvider.EXTRA_FIELDS = ['language', 'voice', 'volume', 'rate', 'pitch']; +MicrosoftProvider.EXTRA_DEFAULTS = { + language: 'en', + voice: 'Microsoft US English (David)', + volume: 'default', + rate: 'medium', + pitch: 'default' +}; + +MicrosoftProvider.getSupportedVolumeChoices = () => { + return [ + ['Default Volume', 'default'], + ['Silent', 'silent'], + ['Extra Soft', 'x-soft'], + ['Soft', 'soft'], + ['Medium', 'medium'], + ['Loud', 'loud'], + ['Extra Loud', 'x-loud'] + ]; +}; + +MicrosoftProvider.getSupportedRateChoices = () => { + return [ + ['Extra Slow', 'x-slow'], + ['Slow', 'slow'], + ['Medium', 'medium'], + ['Fast', 'fast'], + ['Extra Fast', 'x-fast'] + ]; +}; + +MicrosoftProvider.getSupportedPitchChoices = () => { + return [ + ['Default Pitch', 'default'], + ['Extra Low', 'x-low'], + ['Low', 'low'], + ['Medium', 'medium'], + ['High', 'high'], + ['Extra High', 'x-high'] + ]; +}; + +module.exports = MicrosoftProvider; diff --git a/src/classes/tts/providers/ProviderManager.js b/src/classes/tts/providers/ProviderManager.js index fb817a22..fd03b906 100644 --- a/src/classes/tts/providers/ProviderManager.js +++ b/src/classes/tts/providers/ProviderManager.js @@ -2,6 +2,7 @@ const { InvalidProviderError } = require('../../../errors'); const GoogleProvider = require('./GoogleProvider'); const AeiouProvider = require('./AeiouProvider'); const AmazonProvider = require('./AmazonProvider'); +const MicrosoftProvider = require('./MicrosoftProvider'); class ProviderManager { constructor(client) { @@ -22,7 +23,7 @@ class ProviderManager { } } -ProviderManager.SUPPORTED_PROVIDERS = [GoogleProvider, AeiouProvider, AmazonProvider]; +ProviderManager.SUPPORTED_PROVIDERS = [GoogleProvider, AeiouProvider, AmazonProvider, MicrosoftProvider]; ProviderManager.DEFAULT_PROVIDER = GoogleProvider; ProviderManager.PROVIDER_FRIENDLY_NAMES = ProviderManager.SUPPORTED_PROVIDERS.reduce((obj, Provider) => {