echogarden 0.12.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -14
- package/data/schemas/options.json +398 -111
- package/dist/alignment/DTWMfccSequenceAlignment.d.ts +1 -1
- package/dist/alignment/DTWMfccSequenceAlignment.js +8 -8
- package/dist/alignment/DTWSequenceAlignment.d.ts +1 -1
- package/dist/alignment/DTWSequenceAlignment.js +1 -1
- package/dist/alignment/DTWSequenceAlignmentWindowed.d.ts +1 -1
- package/dist/alignment/DTWSequenceAlignmentWindowed.js +2 -2
- package/dist/alignment/LevenshteinSequenceAlignment.d.ts +1 -1
- package/dist/alignment/LevenshteinSequenceAlignment.js +1 -1
- package/dist/alignment/SpeechAlignment.d.ts +9 -10
- package/dist/alignment/SpeechAlignment.js +136 -105
- package/dist/alignment/SpeechAlignment.js.map +1 -1
- package/dist/api/API.d.ts +13 -12
- package/dist/api/API.js +14 -13
- package/dist/api/API.js.map +1 -1
- package/dist/api/APIOptions.d.ts +5 -4
- package/dist/api/Alignment.d.ts +15 -9
- package/dist/api/Alignment.js +88 -74
- package/dist/api/Alignment.js.map +1 -1
- package/dist/api/Common.js +1 -1
- package/dist/api/Denoising.d.ts +6 -6
- package/dist/api/Denoising.js +23 -23
- package/dist/api/Denoising.js.map +1 -1
- package/dist/api/LanguageDetection.d.ts +19 -12
- package/dist/api/LanguageDetection.js +88 -38
- package/dist/api/LanguageDetection.js.map +1 -1
- package/dist/api/Recognition.d.ts +16 -6
- package/dist/api/Recognition.js +129 -55
- package/dist/api/Recognition.js.map +1 -1
- package/dist/api/SourceSeparation.d.ts +17 -0
- package/dist/api/SourceSeparation.js +61 -0
- package/dist/api/SourceSeparation.js.map +1 -0
- package/dist/api/Synthesis.d.ts +18 -18
- package/dist/api/Synthesis.js +191 -164
- package/dist/api/Synthesis.js.map +1 -1
- package/dist/api/Translation.d.ts +19 -8
- package/dist/api/Translation.js +132 -35
- package/dist/api/Translation.js.map +1 -1
- package/dist/api/Vad.d.ts +10 -5
- package/dist/api/Vad.js +76 -38
- package/dist/api/Vad.js.map +1 -1
- package/dist/audio/AudioBufferConversion.d.ts +1 -1
- package/dist/audio/AudioBufferConversion.js +4 -4
- package/dist/audio/AudioPlayer.d.ts +1 -1
- package/dist/audio/AudioPlayer.js +26 -26
- package/dist/audio/AudioPlayer.js.map +1 -1
- package/dist/audio/AudioRecorder.d.ts +1 -1
- package/dist/audio/AudioRecorder.js +5 -5
- package/dist/audio/AudioUtilities.d.ts +13 -9
- package/dist/audio/AudioUtilities.js +86 -24
- package/dist/audio/AudioUtilities.js.map +1 -1
- package/dist/cli/CLI.d.ts +3 -3
- package/dist/cli/CLI.js +271 -162
- package/dist/cli/CLI.js.map +1 -1
- package/dist/cli/CLIConfigFile.js +8 -8
- package/dist/cli/CLILauncher.js +6 -6
- package/dist/cli/CLIOptionsSchema.js +2 -2
- package/dist/cli/CLIParser.js +5 -5
- package/dist/cli/CLIStarter.js +4 -4
- package/dist/codecs/FFMpegTranscoder.d.ts +2 -2
- package/dist/codecs/FFMpegTranscoder.js +37 -37
- package/dist/codecs/FFMpegTranscoder.js.map +1 -1
- package/dist/codecs/TIMITCodec.js +5 -5
- package/dist/codecs/WaveCodec.d.ts +1 -1
- package/dist/codecs/WaveCodec.js +22 -22
- package/dist/denoising/RNNoise.d.ts +1 -1
- package/dist/denoising/RNNoise.js +9 -9
- package/dist/dsp/BiquadFilter.d.ts +3 -2
- package/dist/dsp/BiquadFilter.js +18 -11
- package/dist/dsp/BiquadFilter.js.map +1 -1
- package/dist/dsp/DecayingPeakEstimator.d.ts +16 -0
- package/dist/dsp/DecayingPeakEstimator.js +23 -0
- package/dist/dsp/DecayingPeakEstimator.js.map +1 -0
- package/dist/dsp/FFT.d.ts +8 -4
- package/dist/dsp/FFT.js +76 -30
- package/dist/dsp/FFT.js.map +1 -1
- package/dist/dsp/KWeightingFilter.d.ts +9 -0
- package/dist/dsp/KWeightingFilter.js +40 -0
- package/dist/dsp/KWeightingFilter.js.map +1 -0
- package/dist/dsp/LoudnessEstimator.d.ts +21 -0
- package/dist/dsp/LoudnessEstimator.js +47 -0
- package/dist/dsp/LoudnessEstimator.js.map +1 -0
- package/dist/dsp/MFCC.d.ts +2 -2
- package/dist/dsp/MFCC.js +15 -15
- package/dist/dsp/MelSpectogram.d.ts +1 -1
- package/dist/dsp/MelSpectogram.js +6 -6
- package/dist/dsp/Rubberband.d.ts +11 -11
- package/dist/dsp/Rubberband.js +27 -27
- package/dist/dsp/Sonic.d.ts +1 -1
- package/dist/dsp/Sonic.js +3 -3
- package/dist/dsp/SpeexResampler.d.ts +1 -1
- package/dist/dsp/SpeexResampler.js +2 -2
- package/dist/math/VectorMath.d.ts +12 -8
- package/dist/math/VectorMath.js +35 -32
- package/dist/math/VectorMath.js.map +1 -1
- package/dist/nlp/ChineseSegmentation.js +2 -2
- package/dist/nlp/CompromiseNLP.js +3 -3
- package/dist/nlp/EspeakPhonemizer.js +30 -30
- package/dist/nlp/IPA.js +20 -20
- package/dist/nlp/JapaneseSegmentation.js +6 -6
- package/dist/nlp/Lexicon.d.ts +1 -1
- package/dist/nlp/Lexicon.js +7 -7
- package/dist/nlp/Segmentation.d.ts +3 -0
- package/dist/nlp/Segmentation.js +21 -14
- package/dist/nlp/Segmentation.js.map +1 -1
- package/dist/nlp/TextNormalizer.js +16 -16
- package/dist/recognition/AmazonTranscribeSTT.d.ts +2 -2
- package/dist/recognition/AmazonTranscribeSTT.js +13 -14
- package/dist/recognition/AmazonTranscribeSTT.js.map +1 -1
- package/dist/recognition/AzureCognitiveServicesSTT.js +5 -6
- package/dist/recognition/AzureCognitiveServicesSTT.js.map +1 -1
- package/dist/recognition/GoogleCloudSTT.d.ts +3 -3
- package/dist/recognition/GoogleCloudSTT.js +18 -18
- package/dist/recognition/OpenAICloudSTT.d.ts +19 -0
- package/dist/recognition/OpenAICloudSTT.js +81 -0
- package/dist/recognition/OpenAICloudSTT.js.map +1 -0
- package/dist/recognition/SileroSTT.d.ts +2 -2
- package/dist/recognition/SileroSTT.js +25 -25
- package/dist/recognition/VoskSTT.d.ts +2 -2
- package/dist/recognition/VoskSTT.js +8 -8
- package/dist/recognition/WhisperCppSTT.d.ts +88 -0
- package/dist/recognition/WhisperCppSTT.js +332 -0
- package/dist/recognition/WhisperCppSTT.js.map +1 -0
- package/dist/recognition/WhisperSTT.d.ts +49 -25
- package/dist/recognition/WhisperSTT.js +626 -481
- package/dist/recognition/WhisperSTT.js.map +1 -1
- package/dist/server/Client.d.ts +1 -1
- package/dist/server/Client.js +22 -22
- package/dist/server/Server.js +9 -9
- package/dist/server/Server.js.map +1 -1
- package/dist/server/Worker.d.ts +22 -22
- package/dist/server/Worker.js +36 -36
- package/dist/server/Worker.js.map +1 -1
- package/dist/server/WorkerStarter.js +2 -2
- package/dist/source-separation/MDXNetSourceSeparation.d.ts +11 -0
- package/dist/source-separation/MDXNetSourceSeparation.js +161 -0
- package/dist/source-separation/MDXNetSourceSeparation.js.map +1 -0
- package/dist/speech-language-detection/SileroLanguageDetection.d.ts +1 -1
- package/dist/speech-language-detection/SileroLanguageDetection.js +7 -7
- package/dist/subtitles/Subtitles.d.ts +10 -0
- package/dist/subtitles/Subtitles.js +2 -2
- package/dist/subtitles/Subtitles.js.map +1 -1
- package/dist/synthesis/AwsPollyTTS.d.ts +1 -1
- package/dist/synthesis/AwsPollyTTS.js +12 -12
- package/dist/synthesis/AzureCognitiveServicesTTS.js +7 -7
- package/dist/synthesis/CoquiServerTTS.js +10 -10
- package/dist/synthesis/CoquiServerTTS.js.map +1 -1
- package/dist/synthesis/ElevenlabsTTS.d.ts +23 -0
- package/dist/synthesis/ElevenlabsTTS.js +103 -0
- package/dist/synthesis/ElevenlabsTTS.js.map +1 -0
- package/dist/synthesis/EspeakTTS.d.ts +6 -5
- package/dist/synthesis/EspeakTTS.js +81 -69
- package/dist/synthesis/EspeakTTS.js.map +1 -1
- package/dist/synthesis/FliteTTS.d.ts +3 -3
- package/dist/synthesis/FliteTTS.js +154 -154
- package/dist/synthesis/FliteTTS.js.map +1 -1
- package/dist/synthesis/GoogleCloudTTS.d.ts +3 -3
- package/dist/synthesis/GoogleCloudTTS.js +17 -17
- package/dist/synthesis/GoogleCloudTTS.js.map +1 -1
- package/dist/synthesis/GoogleTranslateTTS.d.ts +1 -1
- package/dist/synthesis/GoogleTranslateTTS.js +103 -103
- package/dist/synthesis/MicrosoftEdgeTTS.d.ts +2 -2
- package/dist/synthesis/MicrosoftEdgeTTS.js +74 -74
- package/dist/synthesis/OpenAICloudTTS.d.ts +13 -0
- package/dist/synthesis/OpenAICloudTTS.js +169 -0
- package/dist/synthesis/OpenAICloudTTS.js.map +1 -0
- package/dist/synthesis/SamTTS.js +3 -3
- package/dist/synthesis/SapiTTS.d.ts +3 -3
- package/dist/synthesis/SapiTTS.js +26 -26
- package/dist/synthesis/StreamlabsPollyTTS.d.ts +2 -2
- package/dist/synthesis/StreamlabsPollyTTS.js +27 -27
- package/dist/synthesis/SvoxPicoTTS.d.ts +2 -2
- package/dist/synthesis/SvoxPicoTTS.js +65 -65
- package/dist/synthesis/SvoxPicoTTS.js.map +1 -1
- package/dist/synthesis/VitsTTS.d.ts +3 -3
- package/dist/synthesis/VitsTTS.js +378 -378
- package/dist/synthesis/VitsTTS.js.map +1 -1
- package/dist/tests/Test.js +2 -2
- package/dist/utilities/Compression.d.ts +5 -0
- package/dist/utilities/Compression.js +29 -13
- package/dist/utilities/Compression.js.map +1 -1
- package/dist/utilities/FileDownloader.d.ts +1 -1
- package/dist/utilities/FileDownloader.js +16 -16
- package/dist/utilities/FileSystem.js +7 -7
- package/dist/utilities/Locale.d.ts +7 -7
- package/dist/utilities/Locale.js +15 -15
- package/dist/utilities/Logger.js +3 -3
- package/dist/utilities/ObjectUtilities.js +19 -19
- package/dist/utilities/OpenPromise.js +2 -2
- package/dist/utilities/OpenPromise.js.map +1 -1
- package/dist/utilities/PackageManager.js +31 -0
- package/dist/utilities/PackageManager.js.map +1 -1
- package/dist/utilities/PathUtilities.js +8 -8
- package/dist/utilities/RandomGenerator.js +2 -2
- package/dist/utilities/SmoothEstimator.d.ts +8 -0
- package/dist/utilities/SmoothEstimator.js +25 -0
- package/dist/utilities/SmoothEstimator.js.map +1 -0
- package/dist/utilities/TarballMaker.js +8 -8
- package/dist/utilities/Timeline.d.ts +3 -2
- package/dist/utilities/Timeline.js +11 -11
- package/dist/utilities/Timeline.js.map +1 -1
- package/dist/utilities/Timer.js +4 -4
- package/dist/utilities/Utilities.d.ts +4 -0
- package/dist/utilities/Utilities.js +38 -15
- package/dist/utilities/Utilities.js.map +1 -1
- package/dist/utilities/WasmMemoryManager.js +7 -7
- package/dist/utilities/WebReader.js +23 -23
- package/dist/utilities/WikipediaReader.js +2 -2
- package/dist/voice-activity-detection/AdaptiveGateVAD.d.ts +28 -0
- package/dist/voice-activity-detection/AdaptiveGateVAD.js +138 -0
- package/dist/voice-activity-detection/AdaptiveGateVAD.js.map +1 -0
- package/dist/voice-activity-detection/SileroVAD.d.ts +1 -1
- package/dist/voice-activity-detection/SileroVAD.js +5 -5
- package/dist/voice-activity-detection/SileroVAD.js.map +1 -1
- package/dist/voice-activity-detection/WebRtcVAD.d.ts +1 -1
- package/dist/voice-activity-detection/WebRtcVAD.js +4 -4
- package/docs/API.md +29 -11
- package/docs/CLI.md +31 -7
- package/docs/Contributing.md +38 -0
- package/docs/Development.md +93 -19
- package/docs/Engines.md +28 -16
- package/docs/Licenses.md +4 -1
- package/docs/Options.md +158 -78
- package/docs/Releases.md +262 -0
- package/docs/Server.md +7 -7
- package/docs/Tasklist.md +95 -76
- package/docs/Technical.md +4 -4
- package/package.json +13 -14
- package/src/alignment/DTWMfccSequenceAlignment.ts +9 -9
- package/src/alignment/DTWSequenceAlignment.ts +2 -2
- package/src/alignment/DTWSequenceAlignmentWindowed.ts +3 -3
- package/src/alignment/LevenshteinSequenceAlignment.ts +2 -2
- package/src/alignment/SpeechAlignment.ts +204 -119
- package/src/api/API.ts +14 -13
- package/src/api/APIOptions.ts +12 -11
- package/src/api/Alignment.ts +147 -90
- package/src/api/Common.ts +1 -1
- package/src/api/Denoising.ts +28 -28
- package/src/api/LanguageDetection.ts +135 -48
- package/src/api/Recognition.ts +198 -59
- package/src/api/SourceSeparation.ts +99 -0
- package/src/api/Synthesis.ts +217 -181
- package/src/api/Translation.ts +193 -40
- package/src/api/Vad.ts +110 -41
- package/src/audio/AudioBufferConversion.ts +4 -4
- package/src/audio/AudioPlayer.ts +27 -27
- package/src/audio/AudioRecorder.ts +5 -5
- package/src/audio/AudioUtilities.ts +107 -24
- package/src/cli/CLI.ts +313 -164
- package/src/cli/CLIConfigFile.ts +8 -8
- package/src/cli/CLILauncher.ts +6 -6
- package/src/cli/CLIOptionsSchema.ts +2 -2
- package/src/cli/CLIParser.ts +5 -5
- package/src/cli/CLIStarter.ts +4 -4
- package/src/codecs/FFMpegTranscoder.ts +38 -38
- package/src/codecs/TIMITCodec.ts +5 -5
- package/src/codecs/WaveCodec.ts +22 -22
- package/src/denoising/RNNoise.ts +9 -9
- package/src/dsp/BiquadFilter.ts +19 -11
- package/src/dsp/DecayingPeakEstimator.ts +35 -0
- package/src/dsp/FFT.ts +103 -35
- package/src/dsp/KWeightingFilter.ts +43 -0
- package/src/dsp/LoudnessEstimator.ts +74 -0
- package/src/dsp/MFCC.ts +15 -15
- package/src/dsp/MelSpectogram.ts +7 -7
- package/src/dsp/Rubberband.ts +38 -38
- package/src/dsp/Sonic.ts +4 -4
- package/src/dsp/SpeexResampler.ts +2 -2
- package/src/math/VectorMath.ts +42 -33
- package/src/nlp/ChineseSegmentation.ts +3 -3
- package/src/nlp/CompromiseNLP.ts +3 -3
- package/src/nlp/EspeakPhonemizer.ts +30 -30
- package/src/nlp/IPA.ts +20 -20
- package/src/nlp/JapaneseSegmentation.ts +6 -6
- package/src/nlp/Lexicon.ts +8 -8
- package/src/nlp/Segmentation.ts +23 -14
- package/src/nlp/TextNormalizer.ts +16 -16
- package/src/recognition/AmazonTranscribeSTT.ts +16 -17
- package/src/recognition/AzureCognitiveServicesSTT.ts +8 -6
- package/src/recognition/GoogleCloudSTT.ts +21 -21
- package/src/recognition/OpenAICloudSTT.ts +142 -0
- package/src/recognition/SileroSTT.ts +26 -26
- package/src/recognition/VoskSTT.ts +10 -10
- package/src/recognition/WhisperCppSTT.ts +555 -0
- package/src/recognition/WhisperSTT.ts +760 -507
- package/src/server/Client.ts +23 -23
- package/src/server/Server.ts +9 -9
- package/src/server/Worker.ts +53 -53
- package/src/server/WorkerStarter.ts +2 -2
- package/src/source-separation/MDXNetSourceSeparation.ts +228 -0
- package/src/speech-language-detection/SileroLanguageDetection.ts +8 -8
- package/src/subtitles/Subtitles.ts +3 -3
- package/src/synthesis/AwsPollyTTS.ts +14 -14
- package/src/synthesis/AzureCognitiveServicesTTS.ts +10 -10
- package/src/synthesis/CoquiServerTTS.ts +10 -10
- package/src/synthesis/ElevenlabsTTS.ts +137 -0
- package/src/synthesis/EspeakTTS.ts +90 -71
- package/src/synthesis/FliteTTS.ts +157 -157
- package/src/synthesis/GoogleCloudTTS.ts +19 -19
- package/src/synthesis/GoogleTranslateTTS.ts +104 -104
- package/src/synthesis/MicrosoftEdgeTTS.ts +80 -80
- package/src/synthesis/OpenAICloudTTS.ts +196 -0
- package/src/synthesis/SamTTS.ts +3 -3
- package/src/synthesis/SapiTTS.ts +29 -29
- package/src/synthesis/StreamlabsPollyTTS.ts +29 -29
- package/src/synthesis/SvoxPicoTTS.ts +67 -67
- package/src/synthesis/VitsTTS.ts +380 -380
- package/src/tests/Test.ts +4 -4
- package/src/utilities/Compression.ts +34 -13
- package/src/utilities/FileDownloader.ts +19 -19
- package/src/utilities/FileSystem.ts +7 -7
- package/src/utilities/Locale.ts +22 -22
- package/src/utilities/Logger.ts +4 -4
- package/src/utilities/ObjectUtilities.ts +19 -19
- package/src/utilities/OpenPromise.ts +2 -2
- package/src/utilities/PackageManager.ts +40 -0
- package/src/utilities/PathUtilities.ts +8 -8
- package/src/utilities/RandomGenerator.ts +3 -3
- package/src/utilities/SmoothEstimator.ts +35 -0
- package/src/utilities/TarballMaker.ts +9 -9
- package/src/utilities/Timeline.ts +15 -13
- package/src/utilities/Timer.ts +4 -4
- package/src/utilities/Utilities.ts +49 -15
- package/src/utilities/WasmMemoryManager.ts +7 -7
- package/src/utilities/WebReader.ts +23 -23
- package/src/utilities/WikipediaReader.ts +2 -2
- package/src/voice-activity-detection/AdaptiveGateVAD.ts +202 -0
- package/src/voice-activity-detection/SileroVAD.ts +5 -5
- package/src/voice-activity-detection/WebRtcVAD.ts +5 -5
- package/dist/synthesis/ElevenLabsTTS.d.ts +0 -8
- package/dist/synthesis/ElevenLabsTTS.js +0 -82
- package/dist/synthesis/ElevenLabsTTS.js.map +0 -1
- package/src/synthesis/ElevenLabsTTS.ts +0 -104
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { request } from
|
|
2
|
-
import { Phrase, splitToFragments } from
|
|
3
|
-
import { concatFloat32Arrays, logToStderr } from
|
|
4
|
-
import * as FFMpegTranscoder from
|
|
5
|
-
import { trimAudioEnd } from
|
|
6
|
-
import { Logger } from
|
|
7
|
-
import { getShortLanguageCode } from
|
|
1
|
+
import { request } from 'gaxios';
|
|
2
|
+
import { Phrase, splitToFragments } from '../nlp/Segmentation.js';
|
|
3
|
+
import { concatFloat32Arrays, logToStderr } from '../utilities/Utilities.js';
|
|
4
|
+
import * as FFMpegTranscoder from '../codecs/FFMpegTranscoder.js';
|
|
5
|
+
import { trimAudioEnd } from '../audio/AudioUtilities.js';
|
|
6
|
+
import { Logger } from '../utilities/Logger.js';
|
|
7
|
+
import { getShortLanguageCode } from '../utilities/Locale.js';
|
|
8
8
|
const log = logToStderr;
|
|
9
9
|
const maxTextLengthPerRequest = 200;
|
|
10
|
-
export async function synthesizeLongText(text, languageCode =
|
|
10
|
+
export async function synthesizeLongText(text, languageCode = 'en', tld = 'us', sentenceEndPause = 0.75, segmentEndPause = 1.0) {
|
|
11
11
|
if (text.length == 0) {
|
|
12
|
-
throw new Error(
|
|
12
|
+
throw new Error('Text is empty');
|
|
13
13
|
}
|
|
14
14
|
const logger = new Logger();
|
|
15
|
-
logger.start(
|
|
15
|
+
logger.start('Prepare and split text');
|
|
16
16
|
const fragments = await splitToFragments(text, maxTextLengthPerRequest, languageCode);
|
|
17
17
|
const audioFragments = [];
|
|
18
18
|
let fragmentsSampleRate = 0;
|
|
@@ -41,7 +41,7 @@ export async function synthesizeLongText(text, languageCode = "en", tld = "us",
|
|
|
41
41
|
const startTime = timeline.length == 0 ? 0 : timeline[timeline.length - 1].endTime;
|
|
42
42
|
const endTime = startTime + (trimmedAudio.length / fragmentsSampleRate);
|
|
43
43
|
timeline.push({
|
|
44
|
-
type:
|
|
44
|
+
type: 'segment',
|
|
45
45
|
text: fragment.text,
|
|
46
46
|
startTime,
|
|
47
47
|
endTime
|
|
@@ -54,48 +54,48 @@ export async function synthesizeLongText(text, languageCode = "en", tld = "us",
|
|
|
54
54
|
timeline
|
|
55
55
|
};
|
|
56
56
|
}
|
|
57
|
-
export async function synthesizeShortText(text, languageCode =
|
|
57
|
+
export async function synthesizeShortText(text, languageCode = 'en', tld = 'us') {
|
|
58
58
|
if (text.length > maxTextLengthPerRequest) {
|
|
59
59
|
throw new Error(`Text is ${text.length} characters, which is longer than the maximum of ${maxTextLengthPerRequest}`);
|
|
60
60
|
}
|
|
61
|
-
if (languageCode !=
|
|
61
|
+
if (languageCode != 'zh-CN' && languageCode != 'zh-TW') {
|
|
62
62
|
languageCode = getShortLanguageCode(languageCode);
|
|
63
63
|
}
|
|
64
|
-
const bodyFormParameters = [text, languageCode, null,
|
|
65
|
-
const requestForm = [[[
|
|
64
|
+
const bodyFormParameters = [text, languageCode, null, 'null'];
|
|
65
|
+
const requestForm = [[['jQ1olc', JSON.stringify(bodyFormParameters), null, 'generic']]];
|
|
66
66
|
const stringifiedForm = JSON.stringify(requestForm);
|
|
67
67
|
const requestBody = `f.req=${encodeURIComponent(stringifiedForm)}&`;
|
|
68
68
|
const response = await request({
|
|
69
|
-
method:
|
|
69
|
+
method: 'POST',
|
|
70
70
|
url: `https://translate.google.${tld}/_/TranslateWebserverUi/data/batchexecute`,
|
|
71
71
|
params: {
|
|
72
|
-
|
|
72
|
+
'rpcids': 'jQ1olc'
|
|
73
73
|
},
|
|
74
74
|
headers: {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
75
|
+
'sec-ch-ua': `".Not/A)Brand";v="99", "Google Chrome";v="103", "Chromium";v="103"`,
|
|
76
|
+
'x-same-domain': '1',
|
|
77
|
+
'dnt': '1',
|
|
78
|
+
'content-type': 'application/x-www-form-urlencoded;charset=UTF-8',
|
|
79
|
+
'sec-ch-ua-mobile': '?0',
|
|
80
|
+
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',
|
|
81
|
+
'sec-ch-ua-arch': 'x86',
|
|
82
|
+
'sec-ch-ua-full-version': '103.0.5060.114',
|
|
83
|
+
'sec-ch-ua-platform-version': '10.0.0',
|
|
84
|
+
'sec-ch-ua-full-version-list': `".Not/A)Brand";v="99.0.0.0", "Google Chrome";v="103.0.5060.114", "Chromium";v="103.0.5060.114"`,
|
|
85
|
+
'sec-ch-ua-bitness': '64',
|
|
86
|
+
'sec-ch-ua-model': '',
|
|
87
|
+
'sec-ch-ua-platform': 'Windows',
|
|
88
|
+
'accept': '*/*',
|
|
89
|
+
'origin': 'https://translate.google.com',
|
|
90
|
+
'sec-fetch-site': 'same-origin',
|
|
91
|
+
'sec-fetch-mode': 'cors',
|
|
92
|
+
'sec-fetch-dest': 'empty',
|
|
93
|
+
'referer': 'https://translate.google.com/',
|
|
94
|
+
'accept-encoding': 'gzip, deflate, br',
|
|
95
|
+
'accept-language': 'en-US,en;q=0.9',
|
|
96
96
|
},
|
|
97
97
|
body: requestBody,
|
|
98
|
-
responseType:
|
|
98
|
+
responseType: 'text'
|
|
99
99
|
});
|
|
100
100
|
//log(response.data)
|
|
101
101
|
const audioChunks = [];
|
|
@@ -103,75 +103,75 @@ export async function synthesizeShortText(text, languageCode = "en", tld = "us")
|
|
|
103
103
|
const match = line.match(/"jQ1olc","\[\\"(.*)\\"]/);
|
|
104
104
|
if (match != null) {
|
|
105
105
|
const base64AudioChunk = match[1];
|
|
106
|
-
audioChunks.push(Buffer.from(base64AudioChunk,
|
|
106
|
+
audioChunks.push(Buffer.from(base64AudioChunk, 'base64'));
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
109
|
const resultMp3Stream = Buffer.concat(audioChunks);
|
|
110
110
|
return resultMp3Stream;
|
|
111
111
|
}
|
|
112
112
|
export const supportedLanguageLookup = {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
113
|
+
'af': 'Afrikaans',
|
|
114
|
+
'ar': 'Arabic',
|
|
115
|
+
'bg': 'Bulgarian',
|
|
116
|
+
'bn': 'Bengali',
|
|
117
|
+
'bs': 'Bosnian',
|
|
118
|
+
'ca': 'Catalan',
|
|
119
|
+
'cs': 'Czech',
|
|
120
|
+
'cy': 'Welsh',
|
|
121
|
+
'da': 'Danish',
|
|
122
|
+
'de': 'German',
|
|
123
|
+
'el': 'Greek',
|
|
124
|
+
'en': 'English',
|
|
125
|
+
'eo': 'Esperanto',
|
|
126
|
+
'es': 'Spanish',
|
|
127
|
+
'et': 'Estonian',
|
|
128
|
+
'fi': 'Finnish',
|
|
129
|
+
'fr': 'French',
|
|
130
|
+
'gu': 'Gujarati',
|
|
131
|
+
'hi': 'Hindi',
|
|
132
|
+
'hr': 'Croatian',
|
|
133
|
+
'hu': 'Hungarian',
|
|
134
|
+
'hy': 'Armenian',
|
|
135
|
+
'id': 'Indonesian',
|
|
136
|
+
'is': 'Icelandic',
|
|
137
|
+
'it': 'Italian',
|
|
138
|
+
'iw': 'Hebrew',
|
|
139
|
+
'ja': 'Japanese',
|
|
140
|
+
'jw': 'Javanese',
|
|
141
|
+
'km': 'Khmer',
|
|
142
|
+
'kn': 'Kannada',
|
|
143
|
+
'ko': 'Korean',
|
|
144
|
+
'la': 'Latin',
|
|
145
|
+
'lv': 'Latvian',
|
|
146
|
+
'mk': 'Macedonian',
|
|
147
|
+
'ms': 'Malay',
|
|
148
|
+
'ml': 'Malayalam',
|
|
149
|
+
'mr': 'Marathi',
|
|
150
|
+
'my': 'Myanmar (Burmese)',
|
|
151
|
+
'ne': 'Nepali',
|
|
152
|
+
'nl': 'Dutch',
|
|
153
|
+
'no': 'Norwegian',
|
|
154
|
+
'pl': 'Polish',
|
|
155
|
+
'pt': 'Portuguese',
|
|
156
|
+
'ro': 'Romanian',
|
|
157
|
+
'ru': 'Russian',
|
|
158
|
+
'si': 'Sinhala',
|
|
159
|
+
'sk': 'Slovak',
|
|
160
|
+
'sq': 'Albanian',
|
|
161
|
+
'sr': 'Serbian',
|
|
162
|
+
'su': 'Sundanese',
|
|
163
|
+
'sv': 'Swedish',
|
|
164
|
+
'sw': 'Swahili',
|
|
165
|
+
'ta': 'Tamil',
|
|
166
|
+
'te': 'Telugu',
|
|
167
|
+
'th': 'Thai',
|
|
168
|
+
'tl': 'Filipino',
|
|
169
|
+
'tr': 'Turkish',
|
|
170
|
+
'uk': 'Ukrainian',
|
|
171
|
+
'ur': 'Urdu',
|
|
172
|
+
'vi': 'Vietnamese',
|
|
173
|
+
'zh-CN': 'Chinese',
|
|
174
|
+
'zh-TW': 'Chinese (Mandarin/Taiwan)',
|
|
175
|
+
'zh': 'Chinese (Mandarin)',
|
|
176
176
|
};
|
|
177
177
|
//# sourceMappingURL=GoogleTranslateTTS.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import WebSocket from
|
|
2
|
-
import { RawAudio } from
|
|
1
|
+
import WebSocket from 'ws';
|
|
2
|
+
import { RawAudio } from '../audio/AudioUtilities.js';
|
|
3
3
|
export declare function synthesize(text: string, trustedClientToken: string, voice?: string, ssmlPitchString?: string, ssmlRateString?: string, ssmlVolumeString?: string): Promise<{
|
|
4
4
|
rawAudio: RawAudio;
|
|
5
5
|
timeline: import("../utilities/Timeline.js").Timeline;
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import { request } from
|
|
2
|
-
import WebSocket from
|
|
1
|
+
import { request } from 'gaxios';
|
|
2
|
+
import WebSocket from 'ws';
|
|
3
3
|
import { escape } from 'html-escaper';
|
|
4
|
-
import splitBuffer from
|
|
5
|
-
import * as AzureCognitiveServicesTTS from
|
|
6
|
-
import * as FFMpegTranscoder from
|
|
7
|
-
import { Logger } from
|
|
8
|
-
import { OpenPromise } from
|
|
9
|
-
import { getRandomHexString, logToStderr } from
|
|
10
|
-
import { getEmptyRawAudio, getRawAudioDuration } from
|
|
11
|
-
import { Timer } from
|
|
4
|
+
import splitBuffer from 'buffer-split';
|
|
5
|
+
import * as AzureCognitiveServicesTTS from './AzureCognitiveServicesTTS.js';
|
|
6
|
+
import * as FFMpegTranscoder from '../codecs/FFMpegTranscoder.js';
|
|
7
|
+
import { Logger } from '../utilities/Logger.js';
|
|
8
|
+
import { OpenPromise } from '../utilities/OpenPromise.js';
|
|
9
|
+
import { getRandomHexString, logToStderr } from '../utilities/Utilities.js';
|
|
10
|
+
import { getEmptyRawAudio, getRawAudioDuration } from '../audio/AudioUtilities.js';
|
|
11
|
+
import { Timer } from '../utilities/Timer.js';
|
|
12
12
|
const traceEnabled = false;
|
|
13
13
|
const log = traceEnabled ? logToStderr : () => { };
|
|
14
|
-
export async function synthesize(text, trustedClientToken, voice =
|
|
14
|
+
export async function synthesize(text, trustedClientToken, voice = 'Microsoft Server Speech Text to Speech Voice (en-US, AvaNeural)', ssmlPitchString = '+0Hz', ssmlRateString = '+0%', ssmlVolumeString = '+0%') {
|
|
15
15
|
const logger = new Logger();
|
|
16
|
-
logger.start(
|
|
16
|
+
logger.start('Request synthesis from Microsoft Edge cloud API');
|
|
17
17
|
const { audioData, events } = await requestSynthesis(text, trustedClientToken, voice, ssmlPitchString, ssmlRateString, ssmlVolumeString);
|
|
18
18
|
logger.end();
|
|
19
19
|
//logToStderr(`Audio length: ${audioData.length}`)
|
|
@@ -25,12 +25,12 @@ export async function synthesize(text, trustedClientToken, voice = "Microsoft Se
|
|
|
25
25
|
rawAudio = getEmptyRawAudio(1, 24000);
|
|
26
26
|
}
|
|
27
27
|
//logToStderr(`Raw audio length: ${rawAudio.audioChannels[0].length}`)
|
|
28
|
-
logger.start(
|
|
28
|
+
logger.start('Convert boundary events to timeline');
|
|
29
29
|
const timeline = AzureCognitiveServicesTTS.boundaryEventsToTimeline(events, getRawAudioDuration(rawAudio));
|
|
30
30
|
logger.end();
|
|
31
31
|
return { rawAudio, timeline };
|
|
32
32
|
}
|
|
33
|
-
async function requestSynthesis(text, trustedClientToken, voice =
|
|
33
|
+
async function requestSynthesis(text, trustedClientToken, voice = 'Microsoft Server Speech Text to Speech Voice (en-US, AriaNeural)', ssmlPitchString = '+0Hz', ssmlRateString = '+0%', ssmlVolumeString = '+0%') {
|
|
34
34
|
const synthesisOpenPromise = new OpenPromise();
|
|
35
35
|
let connectionFailed = false;
|
|
36
36
|
let responseComplete = false;
|
|
@@ -72,28 +72,28 @@ async function requestSynthesis(text, trustedClientToken, voice = "Microsoft Ser
|
|
|
72
72
|
log(`Ignoring binary message to different request Id: ${requestId}`);
|
|
73
73
|
return;
|
|
74
74
|
}
|
|
75
|
-
log(
|
|
75
|
+
log('\nReceived binary message:');
|
|
76
76
|
log(header);
|
|
77
77
|
receivedBinaryMessages.push(messageData);
|
|
78
|
-
receivedBinaryMessages.push(Buffer.from(
|
|
78
|
+
receivedBinaryMessages.push(Buffer.from('\n\n'));
|
|
79
79
|
audioChunks.push(audioChunk);
|
|
80
80
|
}
|
|
81
81
|
else {
|
|
82
|
-
const message = messageData.toString(
|
|
82
|
+
const message = messageData.toString('utf8');
|
|
83
83
|
const [header, content] = parseTextMessage(message);
|
|
84
84
|
if (header['X-RequestId'] != requestId) {
|
|
85
85
|
log(`Ignoring text message to different request Id: ${requestId}`);
|
|
86
86
|
return;
|
|
87
87
|
}
|
|
88
|
-
log(
|
|
88
|
+
log('\nReceived text message:');
|
|
89
89
|
log(header);
|
|
90
90
|
log(content);
|
|
91
|
-
if (header[
|
|
91
|
+
if (header['Path'] == 'turn.start') {
|
|
92
92
|
}
|
|
93
|
-
else if (header[
|
|
94
|
-
receivedEventMessages.push(content[
|
|
93
|
+
else if (header['Path'] == 'audio.metadata') {
|
|
94
|
+
receivedEventMessages.push(content['Metadata'][0]);
|
|
95
95
|
}
|
|
96
|
-
else if (header[
|
|
96
|
+
else if (header['Path'] == 'turn.end') {
|
|
97
97
|
const result = { audioData: Buffer.concat(audioChunks), events: receivedEventMessages };
|
|
98
98
|
removeWebSocketHandlers();
|
|
99
99
|
synthesisOpenPromise.resolve(result);
|
|
@@ -109,7 +109,7 @@ async function requestSynthesis(text, trustedClientToken, voice = "Microsoft Ser
|
|
|
109
109
|
}
|
|
110
110
|
};
|
|
111
111
|
const onClose = async (code, reason) => {
|
|
112
|
-
log(
|
|
112
|
+
log('WebSocket closed.');
|
|
113
113
|
log(code);
|
|
114
114
|
log(reason.toString());
|
|
115
115
|
if (reason.length > 0) {
|
|
@@ -118,14 +118,14 @@ async function requestSynthesis(text, trustedClientToken, voice = "Microsoft Ser
|
|
|
118
118
|
};
|
|
119
119
|
function removeWebSocketHandlers() {
|
|
120
120
|
if (webSocket) {
|
|
121
|
-
webSocket.off(
|
|
122
|
-
webSocket.off(
|
|
123
|
-
webSocket.off(
|
|
121
|
+
webSocket.off('message', onMessage);
|
|
122
|
+
webSocket.off('error', onError);
|
|
123
|
+
webSocket.off('close', onClose);
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
|
-
webSocket.on(
|
|
127
|
-
webSocket.on(
|
|
128
|
-
webSocket.on(
|
|
126
|
+
webSocket.on('message', onMessage);
|
|
127
|
+
webSocket.on('error', onError);
|
|
128
|
+
webSocket.on('close', onClose);
|
|
129
129
|
const requestContentSSML = `<speak version='1.0' xmlns='http://www.w3.org/2001/10/synthesis' xml:lang='en-US'>` +
|
|
130
130
|
`<voice name='${voice}'>` +
|
|
131
131
|
`<prosody pitch='${ssmlPitchString}' rate='${ssmlRateString}' volume='${ssmlVolumeString}'>` +
|
|
@@ -135,7 +135,7 @@ async function requestSynthesis(text, trustedClientToken, voice = "Microsoft Ser
|
|
|
135
135
|
`</speak>`;
|
|
136
136
|
const bodyRequestString = `X-RequestId:${requestId}\r\n` +
|
|
137
137
|
`Content-Type:application/ssml+xml\r\n` +
|
|
138
|
-
`X-Timestamp:${getTimestampString()}Z\r\n` + // The added
|
|
138
|
+
`X-Timestamp:${getTimestampString()}Z\r\n` + // The added 'Z' recreates a Microsoft Edge bug.
|
|
139
139
|
`Path:ssml\r\n\r\n` +
|
|
140
140
|
requestContentSSML;
|
|
141
141
|
log(bodyRequestString);
|
|
@@ -154,31 +154,31 @@ export async function initializeWebsocketConnection(trustedClientToken) {
|
|
|
154
154
|
existingWebSocketConnection = undefined;
|
|
155
155
|
}
|
|
156
156
|
const connectionId = getRandomHexString();
|
|
157
|
-
const requestURL =
|
|
158
|
-
|
|
157
|
+
const requestURL = 'wss://speech.platform.bing.com/' +
|
|
158
|
+
'consumer/speech/synthesize/readaloud/edge/v1' +
|
|
159
159
|
`?TrustedClientToken=${trustedClientToken}` +
|
|
160
|
-
|
|
160
|
+
'&ConnectionId=' + connectionId;
|
|
161
161
|
log(requestURL);
|
|
162
|
-
log(
|
|
162
|
+
log('');
|
|
163
163
|
const webSocket = new WebSocket(requestURL, {
|
|
164
164
|
headers: {
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
165
|
+
'Pragma': 'no-cache',
|
|
166
|
+
'Cache-Control': 'no-cache',
|
|
167
|
+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.66 Safari/537.36 Edg/103.0.1264.44',
|
|
168
|
+
'Origin': 'chrome-extension://jdiccldimpdaibmpdkjnbmckianbfold',
|
|
169
|
+
'Accept-Encoding': 'gzip, deflate, br',
|
|
170
|
+
'Accept-Language': 'en-US,en;q=0.9',
|
|
171
171
|
}
|
|
172
172
|
});
|
|
173
173
|
const requestMetadata = {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
174
|
+
'context': {
|
|
175
|
+
'synthesis': {
|
|
176
|
+
'audio': {
|
|
177
|
+
'metadataoptions': {
|
|
178
|
+
'sentenceBoundaryEnabled': 'false',
|
|
179
|
+
'wordBoundaryEnabled': 'true'
|
|
180
180
|
},
|
|
181
|
-
|
|
181
|
+
'outputFormat': 'webm-24khz-16bit-mono-opus'
|
|
182
182
|
}
|
|
183
183
|
}
|
|
184
184
|
}
|
|
@@ -191,13 +191,13 @@ export async function initializeWebsocketConnection(trustedClientToken) {
|
|
|
191
191
|
log(configRequestString);
|
|
192
192
|
webSocket.send(configRequestString);
|
|
193
193
|
existingWebSocketConnection = webSocket;
|
|
194
|
-
webSocket.off(
|
|
195
|
-
webSocket.off(
|
|
196
|
-
webSocket.off(
|
|
194
|
+
webSocket.off('open', onOpen);
|
|
195
|
+
webSocket.off('close', onClose);
|
|
196
|
+
webSocket.off('error', onError);
|
|
197
197
|
requestOpenPromise.resolve(webSocket);
|
|
198
198
|
};
|
|
199
199
|
const onClose = (code, reason) => {
|
|
200
|
-
log(
|
|
200
|
+
log('WebSocket closed.');
|
|
201
201
|
log(code);
|
|
202
202
|
log(reason.toString());
|
|
203
203
|
if (reason.length > 0) {
|
|
@@ -207,53 +207,53 @@ export async function initializeWebsocketConnection(trustedClientToken) {
|
|
|
207
207
|
const onError = (err) => {
|
|
208
208
|
requestOpenPromise.reject(err);
|
|
209
209
|
};
|
|
210
|
-
webSocket.on(
|
|
211
|
-
webSocket.on(
|
|
212
|
-
webSocket.on(
|
|
210
|
+
webSocket.on('open', onOpen);
|
|
211
|
+
webSocket.on('close', onClose);
|
|
212
|
+
webSocket.on('error', onError);
|
|
213
213
|
return requestOpenPromise.promise;
|
|
214
214
|
}
|
|
215
215
|
export async function getVoiceList(trustedClientToken) {
|
|
216
216
|
const response = await request({
|
|
217
|
-
method:
|
|
218
|
-
url:
|
|
217
|
+
method: 'GET',
|
|
218
|
+
url: 'https://speech.platform.bing.com/consumer/speech/synthesize/' +
|
|
219
219
|
`readaloud/voices/list?trustedclienttoken=${trustedClientToken}`,
|
|
220
220
|
headers: {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
221
|
+
'sec-ch-ua': `" Not;A Brand";v="99", "Microsoft Edge";v="103", "Chromium";v="103"`,
|
|
222
|
+
'dnt': '1',
|
|
223
|
+
'sec-ch-ua-mobile': '?0',
|
|
224
|
+
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.66 Safari/537.36 Edg/103.0.1264.44',
|
|
225
|
+
'sec-ch-ua-platform': 'Windows',
|
|
226
|
+
'accept': '*/*',
|
|
227
|
+
'sec-fetch-site': 'none',
|
|
228
|
+
'sec-fetch-mode': 'cors',
|
|
229
|
+
'sec-fetch-dest': 'empty',
|
|
230
|
+
'accept-encoding': 'gzip, deflate, br',
|
|
231
|
+
'accept-language': 'en-US,en;q=0.9',
|
|
232
232
|
},
|
|
233
|
-
responseType:
|
|
233
|
+
responseType: 'json'
|
|
234
234
|
});
|
|
235
235
|
return response.data;
|
|
236
236
|
}
|
|
237
237
|
function getTimestampString() {
|
|
238
|
-
const timestampString = new Date(new Date().toLocaleString(
|
|
238
|
+
const timestampString = new Date(new Date().toLocaleString('en-US', { timeZone: 'UTC' })).toString().replace(/GMT.*/, 'GMT+0000 (Coordinated Universal Time)');
|
|
239
239
|
return timestampString;
|
|
240
240
|
}
|
|
241
241
|
function parseHeaderString(headerString) {
|
|
242
242
|
const headers = {};
|
|
243
|
-
for (const headerLine of headerString.split(
|
|
244
|
-
const [key, value] = headerLine.split(
|
|
243
|
+
for (const headerLine of headerString.split('\r\n')) {
|
|
244
|
+
const [key, value] = headerLine.split(':');
|
|
245
245
|
headers[key] = value;
|
|
246
246
|
}
|
|
247
247
|
return headers;
|
|
248
248
|
}
|
|
249
249
|
function parseTextMessage(message) {
|
|
250
|
-
const [headerString, content] = message.split(
|
|
250
|
+
const [headerString, content] = message.split('\r\n\r\n');
|
|
251
251
|
return [parseHeaderString(headerString), JSON.parse(content)];
|
|
252
252
|
}
|
|
253
253
|
function parseBinaryMessage(message) {
|
|
254
|
-
const audioChunk = splitBuffer(message, Buffer.from(
|
|
254
|
+
const audioChunk = splitBuffer(message, Buffer.from('Path:audio\r\n'))[1];
|
|
255
255
|
const headerBuffer = message.subarray(2, message.length - audioChunk.length);
|
|
256
|
-
const headerString = headerBuffer.toString(
|
|
256
|
+
const headerString = headerBuffer.toString('utf8').trim();
|
|
257
257
|
return [parseHeaderString(headerString), audioChunk];
|
|
258
258
|
}
|
|
259
259
|
//# sourceMappingURL=MicrosoftEdgeTTS.js.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { SynthesisVoice } from '../api/Synthesis.js';
|
|
2
|
+
export declare function synthesize(text: string, voice: string, speed: number, options: OpenAICloudTTSOptions): Promise<import("../audio/AudioUtilities.js").RawAudio>;
|
|
3
|
+
export interface OpenAICloudTTSOptions {
|
|
4
|
+
apiKey?: string;
|
|
5
|
+
organization?: string;
|
|
6
|
+
baseURL?: string;
|
|
7
|
+
model?: 'tts-1' | 'tts-1-hd';
|
|
8
|
+
timeout?: number;
|
|
9
|
+
maxRetries?: number;
|
|
10
|
+
}
|
|
11
|
+
export declare const defaultOpenAICloudTTSOptions: OpenAICloudTTSOptions;
|
|
12
|
+
export declare const supportedLanguages: string[];
|
|
13
|
+
export declare const voiceList: SynthesisVoice[];
|