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
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { ensureRawAudio } from '../audio/AudioUtilities.js';
|
|
2
|
+
import { SynthesisVoice } from '../api/Synthesis.js';
|
|
3
|
+
import { Logger } from '../utilities/Logger.js';
|
|
4
|
+
import { extendDeep } from '../utilities/ObjectUtilities.js';
|
|
5
|
+
|
|
6
|
+
export async function synthesize(text: string, voice: string, speed: number, options: OpenAICloudTTSOptions) {
|
|
7
|
+
const logger = new Logger()
|
|
8
|
+
|
|
9
|
+
logger.start('Request synthesis from OpenAI Cloud API')
|
|
10
|
+
|
|
11
|
+
options = extendDeep(defaultOpenAICloudTTSOptions, options)
|
|
12
|
+
|
|
13
|
+
if (!options.apiKey) {
|
|
14
|
+
throw new Error(`No API key given`)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const { default: OpenAI } = await import('openai')
|
|
18
|
+
|
|
19
|
+
const openai = new OpenAI(options)
|
|
20
|
+
|
|
21
|
+
const result = await openai.audio.speech.create({
|
|
22
|
+
input: text,
|
|
23
|
+
model: options.model!,
|
|
24
|
+
voice: voice as any,
|
|
25
|
+
response_format: 'opus',
|
|
26
|
+
speed,
|
|
27
|
+
}, {
|
|
28
|
+
maxRetries: 10
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
const resultBuffer = await result.buffer()
|
|
32
|
+
|
|
33
|
+
logger.start('Decode returned audio')
|
|
34
|
+
const resultRawAudio = ensureRawAudio(resultBuffer)
|
|
35
|
+
|
|
36
|
+
logger.end()
|
|
37
|
+
|
|
38
|
+
return resultRawAudio
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface OpenAICloudTTSOptions {
|
|
42
|
+
apiKey?: string
|
|
43
|
+
organization?: string
|
|
44
|
+
baseURL?: string
|
|
45
|
+
|
|
46
|
+
model?: 'tts-1' | 'tts-1-hd'
|
|
47
|
+
|
|
48
|
+
timeout?: number
|
|
49
|
+
maxRetries?: number
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export const defaultOpenAICloudTTSOptions: OpenAICloudTTSOptions = {
|
|
53
|
+
apiKey: undefined,
|
|
54
|
+
organization: undefined,
|
|
55
|
+
baseURL: undefined,
|
|
56
|
+
|
|
57
|
+
model: 'tts-1',
|
|
58
|
+
|
|
59
|
+
timeout: undefined,
|
|
60
|
+
maxRetries: 10,
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export const supportedLanguages = [
|
|
64
|
+
'en',
|
|
65
|
+
'zh',
|
|
66
|
+
'de',
|
|
67
|
+
'es',
|
|
68
|
+
'ru',
|
|
69
|
+
'ko',
|
|
70
|
+
'fr',
|
|
71
|
+
'ja',
|
|
72
|
+
'pt',
|
|
73
|
+
'tr',
|
|
74
|
+
'pl',
|
|
75
|
+
'ca',
|
|
76
|
+
'nl',
|
|
77
|
+
'ar',
|
|
78
|
+
'sv',
|
|
79
|
+
'it',
|
|
80
|
+
'id',
|
|
81
|
+
'hi',
|
|
82
|
+
'fi',
|
|
83
|
+
'vi',
|
|
84
|
+
'iw',
|
|
85
|
+
'uk',
|
|
86
|
+
'el',
|
|
87
|
+
'ms',
|
|
88
|
+
'cs',
|
|
89
|
+
'ro',
|
|
90
|
+
'da',
|
|
91
|
+
'hu',
|
|
92
|
+
'ta',
|
|
93
|
+
'no',
|
|
94
|
+
'th',
|
|
95
|
+
'ur',
|
|
96
|
+
'hr',
|
|
97
|
+
'bg',
|
|
98
|
+
'lt',
|
|
99
|
+
'la',
|
|
100
|
+
'mi',
|
|
101
|
+
'ml',
|
|
102
|
+
'cy',
|
|
103
|
+
'sk',
|
|
104
|
+
'te',
|
|
105
|
+
'fa',
|
|
106
|
+
'lv',
|
|
107
|
+
'bn',
|
|
108
|
+
'sr',
|
|
109
|
+
'az',
|
|
110
|
+
'sl',
|
|
111
|
+
'kn',
|
|
112
|
+
'et',
|
|
113
|
+
'mk',
|
|
114
|
+
'br',
|
|
115
|
+
'eu',
|
|
116
|
+
'is',
|
|
117
|
+
'hy',
|
|
118
|
+
'ne',
|
|
119
|
+
'mn',
|
|
120
|
+
'bs',
|
|
121
|
+
'kk',
|
|
122
|
+
'sq',
|
|
123
|
+
'sw',
|
|
124
|
+
'gl',
|
|
125
|
+
'mr',
|
|
126
|
+
'pa',
|
|
127
|
+
'si',
|
|
128
|
+
'km',
|
|
129
|
+
'sn',
|
|
130
|
+
'yo',
|
|
131
|
+
'so',
|
|
132
|
+
'af',
|
|
133
|
+
'oc',
|
|
134
|
+
'ka',
|
|
135
|
+
'be',
|
|
136
|
+
'tg',
|
|
137
|
+
'sd',
|
|
138
|
+
'gu',
|
|
139
|
+
'am',
|
|
140
|
+
'yi',
|
|
141
|
+
'lo',
|
|
142
|
+
'uz',
|
|
143
|
+
'fo',
|
|
144
|
+
'ht',
|
|
145
|
+
'ps',
|
|
146
|
+
'tk',
|
|
147
|
+
'nn',
|
|
148
|
+
'mt',
|
|
149
|
+
'sa',
|
|
150
|
+
'lb',
|
|
151
|
+
'my',
|
|
152
|
+
'bo',
|
|
153
|
+
'tl',
|
|
154
|
+
'mg',
|
|
155
|
+
'as',
|
|
156
|
+
'tt',
|
|
157
|
+
'haw',
|
|
158
|
+
'ln',
|
|
159
|
+
'ha',
|
|
160
|
+
'ba',
|
|
161
|
+
'jw',
|
|
162
|
+
'su',
|
|
163
|
+
]
|
|
164
|
+
|
|
165
|
+
export const voiceList: SynthesisVoice[] = [
|
|
166
|
+
{
|
|
167
|
+
name: 'alloy',
|
|
168
|
+
languages: ['en-US', ...supportedLanguages],
|
|
169
|
+
gender: 'male',
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
name: 'echo',
|
|
173
|
+
languages: ['en-US', ...supportedLanguages],
|
|
174
|
+
gender: 'male',
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
name: 'fable',
|
|
178
|
+
languages: ['en-GB', ...supportedLanguages],
|
|
179
|
+
gender: 'male',
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
name: 'onyx',
|
|
183
|
+
languages: ['en-US', ...supportedLanguages],
|
|
184
|
+
gender: 'male',
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
name: 'nova',
|
|
188
|
+
languages: ['en-US', ...supportedLanguages],
|
|
189
|
+
gender: 'female',
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
name: 'shimmer',
|
|
193
|
+
languages: ['en-US', ...supportedLanguages],
|
|
194
|
+
gender: 'female',
|
|
195
|
+
},
|
|
196
|
+
]
|
package/src/synthesis/SamTTS.ts
CHANGED
|
@@ -9,17 +9,17 @@ import { Logger } from '../utilities/Logger.js'
|
|
|
9
9
|
|
|
10
10
|
export async function synthesize(text: string, pitch = 64, speed = 72, mouth = 128, throat = 128) {
|
|
11
11
|
const logger = new Logger()
|
|
12
|
-
logger.start(
|
|
12
|
+
logger.start('Initialize sam module')
|
|
13
13
|
|
|
14
14
|
const { default: SamJs } = await import('sam-js')
|
|
15
15
|
|
|
16
16
|
const sam = new SamJs({ pitch, speed, mouth, throat })
|
|
17
17
|
|
|
18
|
-
logger.start(
|
|
18
|
+
logger.start('Synthesize with sam')
|
|
19
19
|
const samples: Float32Array = sam.buf32(text) as Float32Array
|
|
20
20
|
|
|
21
21
|
if (!samples) {
|
|
22
|
-
throw new Error(
|
|
22
|
+
throw new Error('Sam TTS failed')
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
const rawAudio: RawAudio = { audioChannels: [samples], sampleRate: 22050 }
|
package/src/synthesis/SapiTTS.ts
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
import { SynthesisVoice } from
|
|
2
|
-
import { decodeToChannels } from
|
|
3
|
-
import { RawAudio } from
|
|
4
|
-
import { SampleFormat } from
|
|
5
|
-
import { getShortLanguageCode, lcidToIsoLanguageCode } from
|
|
6
|
-
import { Logger } from
|
|
7
|
-
import { Timeline, TimelineEntry } from
|
|
8
|
-
import { logToStderr } from
|
|
1
|
+
import { SynthesisVoice } from '../api/API.js'
|
|
2
|
+
import { decodeToChannels } from '../audio/AudioBufferConversion.js'
|
|
3
|
+
import { RawAudio } from '../audio/AudioUtilities.js'
|
|
4
|
+
import { SampleFormat } from '../codecs/WaveCodec.js'
|
|
5
|
+
import { getShortLanguageCode, lcidToIsoLanguageCode } from '../utilities/Locale.js'
|
|
6
|
+
import { Logger } from '../utilities/Logger.js'
|
|
7
|
+
import { Timeline, TimelineEntry } from '../utilities/Timeline.js'
|
|
8
|
+
import { logToStderr } from '../utilities/Utilities.js'
|
|
9
9
|
|
|
10
10
|
const log = logToStderr
|
|
11
11
|
|
|
12
12
|
export function synthesize(text: string, voiceName: string, rate = 0, useSpeechPlatform = false) {
|
|
13
13
|
return new Promise<{ rawAudio: RawAudio, timeline: Timeline }>(async (resolve, reject) => {
|
|
14
14
|
const logger = new Logger()
|
|
15
|
-
logger.start(
|
|
15
|
+
logger.start('Initialize winax module')
|
|
16
16
|
|
|
17
|
-
const { default: WinAX } = await import(
|
|
17
|
+
const { default: WinAX } = await import('winax')
|
|
18
18
|
|
|
19
19
|
const ActiveXObject = (global as any).ActiveXObject
|
|
20
20
|
|
|
21
|
-
logger.start(
|
|
22
|
-
const sapiVoice = new ActiveXObject(useSpeechPlatform ?
|
|
21
|
+
logger.start('Create SAPI COM object')
|
|
22
|
+
const sapiVoice = new ActiveXObject(useSpeechPlatform ? 'Speech.SPVoice' : 'SAPI.SPVoice')
|
|
23
23
|
sapiVoice.EventInterests = 33790
|
|
24
24
|
|
|
25
|
-
logger.start(
|
|
25
|
+
logger.start('Get SAPI voice list and select best match')
|
|
26
26
|
|
|
27
27
|
if (voiceName) {
|
|
28
28
|
const voiceObjects = sapiVoice.GetVoices()
|
|
@@ -40,13 +40,13 @@ export function synthesize(text: string, voiceName: string, rate = 0, useSpeechP
|
|
|
40
40
|
sapiVoice.Rate = rate
|
|
41
41
|
|
|
42
42
|
// Create phone converter for language
|
|
43
|
-
const sapiPhoneConverter = new ActiveXObject(useSpeechPlatform ?
|
|
43
|
+
const sapiPhoneConverter = new ActiveXObject(useSpeechPlatform ? 'Speech.SpPhoneConverter' : 'SAPI.SpPhoneConverter')
|
|
44
44
|
const sapiLanguageCodeHex = sapiVoice.Voice.GetAttribute('Language')
|
|
45
45
|
const sapiLanguageCode = parseInt(sapiLanguageCodeHex, 16)
|
|
46
46
|
|
|
47
47
|
sapiPhoneConverter.LanguageId = sapiLanguageCode
|
|
48
48
|
|
|
49
|
-
logger.start(
|
|
49
|
+
logger.start('Synthesize with SAPI')
|
|
50
50
|
|
|
51
51
|
const sampleRate = 22050
|
|
52
52
|
const bytesPerSecond = sampleRate * 2
|
|
@@ -80,7 +80,7 @@ export function synthesize(text: string, voiceName: string, rate = 0, useSpeechP
|
|
|
80
80
|
const wordText = text.substring(charPos, charPos + length)
|
|
81
81
|
const startTime = streamPos / bytesPerSecond
|
|
82
82
|
|
|
83
|
-
const wordEvent = { type:
|
|
83
|
+
const wordEvent = { type: 'word', text: wordText, startTime, endTime: -1, timeline: [] } as TimelineEntry
|
|
84
84
|
events.push(wordEvent)
|
|
85
85
|
|
|
86
86
|
lastWordEvent = wordEvent
|
|
@@ -94,14 +94,14 @@ export function synthesize(text: string, voiceName: string, rate = 0, useSpeechP
|
|
|
94
94
|
|
|
95
95
|
const phoneText = sapiPhoneConverter.IdToPhone(currentPhoneId)
|
|
96
96
|
|
|
97
|
-
if (phoneText ==
|
|
97
|
+
if (phoneText == ',' || phoneText == '_') {
|
|
98
98
|
return
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
const startTime = streamPos / bytesPerSecond
|
|
102
102
|
const endTime = startTime + (duration / 1000)
|
|
103
103
|
|
|
104
|
-
events.push({ type:
|
|
104
|
+
events.push({ type: 'phone', text: phoneText, startTime, endTime })
|
|
105
105
|
},
|
|
106
106
|
|
|
107
107
|
EndStream: (streamId: number, streamPos: number) => {
|
|
@@ -124,11 +124,11 @@ export function synthesize(text: string, voiceName: string, rate = 0, useSpeechP
|
|
|
124
124
|
}
|
|
125
125
|
|
|
126
126
|
export async function getVoiceList(useSpeechPlatform = false) {
|
|
127
|
-
const { default: WinAX } = await import(
|
|
127
|
+
const { default: WinAX } = await import('winax')
|
|
128
128
|
|
|
129
129
|
const ActiveXObject = (global as any).ActiveXObject
|
|
130
130
|
|
|
131
|
-
const sapiVoice = new ActiveXObject(useSpeechPlatform ?
|
|
131
|
+
const sapiVoice = new ActiveXObject(useSpeechPlatform ? 'Speech.SPVoice' : 'SAPI.SPVoice')
|
|
132
132
|
|
|
133
133
|
const voiceObjects = sapiVoice.GetVoices()
|
|
134
134
|
|
|
@@ -137,7 +137,7 @@ export async function getVoiceList(useSpeechPlatform = false) {
|
|
|
137
137
|
for (let i = 0; i < voiceObjects.Count; i++) {
|
|
138
138
|
const voiceObject = voiceObjects.Item(i)
|
|
139
139
|
const voiceName = voiceObject.GetDescription()
|
|
140
|
-
const voiceGender = voiceObject.GetAttribute(
|
|
140
|
+
const voiceGender = voiceObject.GetAttribute('Gender')?.toLowerCase()
|
|
141
141
|
|
|
142
142
|
const sapiLanguageCodeHex = voiceObject.GetAttribute('Language')
|
|
143
143
|
const sapiLanguageCode = parseInt(sapiLanguageCodeHex, 16)
|
|
@@ -164,7 +164,7 @@ export async function getVoiceList(useSpeechPlatform = false) {
|
|
|
164
164
|
voices.push({
|
|
165
165
|
name: voiceName,
|
|
166
166
|
languages: resultLanguageCodes,
|
|
167
|
-
gender: voiceGender ||
|
|
167
|
+
gender: voiceGender || 'unknown'
|
|
168
168
|
})
|
|
169
169
|
}
|
|
170
170
|
|
|
@@ -174,12 +174,12 @@ export async function getVoiceList(useSpeechPlatform = false) {
|
|
|
174
174
|
}
|
|
175
175
|
|
|
176
176
|
export async function AssertSAPIAvailable(testForSpeechPlatform = false) {
|
|
177
|
-
if (process.platform !=
|
|
177
|
+
if (process.platform != 'win32') {
|
|
178
178
|
throw new Error(`SAPI is not available on your platform. SAPI is a Microsoft Windows technology that is only runs on a Windows OS.`)
|
|
179
179
|
}
|
|
180
180
|
|
|
181
181
|
try {
|
|
182
|
-
const { default: WinAX } = await import(
|
|
182
|
+
const { default: WinAX } = await import('winax')
|
|
183
183
|
} catch (e) {
|
|
184
184
|
throw new Error(`winax package, which is required for SAPI support, was not found. You can install it by running 'npm install winax -g'.`)
|
|
185
185
|
}
|
|
@@ -187,13 +187,13 @@ export async function AssertSAPIAvailable(testForSpeechPlatform = false) {
|
|
|
187
187
|
const ActiveXObject = (global as any).ActiveXObject
|
|
188
188
|
|
|
189
189
|
try {
|
|
190
|
-
const voice = new ActiveXObject(
|
|
190
|
+
const voice = new ActiveXObject('SAPI.SPVoice')
|
|
191
191
|
} catch (e) {
|
|
192
192
|
throw new Error(`Failed creating a SAPI instance: ${e}`)
|
|
193
193
|
}
|
|
194
194
|
|
|
195
195
|
try {
|
|
196
|
-
const voice = new ActiveXObject(
|
|
196
|
+
const voice = new ActiveXObject('Speech.SPVoice')
|
|
197
197
|
} catch(e) {
|
|
198
198
|
throw new Error(`Failed creating an msspeech instance. Please ensure you installed the Microsoft Speech Platform runtime correctly.`)
|
|
199
199
|
}
|
|
@@ -203,11 +203,11 @@ function eventsToTimeline(events: Timeline, totalDuration: number): Timeline {
|
|
|
203
203
|
const timeline: Timeline = []
|
|
204
204
|
|
|
205
205
|
for (const event of events) {
|
|
206
|
-
if (event.type ==
|
|
206
|
+
if (event.type == 'word') {
|
|
207
207
|
timeline.push(event)
|
|
208
|
-
} else if (event.type ==
|
|
208
|
+
} else if (event.type == 'phone') {
|
|
209
209
|
if (timeline.length == 0) {
|
|
210
|
-
throw new Error(
|
|
210
|
+
throw new Error('Unexpected: phone event preceded a word event')
|
|
211
211
|
}
|
|
212
212
|
|
|
213
213
|
const lastWordEntry = timeline[timeline.length - 1]
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { request } from
|
|
2
|
-
import { SynthesisVoice } from
|
|
3
|
-
import { trimAudioEnd } from
|
|
4
|
-
import * as FFMpegTranscoder from
|
|
5
|
-
import { Phrase, splitToFragments } from
|
|
6
|
-
import { Logger } from
|
|
7
|
-
import { concatFloat32Arrays, logToStderr } from
|
|
8
|
-
import { Timeline } from
|
|
1
|
+
import { request } from 'gaxios'
|
|
2
|
+
import { SynthesisVoice } from '../api/API.js'
|
|
3
|
+
import { trimAudioEnd } from '../audio/AudioUtilities.js'
|
|
4
|
+
import * as FFMpegTranscoder from '../codecs/FFMpegTranscoder.js'
|
|
5
|
+
import { Phrase, splitToFragments } from '../nlp/Segmentation.js'
|
|
6
|
+
import { Logger } from '../utilities/Logger.js'
|
|
7
|
+
import { concatFloat32Arrays, logToStderr } from '../utilities/Utilities.js'
|
|
8
|
+
import { Timeline } from '../utilities/Timeline.js'
|
|
9
9
|
|
|
10
10
|
const log = logToStderr
|
|
11
11
|
|
|
@@ -13,11 +13,11 @@ const maxTextLengthPerRequest = 200
|
|
|
13
13
|
|
|
14
14
|
export async function synthesizeLongText(text: string, voice: string, languageCode: string, sentenceEndPause = 0.75, segmentEndPause = 1.0) {
|
|
15
15
|
if (text.length == 0) {
|
|
16
|
-
throw new Error(
|
|
16
|
+
throw new Error('Text is empty')
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
const logger = new Logger()
|
|
20
|
-
logger.start(
|
|
20
|
+
logger.start('Prepare and split text')
|
|
21
21
|
|
|
22
22
|
const fragments = await splitToFragments(text, maxTextLengthPerRequest, languageCode)
|
|
23
23
|
|
|
@@ -57,7 +57,7 @@ export async function synthesizeLongText(text: string, voice: string, languageCo
|
|
|
57
57
|
const endTime = startTime + (trimmedAudio.length / fragmentsSampleRate)
|
|
58
58
|
|
|
59
59
|
timeline.push({
|
|
60
|
-
type:
|
|
60
|
+
type: 'segment',
|
|
61
61
|
text: fragment.text,
|
|
62
62
|
startTime,
|
|
63
63
|
endTime
|
|
@@ -78,37 +78,37 @@ export async function synthesizeFragment(text: string, voice: string) {
|
|
|
78
78
|
const response = await request<any>({
|
|
79
79
|
url: `https://streamlabs.com/polly/speak`,
|
|
80
80
|
|
|
81
|
-
method:
|
|
81
|
+
method: 'POST',
|
|
82
82
|
|
|
83
83
|
data: {
|
|
84
84
|
voice,
|
|
85
85
|
text,
|
|
86
86
|
},
|
|
87
87
|
|
|
88
|
-
responseType:
|
|
88
|
+
responseType: 'json'
|
|
89
89
|
})
|
|
90
90
|
|
|
91
91
|
const responseObject = response.data
|
|
92
92
|
const audioUrl = responseObject.speak_url
|
|
93
|
-
const audioUrlResponse = await request<ArrayBuffer>({ url: audioUrl, responseType:
|
|
93
|
+
const audioUrlResponse = await request<ArrayBuffer>({ url: audioUrl, responseType: 'arraybuffer' })
|
|
94
94
|
|
|
95
95
|
return Buffer.from(audioUrlResponse.data)
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
export const voiceList: SynthesisVoice[] = [
|
|
99
|
-
{ name:
|
|
100
|
-
{ name:
|
|
101
|
-
{ name:
|
|
102
|
-
{ name:
|
|
103
|
-
{ name:
|
|
104
|
-
{ name:
|
|
105
|
-
{ name:
|
|
106
|
-
{ name:
|
|
107
|
-
{ name:
|
|
108
|
-
{ name:
|
|
109
|
-
{ name:
|
|
110
|
-
{ name:
|
|
111
|
-
{ name:
|
|
112
|
-
{ name:
|
|
113
|
-
{ name:
|
|
99
|
+
{ name: 'Brian', languages: ['en-GB', 'en'], gender: 'male' },
|
|
100
|
+
{ name: 'Emma', languages: ['en-GB', 'en'], gender: 'female' },
|
|
101
|
+
{ name: 'Russell', languages: ['en-AU', 'en'], gender: 'male' },
|
|
102
|
+
{ name: 'Joey', languages: ['en-US', 'en'], gender: 'male' },
|
|
103
|
+
{ name: 'Matthew', languages: ['en-US', 'en'], gender: 'male' },
|
|
104
|
+
{ name: 'Joanna', languages: ['en-US', 'en'], gender: 'female' },
|
|
105
|
+
{ name: 'Kimberly', languages: ['en-US', 'en'], gender: 'female' },
|
|
106
|
+
{ name: 'Amy', languages: ['en-GB', 'en'], gender: 'female' },
|
|
107
|
+
{ name: 'Geraint', languages: ['en-GB-WLS', 'en-GB', 'en'], gender: 'male' },
|
|
108
|
+
{ name: 'Nicole', languages: ['en-AU', 'en'], gender: 'female' },
|
|
109
|
+
{ name: 'Justin', languages: ['en-US', 'en'], gender: 'male' },
|
|
110
|
+
{ name: 'Ivy', languages: ['en-US', 'en'], gender: 'female' },
|
|
111
|
+
{ name: 'Kendra', languages: ['en-US', 'en'], gender: 'female' },
|
|
112
|
+
{ name: 'Salli', languages: ['en-US', 'en'], gender: 'female' },
|
|
113
|
+
{ name: 'Raveena', languages: ['en-IN', 'en'], gender: 'female' },
|
|
114
114
|
]
|