echogarden 0.0.1 → 0.1.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 +59 -1
- package/data/lexicons/heteronyms.json +674 -0
- package/data/schemas/options.json +1057 -0
- package/data/tables/lcid-table.json +7427 -0
- package/dist/alignment/DTWMfccSequenceAlignment.d.ts +2 -0
- package/dist/alignment/DTWMfccSequenceAlignment.js +26 -0
- package/dist/alignment/DTWMfccSequenceAlignment.js.map +1 -0
- package/dist/alignment/DTWSequenceAlignment.d.ts +5 -0
- package/dist/alignment/DTWSequenceAlignment.js +99 -0
- package/dist/alignment/DTWSequenceAlignment.js.map +1 -0
- package/dist/alignment/DTWSequenceAlignmentWindowed.d.ts +5 -0
- package/dist/alignment/DTWSequenceAlignmentWindowed.js +161 -0
- package/dist/alignment/DTWSequenceAlignmentWindowed.js.map +1 -0
- package/dist/alignment/LevenshteinSequenceAlignment.d.ts +5 -0
- package/dist/alignment/LevenshteinSequenceAlignment.js +102 -0
- package/dist/alignment/LevenshteinSequenceAlignment.js.map +1 -0
- package/dist/alignment/SpeechAlignment.d.ts +27 -0
- package/dist/alignment/SpeechAlignment.js +266 -0
- package/dist/alignment/SpeechAlignment.js.map +1 -0
- package/dist/api/API.d.ts +8 -0
- package/dist/api/API.js +10 -0
- package/dist/api/API.js.map +1 -0
- package/dist/api/APIOptions.d.ts +12 -0
- package/dist/api/APIOptions.js +2 -0
- package/dist/api/APIOptions.js.map +1 -0
- package/dist/api/Alignment.d.ts +32 -0
- package/dist/api/Alignment.js +134 -0
- package/dist/api/Alignment.js.map +1 -0
- package/dist/api/Denoising.d.ts +14 -0
- package/dist/api/Denoising.js +66 -0
- package/dist/api/Denoising.js.map +1 -0
- package/dist/api/Globals.d.ts +1 -0
- package/dist/api/Globals.js +2 -0
- package/dist/api/Globals.js.map +1 -0
- package/dist/api/LanguageDetection.d.ts +49 -0
- package/dist/api/LanguageDetection.js +118 -0
- package/dist/api/LanguageDetection.js.map +1 -0
- package/dist/api/Recognition.d.ts +49 -0
- package/dist/api/Recognition.js +162 -0
- package/dist/api/Recognition.js.map +1 -0
- package/dist/api/Synthesis.d.ts +125 -0
- package/dist/api/Synthesis.js +892 -0
- package/dist/api/Synthesis.js.map +1 -0
- package/dist/api/Translation.d.ts +25 -0
- package/dist/api/Translation.js +69 -0
- package/dist/api/Translation.js.map +1 -0
- package/dist/api/Vad.d.ts +25 -0
- package/dist/api/Vad.js +88 -0
- package/dist/api/Vad.js.map +1 -0
- package/dist/audio/AudioBufferConversion.d.ts +15 -0
- package/dist/audio/AudioBufferConversion.js +228 -0
- package/dist/audio/AudioBufferConversion.js.map +1 -0
- package/dist/audio/AudioPlayer.d.ts +9 -0
- package/dist/audio/AudioPlayer.js +232 -0
- package/dist/audio/AudioPlayer.js.map +1 -0
- package/dist/audio/AudioRecorder.d.ts +3 -0
- package/dist/audio/AudioRecorder.js +68 -0
- package/dist/audio/AudioRecorder.js.map +1 -0
- package/dist/audio/AudioUtilities.d.ts +48 -0
- package/dist/audio/AudioUtilities.js +209 -0
- package/dist/audio/AudioUtilities.js.map +1 -0
- package/dist/audio/SoxPath.d.ts +1 -0
- package/dist/audio/SoxPath.js +19 -0
- package/dist/audio/SoxPath.js.map +1 -0
- package/dist/cli/CLI.d.ts +8 -0
- package/dist/cli/CLI.js +860 -0
- package/dist/cli/CLI.js.map +1 -0
- package/dist/cli/CLIConfigFile.d.ts +3 -0
- package/dist/cli/CLIConfigFile.js +62 -0
- package/dist/cli/CLIConfigFile.js.map +1 -0
- package/dist/cli/CLILauncher.d.ts +2 -0
- package/dist/cli/CLILauncher.js +22 -0
- package/dist/cli/CLILauncher.js.map +1 -0
- package/dist/cli/CLIOptionsSchema.d.ts +5 -0
- package/dist/cli/CLIOptionsSchema.js +36 -0
- package/dist/cli/CLIOptionsSchema.js.map +1 -0
- package/dist/cli/CLIParser.d.ts +6 -0
- package/dist/cli/CLIParser.js +34 -0
- package/dist/cli/CLIParser.js.map +1 -0
- package/dist/cli/CLIStarter.d.ts +1 -0
- package/dist/cli/CLIStarter.js +3 -0
- package/dist/cli/CLIStarter.js.map +1 -0
- package/dist/codecs/FFMpegTranscoder.d.ts +20 -0
- package/dist/codecs/FFMpegTranscoder.js +169 -0
- package/dist/codecs/FFMpegTranscoder.js.map +1 -0
- package/dist/codecs/TIMITCodec.d.ts +9 -0
- package/dist/codecs/TIMITCodec.js +14 -0
- package/dist/codecs/TIMITCodec.js.map +1 -0
- package/dist/codecs/WaveCodec.d.ts +19 -0
- package/dist/codecs/WaveCodec.js +208 -0
- package/dist/codecs/WaveCodec.js.map +1 -0
- package/dist/denoising/RNNoise.d.ts +6 -0
- package/dist/denoising/RNNoise.js +68 -0
- package/dist/denoising/RNNoise.js.map +1 -0
- package/dist/dsp/BiquadFilter.d.ts +26 -0
- package/dist/dsp/BiquadFilter.js +399 -0
- package/dist/dsp/BiquadFilter.js.map +1 -0
- package/dist/dsp/FFT.d.ts +9 -0
- package/dist/dsp/FFT.js +135 -0
- package/dist/dsp/FFT.js.map +1 -0
- package/dist/dsp/MFCC.d.ts +25 -0
- package/dist/dsp/MFCC.js +162 -0
- package/dist/dsp/MFCC.js.map +1 -0
- package/dist/dsp/MelSpectogram.d.ts +19 -0
- package/dist/dsp/MelSpectogram.js +102 -0
- package/dist/dsp/MelSpectogram.js.map +1 -0
- package/dist/dsp/Rubberband.d.ts +52 -0
- package/dist/dsp/Rubberband.js +186 -0
- package/dist/dsp/Rubberband.js.map +1 -0
- package/dist/dsp/Sonic.d.ts +2 -0
- package/dist/dsp/Sonic.js +39 -0
- package/dist/dsp/Sonic.js.map +1 -0
- package/dist/dsp/SpeexResampler.d.ts +3 -0
- package/dist/dsp/SpeexResampler.js +53 -0
- package/dist/dsp/SpeexResampler.js.map +1 -0
- package/dist/math/VectorMath.d.ts +70 -0
- package/dist/math/VectorMath.js +564 -0
- package/dist/math/VectorMath.js.map +1 -0
- package/dist/nlp/ChineseSegmentation.d.ts +1 -0
- package/dist/nlp/ChineseSegmentation.js +53 -0
- package/dist/nlp/ChineseSegmentation.js.map +1 -0
- package/dist/nlp/CompromiseNLP.d.ts +15 -0
- package/dist/nlp/CompromiseNLP.js +66 -0
- package/dist/nlp/CompromiseNLP.js.map +1 -0
- package/dist/nlp/EspeakPhonemizer.d.ts +4 -0
- package/dist/nlp/EspeakPhonemizer.js +133 -0
- package/dist/nlp/EspeakPhonemizer.js.map +1 -0
- package/dist/nlp/IPA.d.ts +19 -0
- package/dist/nlp/IPA.js +113 -0
- package/dist/nlp/IPA.js.map +1 -0
- package/dist/nlp/JapaneseSegmentation.d.ts +1 -0
- package/dist/nlp/JapaneseSegmentation.js +40 -0
- package/dist/nlp/JapaneseSegmentation.js.map +1 -0
- package/dist/nlp/Lexicon.d.ts +17 -0
- package/dist/nlp/Lexicon.js +6 -0
- package/dist/nlp/Lexicon.js.map +1 -0
- package/dist/nlp/PhoneConversion.d.ts +6 -0
- package/dist/nlp/PhoneConversion.js +467 -0
- package/dist/nlp/PhoneConversion.js.map +1 -0
- package/dist/nlp/Segmentation.d.ts +41 -0
- package/dist/nlp/Segmentation.js +158 -0
- package/dist/nlp/Segmentation.js.map +1 -0
- package/dist/nlp/TextNormalizer.d.ts +4 -0
- package/dist/nlp/TextNormalizer.js +69 -0
- package/dist/nlp/TextNormalizer.js.map +1 -0
- package/dist/recognition/AmazonTranscribeSTT.d.ts +6 -0
- package/dist/recognition/AmazonTranscribeSTT.js +79 -0
- package/dist/recognition/AmazonTranscribeSTT.js.map +1 -0
- package/dist/recognition/AzureCognitiveServicesSTT.d.ts +7 -0
- package/dist/recognition/AzureCognitiveServicesSTT.js +51 -0
- package/dist/recognition/AzureCognitiveServicesSTT.js.map +1 -0
- package/dist/recognition/GoogleCloudSTT.d.ts +7 -0
- package/dist/recognition/GoogleCloudSTT.js +66 -0
- package/dist/recognition/GoogleCloudSTT.js.map +1 -0
- package/dist/recognition/SileroSTT.d.ts +9 -0
- package/dist/recognition/SileroSTT.js +125 -0
- package/dist/recognition/SileroSTT.js.map +1 -0
- package/dist/recognition/VoskSTT.d.ts +10 -0
- package/dist/recognition/VoskSTT.js +78 -0
- package/dist/recognition/VoskSTT.js.map +1 -0
- package/dist/recognition/WhisperSTT.d.ts +69 -0
- package/dist/recognition/WhisperSTT.js +977 -0
- package/dist/recognition/WhisperSTT.js.map +1 -0
- package/dist/server/Server.d.ts +1 -0
- package/dist/server/Server.js +18 -0
- package/dist/server/Server.js.map +1 -0
- package/dist/speech-language-detection/SileroLanguageDetection.d.ts +9 -0
- package/dist/speech-language-detection/SileroLanguageDetection.js +47 -0
- package/dist/speech-language-detection/SileroLanguageDetection.js.map +1 -0
- package/dist/subtitles/Subtitles.d.ts +25 -0
- package/dist/subtitles/Subtitles.js +286 -0
- package/dist/subtitles/Subtitles.js.map +1 -0
- package/dist/synthesis/AwsPollyTTS.d.ts +7 -0
- package/dist/synthesis/AwsPollyTTS.js +51 -0
- package/dist/synthesis/AwsPollyTTS.js.map +1 -0
- package/dist/synthesis/AzureCognitiveServicesTTS.d.ts +9 -0
- package/dist/synthesis/AzureCognitiveServicesTTS.js +103 -0
- package/dist/synthesis/AzureCognitiveServicesTTS.js.map +1 -0
- package/dist/synthesis/CoquiServerTTS.d.ts +6 -0
- package/dist/synthesis/CoquiServerTTS.js +22 -0
- package/dist/synthesis/CoquiServerTTS.js.map +1 -0
- package/dist/synthesis/ElevenLabsTTS.d.ts +8 -0
- package/dist/synthesis/ElevenLabsTTS.js +48 -0
- package/dist/synthesis/ElevenLabsTTS.js.map +1 -0
- package/dist/synthesis/EspeakTTS.d.ts +46 -0
- package/dist/synthesis/EspeakTTS.js +353 -0
- package/dist/synthesis/EspeakTTS.js.map +1 -0
- package/dist/synthesis/FliteTTS.d.ts +17 -0
- package/dist/synthesis/FliteTTS.js +326 -0
- package/dist/synthesis/FliteTTS.js.map +1 -0
- package/dist/synthesis/GoogleCloudTTS.d.ts +16 -0
- package/dist/synthesis/GoogleCloudTTS.js +72 -0
- package/dist/synthesis/GoogleCloudTTS.js.map +1 -0
- package/dist/synthesis/GoogleTranslateTTS.d.ts +13 -0
- package/dist/synthesis/GoogleTranslateTTS.js +177 -0
- package/dist/synthesis/GoogleTranslateTTS.js.map +1 -0
- package/dist/synthesis/MicrosoftEdgeTTS.d.ts +10 -0
- package/dist/synthesis/MicrosoftEdgeTTS.js +216 -0
- package/dist/synthesis/MicrosoftEdgeTTS.js.map +1 -0
- package/dist/synthesis/SamTTS.d.ts +4 -0
- package/dist/synthesis/SamTTS.js +21 -0
- package/dist/synthesis/SamTTS.js.map +1 -0
- package/dist/synthesis/SapiTTS.d.ts +9 -0
- package/dist/synthesis/SapiTTS.js +211 -0
- package/dist/synthesis/SapiTTS.js.map +1 -0
- package/dist/synthesis/StreamlabsPollyTTS.d.ts +12 -0
- package/dist/synthesis/StreamlabsPollyTTS.js +88 -0
- package/dist/synthesis/StreamlabsPollyTTS.js.map +1 -0
- package/dist/synthesis/SvoxPicoTTS.d.ts +11 -0
- package/dist/synthesis/SvoxPicoTTS.js +236 -0
- package/dist/synthesis/SvoxPicoTTS.js.map +1 -0
- package/dist/synthesis/VitsTTS.d.ts +27 -0
- package/dist/synthesis/VitsTTS.js +359 -0
- package/dist/synthesis/VitsTTS.js.map +1 -0
- package/dist/tests/Test.d.ts +1 -0
- package/dist/tests/Test.js +10 -0
- package/dist/tests/Test.js.map +1 -0
- package/dist/text-language-detection/FastTextLanguageDetection.d.ts +2 -0
- package/dist/text-language-detection/FastTextLanguageDetection.js +38 -0
- package/dist/text-language-detection/FastTextLanguageDetection.js.map +1 -0
- package/dist/text-language-detection/TinyLDLanguageDetection.d.ts +2 -0
- package/dist/text-language-detection/TinyLDLanguageDetection.js +12 -0
- package/dist/text-language-detection/TinyLDLanguageDetection.js.map +1 -0
- package/dist/utilities/BinaryArrayConversion.d.ts +15 -0
- package/dist/utilities/BinaryArrayConversion.js +115 -0
- package/dist/utilities/BinaryArrayConversion.js.map +1 -0
- package/dist/utilities/Compression.d.ts +4 -0
- package/dist/utilities/Compression.js +67 -0
- package/dist/utilities/Compression.js.map +1 -0
- package/dist/utilities/FileDownloader.d.ts +3 -0
- package/dist/utilities/FileDownloader.js +147 -0
- package/dist/utilities/FileDownloader.js.map +1 -0
- package/dist/utilities/FileSystem.d.ts +30 -0
- package/dist/utilities/FileSystem.js +141 -0
- package/dist/utilities/FileSystem.js.map +1 -0
- package/dist/utilities/Hashing.d.ts +10 -0
- package/dist/utilities/Hashing.js +169 -0
- package/dist/utilities/Hashing.js.map +1 -0
- package/dist/utilities/Locale.d.ts +9 -0
- package/dist/utilities/Locale.js +65 -0
- package/dist/utilities/Locale.js.map +1 -0
- package/dist/utilities/Logger.d.ts +11 -0
- package/dist/utilities/Logger.js +49 -0
- package/dist/utilities/Logger.js.map +1 -0
- package/dist/utilities/NdArrayUtilities.d.ts +3 -0
- package/dist/utilities/NdArrayUtilities.js +22 -0
- package/dist/utilities/NdArrayUtilities.js.map +1 -0
- package/dist/utilities/ObjectUtilities.d.ts +4 -0
- package/dist/utilities/ObjectUtilities.js +132 -0
- package/dist/utilities/ObjectUtilities.js.map +1 -0
- package/dist/utilities/OpenPromise.d.ts +6 -0
- package/dist/utilities/OpenPromise.js +12 -0
- package/dist/utilities/OpenPromise.js.map +1 -0
- package/dist/utilities/PackageManager.d.ts +4 -0
- package/dist/utilities/PackageManager.js +46 -0
- package/dist/utilities/PackageManager.js.map +1 -0
- package/dist/utilities/RandomGenerator.d.ts +35 -0
- package/dist/utilities/RandomGenerator.js +149 -0
- package/dist/utilities/RandomGenerator.js.map +1 -0
- package/dist/utilities/TarballMaker.d.ts +4 -0
- package/dist/utilities/TarballMaker.js +50 -0
- package/dist/utilities/TarballMaker.js.map +1 -0
- package/dist/utilities/Timeline.d.ts +20 -0
- package/dist/utilities/Timeline.js +110 -0
- package/dist/utilities/Timeline.js.map +1 -0
- package/dist/utilities/Timer.d.ts +13 -0
- package/dist/utilities/Timer.js +70 -0
- package/dist/utilities/Timer.js.map +1 -0
- package/dist/utilities/Utilities.d.ts +68 -0
- package/dist/utilities/Utilities.js +305 -0
- package/dist/utilities/Utilities.js.map +1 -0
- package/dist/utilities/WasmMemoryManager.d.ts +142 -0
- package/dist/utilities/WasmMemoryManager.js +407 -0
- package/dist/utilities/WasmMemoryManager.js.map +1 -0
- package/dist/utilities/WebReader.d.ts +1 -0
- package/dist/utilities/WebReader.js +47 -0
- package/dist/utilities/WebReader.js.map +1 -0
- package/dist/utilities/WikipediaReader.d.ts +1 -0
- package/dist/utilities/WikipediaReader.js +31 -0
- package/dist/utilities/WikipediaReader.js.map +1 -0
- package/dist/voice-activity-detection/SileroVAD.d.ts +13 -0
- package/dist/voice-activity-detection/SileroVAD.js +58 -0
- package/dist/voice-activity-detection/SileroVAD.js.map +1 -0
- package/dist/voice-activity-detection/WebRtcVAD.d.ts +3 -0
- package/dist/voice-activity-detection/WebRtcVAD.js +53 -0
- package/dist/voice-activity-detection/WebRtcVAD.js.map +1 -0
- package/docs/CLI.md +234 -0
- package/docs/Development.md +3 -0
- package/docs/Engines.md +80 -0
- package/docs/Licenses.md +37 -0
- package/docs/Options.md +192 -0
- package/docs/Roadmap.md +16 -0
- package/docs/Technical.md +72 -0
- package/package.json +119 -19
- package/cli.js +0 -3
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import SpeechSDK from 'microsoft-cognitiveservices-speech-sdk';
|
|
2
|
+
import * as FFMpegTranscoder from "../codecs/FFMpegTranscoder.js";
|
|
3
|
+
import { escape } from 'html-escaper';
|
|
4
|
+
import { Logger } from '../utilities/Logger.js';
|
|
5
|
+
import { getRawAudioDuration } from '../audio/AudioUtilities.js';
|
|
6
|
+
export async function synthesize(text, subscriptionKey, serviceRegion, languageCode = "en-US", voice = "Microsoft Server Speech Text to Speech Voice (en-US, AriaNeural)", ssmlEnabled = false, ssmlPitchString = "+0Hz", ssmlRateString = "+0%") {
|
|
7
|
+
return new Promise((resolve, reject) => {
|
|
8
|
+
const logger = new Logger();
|
|
9
|
+
logger.start("Request synthesis from Azure Cognitive Services");
|
|
10
|
+
const speechConfig = SpeechSDK.SpeechConfig.fromSubscription(subscriptionKey, serviceRegion);
|
|
11
|
+
speechConfig.speechSynthesisLanguage = languageCode;
|
|
12
|
+
speechConfig.speechSynthesisVoiceName = voice;
|
|
13
|
+
speechConfig.speechSynthesisOutputFormat = SpeechSDK.SpeechSynthesisOutputFormat.Ogg24Khz16BitMonoOpus;
|
|
14
|
+
const audioOutputStream = SpeechSDK.AudioOutputStream.createPullStream();
|
|
15
|
+
const audioConfig = SpeechSDK.AudioConfig.fromStreamOutput(audioOutputStream);
|
|
16
|
+
const synthesis = new SpeechSDK.SpeechSynthesizer(speechConfig, audioConfig);
|
|
17
|
+
const events = [];
|
|
18
|
+
synthesis.wordBoundary = (sender, event) => {
|
|
19
|
+
events.push(event);
|
|
20
|
+
};
|
|
21
|
+
const onResult = async (result) => {
|
|
22
|
+
if (result.errorDetails != null) {
|
|
23
|
+
reject(result.errorDetails);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
/*
|
|
27
|
+
const bufferSize = 2 ** 16
|
|
28
|
+
const buffers: Buffer[] = []
|
|
29
|
+
|
|
30
|
+
while (true) {
|
|
31
|
+
|
|
32
|
+
const buffer = Buffer.alloc(bufferSize)
|
|
33
|
+
const amountRead = await audioOutputStream.read(buffer)
|
|
34
|
+
|
|
35
|
+
if (amountRead == 0) {
|
|
36
|
+
audioOutputStream.close()
|
|
37
|
+
break
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
buffers.push(buffer.subarray(0, amountRead))
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const encodedAudio = Buffer.concat(buffers)
|
|
44
|
+
*/
|
|
45
|
+
const encodedAudio = Buffer.from(result.audioData);
|
|
46
|
+
logger.end();
|
|
47
|
+
const rawAudio = await FFMpegTranscoder.decodeToChannels(encodedAudio, 24000, 1);
|
|
48
|
+
logger.start("Convert boundary events to a timeline");
|
|
49
|
+
const timeline = boundaryEventsToTimeline(events, getRawAudioDuration(rawAudio));
|
|
50
|
+
logger.end();
|
|
51
|
+
resolve({ rawAudio, timeline: timeline });
|
|
52
|
+
};
|
|
53
|
+
const onError = (error) => {
|
|
54
|
+
reject(error);
|
|
55
|
+
};
|
|
56
|
+
if (!ssmlEnabled && ssmlPitchString != "+0%" || ssmlRateString != "+0Hz") {
|
|
57
|
+
ssmlEnabled = true;
|
|
58
|
+
text = escape(text);
|
|
59
|
+
}
|
|
60
|
+
if (ssmlEnabled) {
|
|
61
|
+
text =
|
|
62
|
+
`<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US">` +
|
|
63
|
+
`<voice name="${voice}">` +
|
|
64
|
+
`<prosody pitch="${ssmlPitchString}" rate="${ssmlRateString}">` +
|
|
65
|
+
text +
|
|
66
|
+
`</prosody>` +
|
|
67
|
+
`</voice>` +
|
|
68
|
+
`</speak>`;
|
|
69
|
+
synthesis.speakSsmlAsync(text, onResult, onError);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
synthesis.speakTextAsync(text, onResult, onError);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
export async function getVoiceList(subscriptionKey, serviceRegion) {
|
|
77
|
+
const speechConfig = SpeechSDK.SpeechConfig.fromSubscription(subscriptionKey, serviceRegion);
|
|
78
|
+
const synthesis = new SpeechSDK.SpeechSynthesizer(speechConfig, undefined);
|
|
79
|
+
const result = await synthesis.getVoicesAsync();
|
|
80
|
+
return result.voices;
|
|
81
|
+
}
|
|
82
|
+
export function boundaryEventsToTimeline(events, totalDuration) {
|
|
83
|
+
const timeline = [];
|
|
84
|
+
for (const event of events) {
|
|
85
|
+
const boundaryType = event.boundaryType != null ? event.boundaryType : event.Type;
|
|
86
|
+
if (boundaryType != "WordBoundary") {
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
const text = event.text != null ? event.text : event.Data.text.Text;
|
|
90
|
+
const offset = event.audioOffset != null ? event.audioOffset : event.Data.Offset;
|
|
91
|
+
const duration = event.duration != null ? event.duration : event.Data.Duration;
|
|
92
|
+
const startTime = offset / 10000000;
|
|
93
|
+
const endTime = (offset + duration) / 10000000;
|
|
94
|
+
timeline.push({
|
|
95
|
+
type: "word",
|
|
96
|
+
text,
|
|
97
|
+
startTime,
|
|
98
|
+
endTime
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return timeline;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=AzureCognitiveServicesTTS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AzureCognitiveServicesTTS.js","sourceRoot":"","sources":["../../src/synthesis/AzureCognitiveServicesTTS.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,wCAAwC,CAAA;AAE9D,OAAO,KAAK,gBAAgB,MAAM,+BAA+B,CAAA;AAEjE,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAErC,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAE/C,OAAO,EAAY,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAE1E,MAAM,CAAC,KAAK,UAAU,UAAU,CAC/B,IAAY,EACZ,eAAuB,EACvB,aAAqB,EACrB,YAAY,GAAG,OAAO,EACtB,KAAK,GAAG,kEAAkE,EAC1E,WAAW,GAAG,KAAK,EACnB,eAAe,GAAG,MAAM,EACxB,cAAc,GAAG,KAAK;IAEtB,OAAO,IAAI,OAAO,CAA6C,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAClF,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAA;QAC3B,MAAM,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAA;QAE/D,MAAM,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC,gBAAgB,CAAC,eAAe,EAAE,aAAa,CAAC,CAAA;QAE5F,YAAY,CAAC,uBAAuB,GAAG,YAAY,CAAA;QACnD,YAAY,CAAC,wBAAwB,GAAG,KAAK,CAAA;QAC7C,YAAY,CAAC,2BAA2B,GAAG,SAAS,CAAC,2BAA2B,CAAC,qBAAqB,CAAA;QAEtG,MAAM,iBAAiB,GAAG,SAAS,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,CAAA;QAExE,MAAM,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAA;QAE7E,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,iBAAiB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA;QAE5E,MAAM,MAAM,GAAqD,EAAE,CAAA;QAEnE,SAAS,CAAC,YAAY,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAC1C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACnB,CAAC,CAAA;QAED,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAuC,EAAE,EAAE;YAClE,IAAI,MAAM,CAAC,YAAY,IAAI,IAAI,EAAE;gBAChC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;gBAC3B,OAAM;aACN;YAED;;;;;;;;;;;;;;;;;;cAkBE;YAEF,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;YAElD,MAAM,CAAC,GAAG,EAAE,CAAA;YAEZ,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,gBAAgB,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;YAEhF,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAA;YAErD,MAAM,QAAQ,GAAG,wBAAwB,CAAC,MAAM,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAA;YAEhF,MAAM,CAAC,GAAG,EAAE,CAAA;YAEZ,OAAO,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAA;QAC1C,CAAC,CAAA;QAED,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,EAAE;YACjC,MAAM,CAAC,KAAK,CAAC,CAAA;QACd,CAAC,CAAA;QAED,IAAI,CAAC,WAAW,IAAI,eAAe,IAAI,KAAK,IAAI,cAAc,IAAI,MAAM,EAAE;YACzE,WAAW,GAAG,IAAI,CAAA;YAClB,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;SACnB;QAED,IAAI,WAAW,EAAE;YAChB,IAAI;gBACH,oFAAoF;oBACpF,gBAAgB,KAAK,IAAI;oBACzB,mBAAmB,eAAe,WAAW,cAAc,IAAI;oBAC/D,IAAI;oBACJ,YAAY;oBACZ,UAAU;oBACV,UAAU,CAAA;YAEX,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;SACjD;aAAM;YACN,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;SACjD;IACF,CAAC,CAAC,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,eAAuB,EAAE,aAAqB;IAChF,MAAM,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC,gBAAgB,CAAC,eAAe,EAAE,aAAa,CAAC,CAAA;IAE5F,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,iBAAiB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAA;IAE1E,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,cAAc,EAAE,CAAA;IAE/C,OAAO,MAAM,CAAC,MAAM,CAAA;AACrB,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,MAAa,EAAE,aAAqB;IAC5E,MAAM,QAAQ,GAAa,EAAE,CAAA;IAE7B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;QAC3B,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAA;QAEjF,IAAI,YAAY,IAAI,cAAc,EAAE;YACnC,SAAQ;SACR;QAED,MAAM,IAAI,GAAW,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;QAC3E,MAAM,MAAM,GAAW,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAA;QACxF,MAAM,QAAQ,GAAW,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAA;QAEtF,MAAM,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAA;QACnC,MAAM,OAAO,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,QAAQ,CAAA;QAE9C,QAAQ,CAAC,IAAI,CAAC;YACb,IAAI,EAAE,MAAM;YACZ,IAAI;YACJ,SAAS;YACT,OAAO;SACP,CAAC,CAAA;KACF;IAED,OAAO,QAAQ,CAAA;AAChB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { request } from "gaxios";
|
|
2
|
+
import { decodeWaveBuffer } from "../audio/AudioUtilities.js";
|
|
3
|
+
import { Logger } from "../utilities/Logger.js";
|
|
4
|
+
import { logToStderr } from "../utilities/Utilities.js";
|
|
5
|
+
const log = logToStderr;
|
|
6
|
+
export async function synthesize(text, speakerId, serverURL = "http://[::1]:5002") {
|
|
7
|
+
const logger = new Logger();
|
|
8
|
+
logger.start("Request synthesis from Coqui Server");
|
|
9
|
+
const response = await request({
|
|
10
|
+
url: `${serverURL}/api/tts`,
|
|
11
|
+
params: {
|
|
12
|
+
"text": text,
|
|
13
|
+
"speaker_id": speakerId
|
|
14
|
+
},
|
|
15
|
+
responseType: "arraybuffer"
|
|
16
|
+
});
|
|
17
|
+
const waveData = Buffer.from(response.data);
|
|
18
|
+
const rawAudio = decodeWaveBuffer(waveData).rawAudio;
|
|
19
|
+
logger.end();
|
|
20
|
+
return { rawAudio };
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=CoquiServerTTS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CoquiServerTTS.js","sourceRoot":"","sources":["../../src/synthesis/CoquiServerTTS.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,MAAM,GAAG,GAAG,WAAW,CAAA;AAEvB,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,SAAwB,EAAE,SAAS,GAAG,mBAAmB;IACvG,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAA;IAC3B,MAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAA;IAEnD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAS;QACtC,GAAG,EAAE,GAAG,SAAS,UAAU;QAE3B,MAAM,EAAE;YACP,MAAM,EAAE,IAAI;YACZ,YAAY,EAAE,SAAS;SACvB;QAED,YAAY,EAAE,aAAa;KAC3B,CAAC,CAAA;IAEF,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IAE3C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAA;IAEpD,MAAM,CAAC,GAAG,EAAE,CAAA;IAEZ,OAAO,EAAE,QAAQ,EAAE,CAAA;AACpB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { SynthesisVoice } from "../api/API.js";
|
|
2
|
+
export declare function synthesize(text: string, voiceId: string, apiKey: string, stability?: number, similarityBoost?: number): Promise<{
|
|
3
|
+
rawAudio: {
|
|
4
|
+
audioChannels: Float32Array[];
|
|
5
|
+
sampleRate: number;
|
|
6
|
+
};
|
|
7
|
+
}>;
|
|
8
|
+
export declare function getVoiceList(): Promise<SynthesisVoice[]>;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { request } from "gaxios";
|
|
2
|
+
import * as FFMpegTranscoder from "../codecs/FFMpegTranscoder.js";
|
|
3
|
+
import { Logger } from "../utilities/Logger.js";
|
|
4
|
+
import { logToStderr } from "../utilities/Utilities.js";
|
|
5
|
+
const log = logToStderr;
|
|
6
|
+
export async function synthesize(text, voiceId, apiKey, stability = 0, similarityBoost = 0) {
|
|
7
|
+
const logger = new Logger();
|
|
8
|
+
logger.start("Request synthesis from ElevenLabs");
|
|
9
|
+
const response = await request({
|
|
10
|
+
url: `https://api.elevenlabs.io/v1/text-to-speech/${voiceId}`,
|
|
11
|
+
method: "POST",
|
|
12
|
+
data: {
|
|
13
|
+
text,
|
|
14
|
+
voice_setting: {
|
|
15
|
+
stability,
|
|
16
|
+
similarity_boost: similarityBoost
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
headers: {
|
|
20
|
+
"dnt": "1",
|
|
21
|
+
"xi-api-key": apiKey,
|
|
22
|
+
},
|
|
23
|
+
responseType: "arraybuffer"
|
|
24
|
+
});
|
|
25
|
+
logger.start("Decode synthesized audio");
|
|
26
|
+
const rawAudio = await FFMpegTranscoder.decodeToChannels(Buffer.from(response.data));
|
|
27
|
+
logger.end();
|
|
28
|
+
return { rawAudio };
|
|
29
|
+
}
|
|
30
|
+
export async function getVoiceList() {
|
|
31
|
+
const response = await request({
|
|
32
|
+
method: "GET",
|
|
33
|
+
url: "https://api.elevenlabs.io/v1/voices",
|
|
34
|
+
headers: {
|
|
35
|
+
"dnt": "1",
|
|
36
|
+
},
|
|
37
|
+
responseType: "json"
|
|
38
|
+
});
|
|
39
|
+
const elevenLabsVoices = response.data.voices;
|
|
40
|
+
const voices = elevenLabsVoices.map(elevenLabsVoice => ({
|
|
41
|
+
name: elevenLabsVoice.name,
|
|
42
|
+
languages: ['en-US', 'en'],
|
|
43
|
+
gender: "unknown",
|
|
44
|
+
elevenLabsVoiceId: elevenLabsVoice.voice_id
|
|
45
|
+
}));
|
|
46
|
+
return voices;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=ElevenLabsTTS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ElevenLabsTTS.js","sourceRoot":"","sources":["../../src/synthesis/ElevenLabsTTS.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAEhC,OAAO,KAAK,gBAAgB,MAAM,+BAA+B,CAAA;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAEvD,MAAM,GAAG,GAAG,WAAW,CAAA;AAEvB,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,OAAe,EAAE,MAAc,EAAE,SAAS,GAAG,CAAC,EAAE,eAAe,GAAG,CAAC;IACjH,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAA;IAC3B,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAA;IAEjD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAM;QACnC,GAAG,EAAE,+CAA+C,OAAO,EAAE;QAE7D,MAAM,EAAE,MAAM;QAEd,IAAI,EAAE;YACL,IAAI;YAEJ,aAAa,EAAE;gBACd,SAAS;gBACT,gBAAgB,EAAE,eAAe;aACjC;SACD;QAED,OAAO,EAAE;YACR,KAAK,EAAE,GAAG;YACV,YAAY,EAAE,MAAM;SACpB;QAED,YAAY,EAAE,aAAa;KAC3B,CAAC,CAAA;IAEF,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAA;IACxC,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;IAEpF,MAAM,CAAC,GAAG,EAAE,CAAA;IAEZ,OAAO,EAAE,QAAQ,EAAE,CAAA;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IACjC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAM;QACnC,MAAM,EAAE,KAAK;QAEb,GAAG,EAAE,qCAAqC;QAC1C,OAAO,EAAE;YACR,KAAK,EAAE,GAAG;SACV;QAED,YAAY,EAAE,MAAM;KACpB,CAAC,CAAA;IAEF,MAAM,gBAAgB,GAAU,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAA;IAEpD,MAAM,MAAM,GAAqB,gBAAgB,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QACzE,IAAI,EAAE,eAAe,CAAC,IAAI;QAC1B,SAAS,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC;QAC1B,MAAM,EAAE,SAAS;QAEjB,iBAAiB,EAAE,eAAe,CAAC,QAAQ;KAC3C,CAAC,CAAC,CAAA;IAEH,OAAO,MAAM,CAAA;AACd,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { RawAudio } from "../audio/AudioUtilities.js";
|
|
2
|
+
import { Lexicon } from "../nlp/Lexicon.js";
|
|
3
|
+
import { Timeline } from "../utilities/Timeline.js";
|
|
4
|
+
export declare function synthesize(text: string, ssmlEnabled: boolean): Promise<{
|
|
5
|
+
rawAudio: RawAudio;
|
|
6
|
+
events: EspeakEvent[];
|
|
7
|
+
}>;
|
|
8
|
+
export declare function preprocessAndSynthesizeSentence(sentence: string, espeakVoice: string, lexicons?: Lexicon[], normalize?: boolean, rate?: number, pitch?: number, pitchRange?: number): Promise<{
|
|
9
|
+
referenceSynthesizedAudio: RawAudio;
|
|
10
|
+
referenceTimeline: Timeline;
|
|
11
|
+
fragments: string[];
|
|
12
|
+
preprocessedFragments: string[];
|
|
13
|
+
phonemizedFragmentsSubstitutions: Map<number, string[]>;
|
|
14
|
+
phonemizedSentence: string[][][];
|
|
15
|
+
}>;
|
|
16
|
+
export declare function synthesizeFragments(fragments: string[], voice: string, insertSeparators?: boolean, rate?: number, pitch?: number, pitchRange?: number): Promise<{
|
|
17
|
+
rawAudio: RawAudio;
|
|
18
|
+
timeline: Timeline;
|
|
19
|
+
events: EspeakEvent[];
|
|
20
|
+
}>;
|
|
21
|
+
export declare function textToIPA(text: string, voice: string): Promise<string>;
|
|
22
|
+
export declare function textToPhonemes(text: string, voice: string, useIPA?: boolean): Promise<string>;
|
|
23
|
+
export declare function setVoice(voiceId: string): Promise<void>;
|
|
24
|
+
export declare function setVolume(volume: number): Promise<any>;
|
|
25
|
+
export declare function setRate(rate: number): Promise<any>;
|
|
26
|
+
export declare function setPitch(pitch: number): Promise<any>;
|
|
27
|
+
export declare function setPitchRange(pitchRange: number): Promise<any>;
|
|
28
|
+
export declare function getSampleRate(): Promise<22050>;
|
|
29
|
+
export declare function listVoices(): Promise<{
|
|
30
|
+
identifier: string;
|
|
31
|
+
name: string;
|
|
32
|
+
languages: {
|
|
33
|
+
priority: number;
|
|
34
|
+
name: string;
|
|
35
|
+
}[];
|
|
36
|
+
}[]>;
|
|
37
|
+
export type EspeakEventType = "sentence" | "word" | "phoneme" | "end" | "mark" | "play" | "msg_terminated" | "list_terminated" | "samplerate";
|
|
38
|
+
export interface EspeakEvent {
|
|
39
|
+
audio_position: number;
|
|
40
|
+
type: EspeakEventType;
|
|
41
|
+
text_position: number;
|
|
42
|
+
word_length: number;
|
|
43
|
+
id?: string | number;
|
|
44
|
+
}
|
|
45
|
+
export declare function testEspeakSynthesisWithPrePhonemizedInputs(text: string): Promise<void>;
|
|
46
|
+
export declare function testKirshenbaumPhonemization(text: string): Promise<void>;
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
import { concatFloat32Arrays, logToStderr, objToString } from "../utilities/Utilities.js";
|
|
2
|
+
import { int16PcmToFloat32 } from "../audio/AudioBufferConversion.js";
|
|
3
|
+
import { Logger } from '../utilities/Logger.js';
|
|
4
|
+
import { WasmMemoryManager } from "../utilities/WasmMemoryManager.js";
|
|
5
|
+
import { getEmptyRawAudio } from "../audio/AudioUtilities.js";
|
|
6
|
+
import { playAudioWithTimelinePhones } from "../audio/AudioPlayer.js";
|
|
7
|
+
import * as CompromiseNLP from "../nlp/CompromiseNLP.js";
|
|
8
|
+
import { getNormalizationMapForSpeech } from "../nlp/TextNormalizer.js";
|
|
9
|
+
import { ipaPhoneToKirshenbaum } from "../nlp/PhoneConversion.js";
|
|
10
|
+
import { splitToWords } from "../nlp/Segmentation.js";
|
|
11
|
+
import { phonemizeSentence } from "../nlp/EspeakPhonemizer.js";
|
|
12
|
+
const log = logToStderr;
|
|
13
|
+
let espeakInstance;
|
|
14
|
+
let espeakModule;
|
|
15
|
+
export async function synthesize(text, ssmlEnabled) {
|
|
16
|
+
const logger = new Logger();
|
|
17
|
+
logger.start("Get espeak WASM instance");
|
|
18
|
+
if (!ssmlEnabled) {
|
|
19
|
+
const { escape } = await import('html-escaper');
|
|
20
|
+
text = escape(text);
|
|
21
|
+
}
|
|
22
|
+
const { instance } = await getEspeakInstance();
|
|
23
|
+
const sampleChunks = [];
|
|
24
|
+
const allEvents = [];
|
|
25
|
+
logger.start("Synthesize with espeak");
|
|
26
|
+
instance.synthesize(text, (samples, events) => {
|
|
27
|
+
if (samples && samples.length > 0) {
|
|
28
|
+
sampleChunks.push(int16PcmToFloat32(samples));
|
|
29
|
+
}
|
|
30
|
+
for (const event of events) {
|
|
31
|
+
if (event.type == "word") {
|
|
32
|
+
const textPosition = event.text_position - 1;
|
|
33
|
+
event["text"] = text.substring(textPosition, textPosition + event.word_length);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
allEvents.push(...events);
|
|
37
|
+
});
|
|
38
|
+
const concatenatedSamples = concatFloat32Arrays(sampleChunks);
|
|
39
|
+
const rawAudio = { audioChannels: [concatenatedSamples], sampleRate: 22050 };
|
|
40
|
+
logger.end();
|
|
41
|
+
return { rawAudio, events: allEvents };
|
|
42
|
+
}
|
|
43
|
+
export async function preprocessAndSynthesizeSentence(sentence, espeakVoice, lexicons = [], normalize = true, rate = 150, pitch = 50, pitchRange = 50) {
|
|
44
|
+
const logger = new Logger();
|
|
45
|
+
await logger.startAsync("Tokenize and analyze text");
|
|
46
|
+
let fragments;
|
|
47
|
+
let preprocessedFragments;
|
|
48
|
+
const phonemizedFragmentsSubstitutions = new Map();
|
|
49
|
+
if (espeakVoice == "en-us") {
|
|
50
|
+
fragments = [];
|
|
51
|
+
preprocessedFragments = [];
|
|
52
|
+
const parsedSentences = await CompromiseNLP.parse(sentence);
|
|
53
|
+
const terms = parsedSentences.flatMap(s => s);
|
|
54
|
+
const normalizationMap = getNormalizationMapForSpeech(terms, espeakVoice);
|
|
55
|
+
for (let termIndex = 0; termIndex < terms.length; termIndex++) {
|
|
56
|
+
const term = terms[termIndex];
|
|
57
|
+
const trimmedPreText = term.preText.trim();
|
|
58
|
+
if (trimmedPreText != "") {
|
|
59
|
+
fragments.push(trimmedPreText);
|
|
60
|
+
preprocessedFragments.push(trimmedPreText);
|
|
61
|
+
}
|
|
62
|
+
const termText = term.text;
|
|
63
|
+
if (termText != "") {
|
|
64
|
+
const substitutionPhonemes = CompromiseNLP.tryMatchInLexicons(term, lexicons, espeakVoice);
|
|
65
|
+
if (substitutionPhonemes) {
|
|
66
|
+
phonemizedFragmentsSubstitutions.set(fragments.length, substitutionPhonemes);
|
|
67
|
+
const referenceIPA = (await textToPhonemes(term.text, espeakVoice, true)).replaceAll("_", " ");
|
|
68
|
+
const referenceKirshenbaum = (await textToPhonemes(term.text, espeakVoice, false)).replaceAll("_", "");
|
|
69
|
+
logger.log(`\nSubstitution references: Target IPA: ${substitutionPhonemes.join(" ")}, IPA: ${referenceIPA}, Kirshenbaum: ${referenceKirshenbaum}`);
|
|
70
|
+
const kirshenbaumPhonemes = substitutionPhonemes.map(phone => ipaPhoneToKirshenbaum(phone)).join("");
|
|
71
|
+
logger.log(`Kirshenbaum conversion result: ${kirshenbaumPhonemes}`);
|
|
72
|
+
const substitutionPhonemesFragment = ` [[${kirshenbaumPhonemes}]] `;
|
|
73
|
+
preprocessedFragments.push(substitutionPhonemesFragment);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
let normalizedFragment = undefined;
|
|
77
|
+
if (normalize) {
|
|
78
|
+
normalizedFragment = normalizationMap.get(termIndex);
|
|
79
|
+
}
|
|
80
|
+
if (normalizedFragment) {
|
|
81
|
+
preprocessedFragments.push(normalizedFragment);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
preprocessedFragments.push(termText);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
fragments.push(termText);
|
|
88
|
+
}
|
|
89
|
+
const trimmedPostText = term.postText.trim();
|
|
90
|
+
if (trimmedPostText != "") {
|
|
91
|
+
fragments.push(trimmedPostText);
|
|
92
|
+
preprocessedFragments.push(trimmedPostText);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
fragments = (await splitToWords(sentence, espeakVoice)).filter(word => word.trim() != "");
|
|
98
|
+
preprocessedFragments = fragments;
|
|
99
|
+
}
|
|
100
|
+
logger.start("Synthesize preprocessed fragments with Espeak");
|
|
101
|
+
const { rawAudio: referenceSynthesizedAudio, timeline: referenceTimeline } = await synthesizeFragments(preprocessedFragments, espeakVoice, false);
|
|
102
|
+
await logger.startAsync("Build phonemized tokens");
|
|
103
|
+
const phonemizedSentence = [];
|
|
104
|
+
let wordIndex = 0;
|
|
105
|
+
for (const phraseEntry of referenceTimeline) {
|
|
106
|
+
const phrase = [];
|
|
107
|
+
for (const wordEntry of phraseEntry.timeline) {
|
|
108
|
+
wordEntry.text = fragments[wordIndex];
|
|
109
|
+
if (phonemizedFragmentsSubstitutions.has(wordIndex)) {
|
|
110
|
+
phrase.push(phonemizedFragmentsSubstitutions.get(wordIndex));
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
for (const tokenEntry of wordEntry.timeline) {
|
|
114
|
+
const tokenPhonemes = [];
|
|
115
|
+
for (const phoneme of tokenEntry.timeline) {
|
|
116
|
+
if (phoneme.text) {
|
|
117
|
+
tokenPhonemes.push(phoneme.text);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (tokenPhonemes.length > 0) {
|
|
121
|
+
phrase.push(tokenPhonemes);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
wordIndex += 1;
|
|
126
|
+
}
|
|
127
|
+
if (phrase.length > 0) {
|
|
128
|
+
phonemizedSentence.push(phrase);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
logger.log(phonemizedSentence.map(phrase => phrase.map(word => word.join(" ")).join(" | ")).join(" || "));
|
|
132
|
+
logger.end();
|
|
133
|
+
return { referenceSynthesizedAudio, referenceTimeline, fragments, preprocessedFragments, phonemizedFragmentsSubstitutions, phonemizedSentence };
|
|
134
|
+
}
|
|
135
|
+
export async function synthesizeFragments(fragments, voice, insertSeparators = false, rate = 150, pitch = 50, pitchRange = 50) {
|
|
136
|
+
const logger = new Logger();
|
|
137
|
+
await setVoice(voice);
|
|
138
|
+
await setRate(rate);
|
|
139
|
+
await setPitch(pitch);
|
|
140
|
+
await setPitchRange(pitchRange);
|
|
141
|
+
const sampleRate = await getSampleRate();
|
|
142
|
+
//fragments = fragments.filter(fragment => fragment.trim() != "")
|
|
143
|
+
if (fragments.length == 0) {
|
|
144
|
+
return {
|
|
145
|
+
rawAudio: getEmptyRawAudio(1, sampleRate),
|
|
146
|
+
timeline: [],
|
|
147
|
+
events: []
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
const { escape } = await import('html-escaper');
|
|
151
|
+
let textWithMarkers = '';
|
|
152
|
+
for (let i = 0; i < fragments.length; i++) {
|
|
153
|
+
//let fragment = escape(fragments[i])
|
|
154
|
+
let fragment = fragments[i];
|
|
155
|
+
if (insertSeparators) {
|
|
156
|
+
textWithMarkers += `<mark name="wordstart-${i}"/> | ${fragment} | <mark name="wordend-${i}"/>`;
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
if (fragment.endsWith(".")) {
|
|
160
|
+
fragment += " ()";
|
|
161
|
+
}
|
|
162
|
+
textWithMarkers += `<mark name="wordstart-${i}"/>${fragment}<mark name="wordend-${i}"/> `;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
//log(textWithMarkers)
|
|
166
|
+
const { rawAudio, events } = await synthesize(textWithMarkers, true);
|
|
167
|
+
const timeline = fragments.map(word => ({
|
|
168
|
+
type: "word",
|
|
169
|
+
text: word,
|
|
170
|
+
startTime: -1,
|
|
171
|
+
endTime: -1,
|
|
172
|
+
timeline: [{
|
|
173
|
+
type: "token",
|
|
174
|
+
text: "",
|
|
175
|
+
startTime: -1,
|
|
176
|
+
endTime: -1,
|
|
177
|
+
timeline: []
|
|
178
|
+
}]
|
|
179
|
+
}));
|
|
180
|
+
let wordIndex = 0;
|
|
181
|
+
const clauseEndIndexes = [];
|
|
182
|
+
for (const event of events) {
|
|
183
|
+
const eventTime = event.audio_position / 1000;
|
|
184
|
+
const currentWordEntry = timeline[wordIndex];
|
|
185
|
+
const currentSubwordTimeline = currentWordEntry.timeline;
|
|
186
|
+
const currentSubwordEntry = currentSubwordTimeline[currentSubwordTimeline.length - 1];
|
|
187
|
+
const currentPhoneTimeline = currentSubwordEntry.timeline;
|
|
188
|
+
const lastPhoneEntry = currentPhoneTimeline[currentPhoneTimeline.length - 1];
|
|
189
|
+
if (lastPhoneEntry && lastPhoneEntry.endTime == -1) {
|
|
190
|
+
lastPhoneEntry.endTime = eventTime;
|
|
191
|
+
}
|
|
192
|
+
if (event.type == "word") {
|
|
193
|
+
if (!event.id || currentPhoneTimeline.length == 0) {
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
if (currentSubwordEntry.endTime == -1) {
|
|
197
|
+
currentSubwordEntry.endTime = eventTime;
|
|
198
|
+
}
|
|
199
|
+
currentSubwordTimeline.push({
|
|
200
|
+
type: "token",
|
|
201
|
+
text: "",
|
|
202
|
+
startTime: eventTime,
|
|
203
|
+
endTime: -1,
|
|
204
|
+
timeline: []
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
else if (event.type == "phoneme") {
|
|
208
|
+
const phoneText = event.id;
|
|
209
|
+
if (!phoneText || phoneText.startsWith("(")) {
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
currentPhoneTimeline.push({
|
|
213
|
+
type: "phone",
|
|
214
|
+
text: phoneText,
|
|
215
|
+
startTime: eventTime,
|
|
216
|
+
endTime: -1
|
|
217
|
+
});
|
|
218
|
+
currentSubwordEntry.text += phoneText;
|
|
219
|
+
currentSubwordEntry.startTime = currentPhoneTimeline[0].startTime;
|
|
220
|
+
}
|
|
221
|
+
else if (event.type == "mark") {
|
|
222
|
+
const markerName = event.id;
|
|
223
|
+
if (markerName.startsWith("wordstart-")) {
|
|
224
|
+
const markerIndex = parseInt(markerName.substring(10));
|
|
225
|
+
if (markerIndex != wordIndex) {
|
|
226
|
+
throw new Error(`Word start marker for index ${wordIndex} is not consistent with word index. The words were: ${objToString(fragments)}`);
|
|
227
|
+
}
|
|
228
|
+
if (currentPhoneTimeline.length > 0) {
|
|
229
|
+
throw new Error(`Word entry ${wordIndex} already has phones before its start marker was seen. The words were: ${objToString(fragments)}`);
|
|
230
|
+
}
|
|
231
|
+
currentWordEntry.startTime = eventTime;
|
|
232
|
+
currentSubwordEntry.startTime = eventTime;
|
|
233
|
+
}
|
|
234
|
+
else if (markerName.startsWith("wordend-")) {
|
|
235
|
+
const markerIndex = parseInt(markerName.substring(8));
|
|
236
|
+
if (markerIndex != wordIndex) {
|
|
237
|
+
throw new Error(`Word end marker for index ${wordIndex} is not consistent with word index. The words were: ${objToString(fragments)}`);
|
|
238
|
+
}
|
|
239
|
+
currentWordEntry.startTime = currentSubwordTimeline[0].startTime;
|
|
240
|
+
currentWordEntry.endTime = eventTime;
|
|
241
|
+
currentSubwordEntry.endTime = eventTime;
|
|
242
|
+
wordIndex += 1;
|
|
243
|
+
if (wordIndex == timeline.length) {
|
|
244
|
+
break;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
else if (event.type == "end") {
|
|
252
|
+
clauseEndIndexes.push(wordIndex);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
clauseEndIndexes.push(timeline.length);
|
|
256
|
+
const timelineWithClauses = [];
|
|
257
|
+
let clauseStartIndex = 0;
|
|
258
|
+
for (const clauseEndIndex of clauseEndIndexes) {
|
|
259
|
+
const newClause = {
|
|
260
|
+
type: "clause",
|
|
261
|
+
text: "",
|
|
262
|
+
startTime: -1,
|
|
263
|
+
endTime: -1,
|
|
264
|
+
timeline: []
|
|
265
|
+
};
|
|
266
|
+
for (let entryIndex = clauseStartIndex; entryIndex <= clauseEndIndex && entryIndex < timeline.length; entryIndex++) {
|
|
267
|
+
const wordEntry = timeline[entryIndex];
|
|
268
|
+
if (newClause.startTime == -1) {
|
|
269
|
+
newClause.startTime = wordEntry.startTime;
|
|
270
|
+
}
|
|
271
|
+
newClause.endTime = wordEntry.endTime;
|
|
272
|
+
newClause.text += `${wordEntry.text} `;
|
|
273
|
+
newClause.timeline.push(wordEntry);
|
|
274
|
+
}
|
|
275
|
+
if (newClause.timeline.length > 0) {
|
|
276
|
+
timelineWithClauses.push(newClause);
|
|
277
|
+
clauseStartIndex = clauseEndIndex + 1;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
return { rawAudio, timeline: timelineWithClauses, events };
|
|
281
|
+
}
|
|
282
|
+
export async function textToIPA(text, voice) {
|
|
283
|
+
await setVoice(voice);
|
|
284
|
+
const { instance } = await getEspeakInstance();
|
|
285
|
+
const ipa = instance.synthesize_ipa(text).ipa.trim();
|
|
286
|
+
return ipa;
|
|
287
|
+
}
|
|
288
|
+
export async function textToPhonemes(text, voice, useIPA = true) {
|
|
289
|
+
await setVoice(voice);
|
|
290
|
+
const { instance, module } = await getEspeakInstance();
|
|
291
|
+
const textPtr = instance.convert_to_phonemes(text, useIPA);
|
|
292
|
+
const wasmMemory = new WasmMemoryManager(module);
|
|
293
|
+
const resultRef = wasmMemory.wrapNullTerminatedUtf8String(textPtr.ptr);
|
|
294
|
+
const result = resultRef.getValue();
|
|
295
|
+
wasmMemory.freeAll();
|
|
296
|
+
return result;
|
|
297
|
+
}
|
|
298
|
+
export async function setVoice(voiceId) {
|
|
299
|
+
const { instance } = await getEspeakInstance();
|
|
300
|
+
instance.set_voice(voiceId);
|
|
301
|
+
}
|
|
302
|
+
export async function setVolume(volume) {
|
|
303
|
+
const { instance } = await getEspeakInstance();
|
|
304
|
+
return instance.setVolume(volume);
|
|
305
|
+
}
|
|
306
|
+
export async function setRate(rate) {
|
|
307
|
+
const { instance } = await getEspeakInstance();
|
|
308
|
+
return instance.set_rate(rate);
|
|
309
|
+
}
|
|
310
|
+
export async function setPitch(pitch) {
|
|
311
|
+
const { instance } = await getEspeakInstance();
|
|
312
|
+
return instance.set_pitch(pitch);
|
|
313
|
+
}
|
|
314
|
+
export async function setPitchRange(pitchRange) {
|
|
315
|
+
const { instance } = await getEspeakInstance();
|
|
316
|
+
return instance.set_range(pitchRange);
|
|
317
|
+
}
|
|
318
|
+
export async function getSampleRate() {
|
|
319
|
+
return 22050;
|
|
320
|
+
}
|
|
321
|
+
export async function listVoices() {
|
|
322
|
+
const { instance } = await getEspeakInstance();
|
|
323
|
+
const voiceList = instance.list_voices();
|
|
324
|
+
return voiceList;
|
|
325
|
+
}
|
|
326
|
+
async function getEspeakInstance() {
|
|
327
|
+
if (!espeakInstance) {
|
|
328
|
+
const { default: EspeakInitializer } = await import('@echogarden/espeak-ng-emscripten');
|
|
329
|
+
const m = await EspeakInitializer();
|
|
330
|
+
espeakInstance = await (new m.eSpeakNGWorker());
|
|
331
|
+
espeakModule = m;
|
|
332
|
+
}
|
|
333
|
+
return { instance: espeakInstance, module: espeakModule };
|
|
334
|
+
}
|
|
335
|
+
export async function testEspeakSynthesisWithPrePhonemizedInputs(text) {
|
|
336
|
+
const ipaPhonemizedSentence = (await phonemizeSentence(text, "en-us")).flatMap(clause => clause);
|
|
337
|
+
const kirshenbaumPhonemizedSentence = (await phonemizeSentence(text, "en-us", undefined, false)).flatMap(clause => clause);
|
|
338
|
+
log(kirshenbaumPhonemizedSentence);
|
|
339
|
+
const fragments = ipaPhonemizedSentence.map(word => word.map(phoneme => ipaPhoneToKirshenbaum(phoneme)).join("")).map(word => ` [[${word}]] `);
|
|
340
|
+
const { rawAudio, timeline } = await synthesizeFragments(fragments, 'en-us');
|
|
341
|
+
await playAudioWithTimelinePhones(rawAudio, timeline);
|
|
342
|
+
}
|
|
343
|
+
export async function testKirshenbaumPhonemization(text) {
|
|
344
|
+
const ipaPhonemizedSentence = (await phonemizeSentence(text, "en-us")).flatMap(clause => clause);
|
|
345
|
+
const kirshenbaumPhonemizedSentence = (await phonemizeSentence(text, "en-us", undefined, false)).flatMap(clause => clause);
|
|
346
|
+
const ipaFragments = ipaPhonemizedSentence.map(word => word.join(""));
|
|
347
|
+
const kirshenbaumFragments = kirshenbaumPhonemizedSentence.map(word => word.join(""));
|
|
348
|
+
const fragments = ipaPhonemizedSentence.map(word => word.map(phoneme => ipaPhoneToKirshenbaum(phoneme)).join(""));
|
|
349
|
+
for (let i = 0; i < fragments.length; i++) {
|
|
350
|
+
log(`IPA: ${ipaFragments[i]} | converted: ${fragments[i]} | ground truth: ${kirshenbaumFragments[i]}`);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
//# sourceMappingURL=EspeakTTS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EspeakTTS.js","sourceRoot":"","sources":["../../src/synthesis/EspeakTTS.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { SynthesisVoice } from "../api/API.js";
|
|
2
|
+
export type FliteVoiceName = "kal" | "kal16" | "awb" | "rms" | "slt" | string;
|
|
3
|
+
export declare function synthesize(text: string, voice: FliteVoiceName, voiceDir: string | undefined, rate: number, pitchMeanHz?: number, pitchStdDev?: number): Promise<{
|
|
4
|
+
rawAudio: {
|
|
5
|
+
audioChannels: Float32Array[];
|
|
6
|
+
sampleRate: number;
|
|
7
|
+
};
|
|
8
|
+
events: FliteEvent[];
|
|
9
|
+
}>;
|
|
10
|
+
export type FliteEventType = "phone" | "pause" | "phrasePause";
|
|
11
|
+
export type FliteEvent = {
|
|
12
|
+
type: FliteEventType;
|
|
13
|
+
id: string;
|
|
14
|
+
startTime: number;
|
|
15
|
+
endTime: number;
|
|
16
|
+
};
|
|
17
|
+
export declare const voices: SynthesisVoice[];
|