echogarden 1.8.7 → 2.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 +23 -18
- package/data/schemas/options.json +52 -47
- package/dist/alignment/DTWSequenceAlignment.d.ts +1 -1
- package/dist/alignment/DTWSequenceAlignment.js +5 -5
- package/dist/alignment/DTWSequenceAlignment.js.map +1 -1
- package/dist/alignment/SpeechAlignment.js +6 -6
- package/dist/alignment/SpeechAlignment.js.map +1 -1
- package/dist/api/Alignment.d.ts +1 -1
- package/dist/api/Alignment.js +49 -11
- package/dist/api/Alignment.js.map +1 -1
- package/dist/api/Denoising.d.ts +4 -2
- package/dist/api/Denoising.js +65 -13
- package/dist/api/Denoising.js.map +1 -1
- package/dist/api/SourceSeparation.js +9 -6
- package/dist/api/SourceSeparation.js.map +1 -1
- package/dist/api/SpeechLanguageDetection.js +4 -4
- package/dist/api/SpeechLanguageDetection.js.map +1 -1
- package/dist/api/Synthesis.d.ts +2 -2
- package/dist/api/Synthesis.js +10 -7
- package/dist/api/Synthesis.js.map +1 -1
- package/dist/api/VoiceActivityDetection.js +2 -2
- package/dist/api/VoiceActivityDetection.js.map +1 -1
- package/dist/audio/AudioBufferConversion.d.ts +2 -2
- package/dist/audio/AudioBufferConversion.js +77 -43
- package/dist/audio/AudioBufferConversion.js.map +1 -1
- package/dist/audio/AudioPlayer.d.ts +7 -5
- package/dist/audio/AudioPlayer.js +135 -49
- package/dist/audio/AudioPlayer.js.map +1 -1
- package/dist/audio/AudioUtilities.d.ts +4 -3
- package/dist/audio/AudioUtilities.js +30 -15
- package/dist/audio/AudioUtilities.js.map +1 -1
- package/dist/audio/SoxPath.js +3 -3
- package/dist/audio/SoxPath.js.map +1 -1
- package/dist/build-tools/MakeTarballsForInstalledPackages.js +3 -3
- package/dist/build-tools/MakeTarballsForInstalledPackages.js.map +1 -1
- package/dist/cli/CLI.js +30 -36
- package/dist/cli/CLI.js.map +1 -1
- package/dist/cli/CLIConfigFile.js +2 -2
- package/dist/cli/CLIConfigFile.js.map +1 -1
- package/dist/cli/CLIOptions.d.ts +2 -0
- package/dist/cli/CLIOptions.js +1 -1
- package/dist/cli/CLIOptions.js.map +1 -1
- package/dist/codecs/FFMpegTranscoder.d.ts +3 -3
- package/dist/codecs/FFMpegTranscoder.js +6 -6
- package/dist/codecs/FFMpegTranscoder.js.map +1 -1
- package/dist/codecs/TIMITCodec.d.ts +1 -1
- package/dist/codecs/TIMITCodec.js +4 -3
- package/dist/codecs/TIMITCodec.js.map +1 -1
- package/dist/codecs/WaveCodec.d.ts +3 -3
- package/dist/codecs/WaveCodec.js +37 -34
- package/dist/codecs/WaveCodec.js.map +1 -1
- package/dist/data-structures/DynamicTypedArray.d.ts +17 -0
- package/dist/data-structures/DynamicTypedArray.js +47 -0
- package/dist/data-structures/DynamicTypedArray.js.map +1 -0
- package/dist/data-structures/Queue.js.map +1 -0
- package/dist/data-structures/WindowedList.js.map +1 -0
- package/dist/denoising/NSNet2.d.ts +26 -0
- package/dist/denoising/NSNet2.js +128 -0
- package/dist/denoising/NSNet2.js.map +1 -0
- package/dist/denoising/RNNoise.js +3 -3
- package/dist/denoising/RNNoise.js.map +1 -1
- package/dist/dsp/FFT.d.ts +6 -1
- package/dist/dsp/FFT.js +17 -0
- package/dist/dsp/FFT.js.map +1 -1
- package/dist/encodings/Ascii.d.ts +10 -0
- package/dist/encodings/Ascii.js +41 -0
- package/dist/encodings/Ascii.js.map +1 -0
- package/dist/encodings/Base64.d.ts +5 -0
- package/dist/encodings/Base64.js +114 -0
- package/dist/encodings/Base64.js.map +1 -0
- package/dist/encodings/Hex.d.ts +3 -0
- package/dist/encodings/Hex.js +52 -0
- package/dist/encodings/Hex.js.map +1 -0
- package/dist/{utilities → encodings}/LEB128.d.ts +1 -1
- package/dist/{utilities → encodings}/LEB128.js +4 -4
- package/dist/encodings/LEB128.js.map +1 -0
- package/dist/{utilities → encodings}/LPVarInt.d.ts +1 -1
- package/dist/{utilities → encodings}/LPVarInt.js +6 -6
- package/dist/encodings/LPVarInt.js.map +1 -0
- package/dist/encodings/TextEncodingsCommon.d.ts +4 -0
- package/dist/encodings/TextEncodingsCommon.js +2 -0
- package/dist/encodings/TextEncodingsCommon.js.map +1 -0
- package/dist/encodings/Utf16.d.ts +10 -0
- package/dist/encodings/Utf16.js +36 -0
- package/dist/encodings/Utf16.js.map +1 -0
- package/dist/encodings/Utf32.d.ts +9 -0
- package/dist/encodings/Utf32.js +44 -0
- package/dist/encodings/Utf32.js.map +1 -0
- package/dist/encodings/Utf8.d.ts +10 -0
- package/dist/encodings/Utf8.js +97 -0
- package/dist/encodings/Utf8.js.map +1 -0
- package/dist/math/MedianFilter.js.map +1 -1
- package/dist/nlp/JapaneseSegmentation.js +2 -2
- package/dist/nlp/JapaneseSegmentation.js.map +1 -1
- package/dist/recognition/GoogleCloudSTT.js +2 -1
- package/dist/recognition/GoogleCloudSTT.js.map +1 -1
- package/dist/recognition/SileroSTT.js +3 -3
- package/dist/recognition/SileroSTT.js.map +1 -1
- package/dist/recognition/VoskSTT.js +3 -3
- package/dist/recognition/VoskSTT.js.map +1 -1
- package/dist/recognition/WhisperCppSTT.js +4 -5
- package/dist/recognition/WhisperCppSTT.js.map +1 -1
- package/dist/recognition/WhisperSTT.js +8 -7
- package/dist/recognition/WhisperSTT.js.map +1 -1
- package/dist/server/Client.d.ts +1 -1
- package/dist/server/Client.js +2 -1
- package/dist/server/Client.js.map +1 -1
- package/dist/server/Server.js +5 -4
- package/dist/server/Server.js.map +1 -1
- package/dist/server/Worker.js +1 -1
- package/dist/server/Worker.js.map +1 -1
- package/dist/source-separation/MDXNetSourceSeparation.js +1 -1
- package/dist/source-separation/MDXNetSourceSeparation.js.map +1 -1
- package/dist/speech-search/DTWSpeechSearch.d.ts +1 -1
- package/dist/speech-search/DTWSpeechSearch.js +25 -6
- package/dist/speech-search/DTWSpeechSearch.js.map +1 -1
- package/dist/subtitles/Subtitles.js +2 -2
- package/dist/subtitles/Subtitles.js.map +1 -1
- package/dist/synthesis/AzureCognitiveServicesTTS.js +17 -18
- package/dist/synthesis/AzureCognitiveServicesTTS.js.map +1 -1
- package/dist/synthesis/CoquiServerTTS.js +1 -1
- package/dist/synthesis/CoquiServerTTS.js.map +1 -1
- package/dist/synthesis/ElevenlabsTTS.js +1 -1
- package/dist/synthesis/ElevenlabsTTS.js.map +1 -1
- package/dist/synthesis/EspeakTTS.d.ts +0 -1
- package/dist/synthesis/EspeakTTS.js +0 -9
- package/dist/synthesis/EspeakTTS.js.map +1 -1
- package/dist/synthesis/FliteTTS.js +7 -8
- package/dist/synthesis/FliteTTS.js.map +1 -1
- package/dist/synthesis/GoogleCloudTTS.d.ts +1 -1
- package/dist/synthesis/GoogleCloudTTS.js +2 -1
- package/dist/synthesis/GoogleCloudTTS.js.map +1 -1
- package/dist/synthesis/GoogleTranslateTTS.d.ts +1 -1
- package/dist/synthesis/GoogleTranslateTTS.js +4 -3
- package/dist/synthesis/GoogleTranslateTTS.js.map +1 -1
- package/dist/synthesis/MicrosoftEdgeTTS.js +32 -7
- package/dist/synthesis/MicrosoftEdgeTTS.js.map +1 -1
- package/dist/synthesis/SapiTTS.js +1 -1
- package/dist/synthesis/SapiTTS.js.map +1 -1
- package/dist/synthesis/StreamlabsPollyTTS.d.ts +1 -1
- package/dist/synthesis/StreamlabsPollyTTS.js +1 -1
- package/dist/synthesis/StreamlabsPollyTTS.js.map +1 -1
- package/dist/synthesis/SvoxPicoTTS.js +6 -6
- package/dist/synthesis/SvoxPicoTTS.js.map +1 -1
- package/dist/synthesis/VitsTTS.js +2 -2
- package/dist/synthesis/VitsTTS.js.map +1 -1
- package/dist/tests/Test.js +1 -47
- package/dist/tests/Test.js.map +1 -1
- package/dist/text-language-detection/FastTextLanguageDetection.js +2 -2
- package/dist/text-language-detection/FastTextLanguageDetection.js.map +1 -1
- package/dist/typings/TypedArray.d.ts +4 -0
- package/dist/typings/TypedArray.js +2 -0
- package/dist/typings/TypedArray.js.map +1 -0
- package/dist/utilities/BinaryArrayConversion.d.ts +12 -22
- package/dist/utilities/BinaryArrayConversion.js +40 -90
- package/dist/utilities/BinaryArrayConversion.js.map +1 -1
- package/dist/utilities/BinaryUtilities.d.ts +13 -0
- package/dist/utilities/BinaryUtilities.js +113 -0
- package/dist/utilities/BinaryUtilities.js.map +1 -0
- package/dist/utilities/Compression.js +7 -6
- package/dist/utilities/Compression.js.map +1 -1
- package/dist/utilities/FileDownloader.js +26 -47
- package/dist/utilities/FileDownloader.js.map +1 -1
- package/dist/utilities/FileReader.d.ts +14 -0
- package/dist/utilities/FileReader.js +71 -0
- package/dist/utilities/FileReader.js.map +1 -0
- package/dist/utilities/FileSystem.d.ts +19 -16
- package/dist/utilities/FileSystem.js +170 -109
- package/dist/utilities/FileSystem.js.map +1 -1
- package/dist/utilities/FileWriter.d.ts +12 -0
- package/dist/utilities/FileWriter.js +60 -0
- package/dist/utilities/FileWriter.js.map +1 -0
- package/dist/utilities/NpmUtilities.d.ts +1 -0
- package/dist/utilities/NpmUtilities.js +14 -0
- package/dist/utilities/NpmUtilities.js.map +1 -0
- package/dist/utilities/PackageManager.js +7 -5
- package/dist/utilities/PackageManager.js.map +1 -1
- package/dist/utilities/PathUtilities.d.ts +8 -0
- package/dist/utilities/PathUtilities.js +28 -7
- package/dist/utilities/PathUtilities.js.map +1 -1
- package/dist/utilities/SignalChannel.d.ts +3 -1
- package/dist/utilities/SignalChannel.js +9 -5
- package/dist/utilities/SignalChannel.js.map +1 -1
- package/dist/utilities/StringBuilder.d.ts +10 -0
- package/dist/utilities/StringBuilder.js +39 -0
- package/dist/utilities/StringBuilder.js.map +1 -0
- package/dist/utilities/StringUtilities.js.map +1 -1
- package/dist/utilities/TarballMaker.js +6 -7
- package/dist/utilities/TarballMaker.js.map +1 -1
- package/dist/utilities/Timer.js +2 -2
- package/dist/utilities/Timer.js.map +1 -1
- package/dist/utilities/Utilities.d.ts +11 -5
- package/dist/utilities/Utilities.js +69 -33
- package/dist/utilities/Utilities.js.map +1 -1
- package/dist/utilities/VirtualFileReadStream.d.ts +3 -3
- package/dist/utilities/VirtualFileReadStream.js.map +1 -1
- package/dist/utilities/WasmMemoryManager.d.ts +5 -2
- package/dist/utilities/WasmMemoryManager.js +15 -4
- package/dist/utilities/WasmMemoryManager.js.map +1 -1
- package/docs/API.md +1 -1
- package/docs/Licenses.md +3 -0
- package/docs/Options.md +9 -3
- package/docs/Tasklist.md +0 -1
- package/docs/Technical.md +2 -2
- package/package.json +20 -22
- package/src/alignment/DTWSequenceAlignment.ts +5 -5
- package/src/alignment/SpeechAlignment.ts +6 -6
- package/src/api/Alignment.ts +65 -12
- package/src/api/Denoising.ts +97 -17
- package/src/api/SourceSeparation.ts +11 -8
- package/src/api/SpeechLanguageDetection.ts +4 -4
- package/src/api/Synthesis.ts +15 -11
- package/src/api/VoiceActivityDetection.ts +2 -2
- package/src/audio/AudioBufferConversion.ts +84 -45
- package/src/audio/AudioPlayer.ts +155 -53
- package/src/audio/AudioUtilities.ts +38 -22
- package/src/audio/SoxPath.ts +3 -3
- package/src/build-tools/MakeTarballsForInstalledPackages.ts +3 -3
- package/src/cli/CLI.ts +30 -36
- package/src/cli/CLIConfigFile.ts +2 -2
- package/src/cli/CLIOptions.ts +4 -1
- package/src/codecs/FFMpegTranscoder.ts +11 -11
- package/src/codecs/TIMITCodec.ts +5 -4
- package/src/codecs/WaveCodec.ts +42 -39
- package/src/data-structures/DynamicTypedArray.ts +64 -0
- package/src/denoising/NSNet2.ts +182 -0
- package/src/denoising/RNNoise.ts +3 -3
- package/src/dsp/FFT.ts +21 -1
- package/src/encodings/Ascii.ts +60 -0
- package/src/encodings/Base64.ts +157 -0
- package/src/encodings/Hex.ts +67 -0
- package/src/{utilities → encodings}/LEB128.ts +4 -4
- package/src/{utilities → encodings}/LPVarInt.ts +6 -6
- package/src/encodings/TextEncodingsCommon.ts +4 -0
- package/src/encodings/Utf16.ts +52 -0
- package/src/encodings/Utf32.ts +62 -0
- package/src/encodings/Utf8.ts +117 -0
- package/src/math/MedianFilter.ts +0 -2
- package/src/nlp/JapaneseSegmentation.ts +2 -2
- package/src/recognition/GoogleCloudSTT.ts +2 -1
- package/src/recognition/SileroSTT.ts +3 -3
- package/src/recognition/VoskSTT.ts +3 -3
- package/src/recognition/WhisperCppSTT.ts +4 -5
- package/src/recognition/WhisperSTT.ts +8 -7
- package/src/server/Client.ts +4 -3
- package/src/server/Server.ts +6 -5
- package/src/server/Worker.ts +1 -1
- package/src/source-separation/MDXNetSourceSeparation.ts +1 -1
- package/src/speech-search/DTWSpeechSearch.ts +36 -7
- package/src/subtitles/Subtitles.ts +3 -3
- package/src/synthesis/AzureCognitiveServicesTTS.ts +18 -15
- package/src/synthesis/CoquiServerTTS.ts +2 -2
- package/src/synthesis/ElevenlabsTTS.ts +1 -1
- package/src/synthesis/EspeakTTS.ts +0 -15
- package/src/synthesis/FliteTTS.ts +7 -8
- package/src/synthesis/GoogleCloudTTS.ts +3 -2
- package/src/synthesis/GoogleTranslateTTS.ts +5 -4
- package/src/synthesis/MicrosoftEdgeTTS.ts +47 -15
- package/src/synthesis/SapiTTS.ts +1 -1
- package/src/synthesis/StreamlabsPollyTTS.ts +1 -1
- package/src/synthesis/SvoxPicoTTS.ts +8 -8
- package/src/synthesis/VitsTTS.ts +2 -2
- package/src/tests/Test.ts +1 -60
- package/src/text-language-detection/FastTextLanguageDetection.ts +2 -2
- package/src/typings/Fillers.d.ts +2 -4
- package/src/typings/TypedArray.ts +5 -0
- package/src/utilities/BinaryArrayConversion.ts +51 -125
- package/src/utilities/BinaryUtilities.ts +138 -0
- package/src/utilities/Compression.ts +7 -6
- package/src/utilities/FileDownloader.ts +27 -52
- package/src/utilities/FileReader.ts +89 -0
- package/src/utilities/FileSystem.ts +213 -120
- package/src/utilities/FileWriter.ts +72 -0
- package/src/utilities/NpmUtilities.ts +23 -0
- package/src/utilities/PackageManager.ts +8 -5
- package/src/utilities/PathUtilities.ts +36 -7
- package/src/utilities/SignalChannel.ts +14 -7
- package/src/utilities/StringBuilder.ts +45 -0
- package/src/utilities/StringUtilities.ts +2 -0
- package/src/utilities/TarballMaker.ts +6 -7
- package/src/utilities/Timer.ts +4 -2
- package/src/utilities/Utilities.ts +79 -45
- package/src/utilities/VirtualFileReadStream.ts +5 -5
- package/src/utilities/WasmMemoryManager.ts +20 -6
- package/tsconfig.json +96 -0
- package/dist/utilities/DynamicUint8Array.d.ts +0 -9
- package/dist/utilities/DynamicUint8Array.js +0 -31
- package/dist/utilities/DynamicUint8Array.js.map +0 -1
- package/dist/utilities/LEB128.js.map +0 -1
- package/dist/utilities/LPVarInt.js.map +0 -1
- package/dist/utilities/Queue.js.map +0 -1
- package/dist/utilities/WindowedList.js.map +0 -1
- package/src/utilities/DynamicUint8Array.ts +0 -39
- /package/dist/{utilities → data-structures}/Queue.d.ts +0 -0
- /package/dist/{utilities → data-structures}/Queue.js +0 -0
- /package/dist/{utilities → data-structures}/WindowedList.d.ts +0 -0
- /package/dist/{utilities → data-structures}/WindowedList.js +0 -0
- /package/src/{utilities → data-structures}/Queue.ts +0 -0
- /package/src/{utilities → data-structures}/WindowedList.ts +0 -0
|
@@ -2,10 +2,9 @@ import { SynthesisVoice } from '../api/API.js'
|
|
|
2
2
|
import { decodeWaveToRawAudio } from '../audio/AudioUtilities.js'
|
|
3
3
|
import { Logger } from '../utilities/Logger.js'
|
|
4
4
|
import { getRandomHexString, logToStderr, resolveModuleMainPath } from '../utilities/Utilities.js'
|
|
5
|
-
import {
|
|
6
|
-
import path from 'node:path'
|
|
5
|
+
import { open, close, remove, ensureDir, readFileAsBinary, readFileAsUtf8 } from '../utilities/FileSystem.js'
|
|
7
6
|
import { escape } from 'html-escaper'
|
|
8
|
-
import { getAppTempDir } from '../utilities/PathUtilities.js'
|
|
7
|
+
import { getAppTempDir, joinPath } from '../utilities/PathUtilities.js'
|
|
9
8
|
|
|
10
9
|
const log = logToStderr
|
|
11
10
|
|
|
@@ -25,8 +24,8 @@ export async function synthesize(text: string, voice: FliteVoiceName, voiceDir:
|
|
|
25
24
|
const tempDir = getAppTempDir('flite')
|
|
26
25
|
await ensureDir(tempDir)
|
|
27
26
|
|
|
28
|
-
const tempAudioFilePath =
|
|
29
|
-
const tempStdOutFilePath =
|
|
27
|
+
const tempAudioFilePath = joinPath(tempDir, outFileName)
|
|
28
|
+
const tempStdOutFilePath = joinPath(tempDir, stdOutFileName)
|
|
30
29
|
|
|
31
30
|
const stdOutFileFd = await open(tempStdOutFilePath, 'w+')
|
|
32
31
|
|
|
@@ -100,8 +99,8 @@ export async function synthesize(text: string, voice: FliteVoiceName, voiceDir:
|
|
|
100
99
|
throw new Error(`Flite failed with exit code ${exitCode}`)
|
|
101
100
|
}
|
|
102
101
|
|
|
103
|
-
const waveData = await
|
|
104
|
-
const stdOutString = await
|
|
102
|
+
const waveData = await readFileAsBinary(tempAudioFilePath)
|
|
103
|
+
const stdOutString = await readFileAsUtf8(tempStdOutFilePath)
|
|
105
104
|
|
|
106
105
|
await cleanup()
|
|
107
106
|
|
|
@@ -118,7 +117,7 @@ async function getModuleObject() {
|
|
|
118
117
|
if (!fliteModuleObject) {
|
|
119
118
|
const fliteWasiPath = await resolveModuleMainPath('@echogarden/flite-wasi')
|
|
120
119
|
|
|
121
|
-
fliteModuleObject = await WebAssembly.compile(await
|
|
120
|
+
fliteModuleObject = await WebAssembly.compile(await readFileAsBinary(fliteWasiPath))
|
|
122
121
|
}
|
|
123
122
|
|
|
124
123
|
return fliteModuleObject
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { request } from 'gaxios'
|
|
2
2
|
import { Logger } from '../utilities/Logger.js'
|
|
3
3
|
import { logToStderr } from '../utilities/Utilities.js'
|
|
4
|
+
import { decodeBase64 } from '../encodings/Base64.js'
|
|
4
5
|
|
|
5
6
|
const log = logToStderr
|
|
6
7
|
|
|
@@ -15,7 +16,7 @@ export async function synthesize(
|
|
|
15
16
|
ssml = false,
|
|
16
17
|
audioEncoding: AudioEncoding = 'MP3_64_KBPS',
|
|
17
18
|
sampleRate = 24000) {
|
|
18
|
-
|
|
19
|
+
|
|
19
20
|
const logger = new Logger()
|
|
20
21
|
logger.start('Request synthesis from Google Cloud')
|
|
21
22
|
|
|
@@ -75,7 +76,7 @@ export async function synthesize(
|
|
|
75
76
|
}
|
|
76
77
|
|
|
77
78
|
function parseResponseBody(responseBody: any) {
|
|
78
|
-
const audioData =
|
|
79
|
+
const audioData = decodeBase64(responseBody.audioContent)
|
|
79
80
|
const timepoints: timePoint[] = responseBody.timepoints
|
|
80
81
|
|
|
81
82
|
return { audioData, timepoints }
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { request } from 'gaxios'
|
|
2
2
|
import { Phrase, splitToFragments } from '../nlp/Segmentation.js'
|
|
3
|
-
import {
|
|
3
|
+
import { concatFloat32Arrays, concatUint8Arrays, logToStderr } from '../utilities/Utilities.js'
|
|
4
4
|
import * as FFMpegTranscoder from '../codecs/FFMpegTranscoder.js'
|
|
5
5
|
import { trimAudioEnd } from '../audio/AudioUtilities.js'
|
|
6
6
|
import { Logger } from '../utilities/Logger.js'
|
|
7
7
|
import { Timeline } from '../utilities/Timeline.js'
|
|
8
8
|
import { getShortLanguageCode } from '../utilities/Locale.js'
|
|
9
9
|
import { getChromeOnWindowsHeaders } from '../utilities/BrowserRequestHeaders.js'
|
|
10
|
+
import { decodeBase64 } from '../encodings/Base64.js'
|
|
10
11
|
|
|
11
12
|
const log = logToStderr
|
|
12
13
|
|
|
@@ -113,18 +114,18 @@ export async function synthesizeShortText(text: string, languageCode = 'en', tld
|
|
|
113
114
|
|
|
114
115
|
//log(response.data)
|
|
115
116
|
|
|
116
|
-
const audioChunks:
|
|
117
|
+
const audioChunks: Uint8Array[] = []
|
|
117
118
|
|
|
118
119
|
for (const line of response.data.split(/\r?\n/)) {
|
|
119
120
|
const match = line.match(/"jQ1olc","\[\\"(.*)\\"]/)
|
|
120
121
|
|
|
121
122
|
if (match != null) {
|
|
122
123
|
const base64AudioChunk = match[1]
|
|
123
|
-
audioChunks.push(
|
|
124
|
+
audioChunks.push(decodeBase64(base64AudioChunk))
|
|
124
125
|
}
|
|
125
126
|
}
|
|
126
127
|
|
|
127
|
-
const resultMp3Stream =
|
|
128
|
+
const resultMp3Stream = concatUint8Arrays(audioChunks)
|
|
128
129
|
|
|
129
130
|
return resultMp3Stream
|
|
130
131
|
}
|
|
@@ -3,15 +3,14 @@ import WebSocket from 'ws'
|
|
|
3
3
|
|
|
4
4
|
import { escape } from 'html-escaper'
|
|
5
5
|
|
|
6
|
-
import splitBuffer from 'buffer-split'
|
|
7
|
-
|
|
8
6
|
import * as AzureCognitiveServicesTTS from './AzureCognitiveServicesTTS.js'
|
|
9
7
|
import * as FFMpegTranscoder from '../codecs/FFMpegTranscoder.js'
|
|
10
8
|
import { Logger } from '../utilities/Logger.js'
|
|
11
9
|
import { OpenPromise } from '../utilities/OpenPromise.js'
|
|
12
|
-
import {
|
|
10
|
+
import { concatUint8Arrays, getRandomHexString, logToStderr } from '../utilities/Utilities.js'
|
|
13
11
|
import { RawAudio, getEmptyRawAudio, getRawAudioDuration } from '../audio/AudioUtilities.js'
|
|
14
12
|
import { Timer } from '../utilities/Timer.js'
|
|
13
|
+
import { decodeUtf8, encodeUtf8 } from '../encodings/Utf8.js'
|
|
15
14
|
|
|
16
15
|
const traceEnabled = false
|
|
17
16
|
|
|
@@ -50,7 +49,7 @@ export async function synthesize(
|
|
|
50
49
|
return { rawAudio, timeline }
|
|
51
50
|
}
|
|
52
51
|
|
|
53
|
-
type SynthesisRequestResult = { audioData:
|
|
52
|
+
type SynthesisRequestResult = { audioData: Uint8Array, events: any[] }
|
|
54
53
|
|
|
55
54
|
async function requestSynthesis(
|
|
56
55
|
text: string,
|
|
@@ -104,11 +103,11 @@ async function requestSynthesis(
|
|
|
104
103
|
throw e
|
|
105
104
|
}
|
|
106
105
|
|
|
107
|
-
const receivedBinaryMessages:
|
|
106
|
+
const receivedBinaryMessages: Uint8Array[] = []
|
|
108
107
|
const receivedEventMessages: any[] = []
|
|
109
|
-
const audioChunks:
|
|
108
|
+
const audioChunks: Uint8Array[] = []
|
|
110
109
|
|
|
111
|
-
const onMessage = (messageData:
|
|
110
|
+
const onMessage = (messageData: Uint8Array, isBinary: boolean) => {
|
|
112
111
|
lastReceievedMessageTime = Timer.currentTime
|
|
113
112
|
|
|
114
113
|
if (isBinary) {
|
|
@@ -124,11 +123,11 @@ async function requestSynthesis(
|
|
|
124
123
|
log(header)
|
|
125
124
|
|
|
126
125
|
receivedBinaryMessages.push(messageData)
|
|
127
|
-
receivedBinaryMessages.push(
|
|
126
|
+
receivedBinaryMessages.push(encodeUtf8('\n\n'))
|
|
128
127
|
|
|
129
128
|
audioChunks.push(audioChunk)
|
|
130
129
|
} else {
|
|
131
|
-
const message = messageData
|
|
130
|
+
const message = decodeUtf8(messageData)
|
|
132
131
|
const [header, content] = parseTextMessage(message)
|
|
133
132
|
|
|
134
133
|
if (header['X-RequestId'] != requestId) {
|
|
@@ -147,7 +146,7 @@ async function requestSynthesis(
|
|
|
147
146
|
receivedEventMessages.push(content['Metadata'][0])
|
|
148
147
|
}
|
|
149
148
|
else if (header['Path'] == 'turn.end') {
|
|
150
|
-
const result: SynthesisRequestResult = { audioData:
|
|
149
|
+
const result: SynthesisRequestResult = { audioData: concatUint8Arrays(audioChunks), events: receivedEventMessages }
|
|
151
150
|
|
|
152
151
|
removeWebSocketHandlers()
|
|
153
152
|
|
|
@@ -167,7 +166,7 @@ async function requestSynthesis(
|
|
|
167
166
|
}
|
|
168
167
|
}
|
|
169
168
|
|
|
170
|
-
const onClose = async (code: number, reason:
|
|
169
|
+
const onClose = async (code: number, reason: Uint8Array) => {
|
|
171
170
|
log('WebSocket closed.')
|
|
172
171
|
log(code)
|
|
173
172
|
log(reason.toString())
|
|
@@ -282,7 +281,7 @@ export async function initializeWebsocketConnection(trustedClientToken: string)
|
|
|
282
281
|
requestOpenPromise.resolve(webSocket)
|
|
283
282
|
}
|
|
284
283
|
|
|
285
|
-
const onClose = (code: number, reason:
|
|
284
|
+
const onClose = (code: number, reason: Uint8Array) => {
|
|
286
285
|
log('WebSocket closed.')
|
|
287
286
|
log(code)
|
|
288
287
|
log(reason.toString())
|
|
@@ -352,11 +351,44 @@ function parseTextMessage(message: string) {
|
|
|
352
351
|
return [parseHeaderString(headerString), JSON.parse(content)]
|
|
353
352
|
}
|
|
354
353
|
|
|
355
|
-
function parseBinaryMessage(message:
|
|
356
|
-
const
|
|
354
|
+
function parseBinaryMessage(message: Uint8Array) {
|
|
355
|
+
const patternAsBytes = encodeUtf8('Path:audio\r\n')
|
|
356
|
+
const indexOfPattern = indexOfByteSubsequence(message, patternAsBytes)
|
|
357
|
+
|
|
358
|
+
if (indexOfPattern === -1) {
|
|
359
|
+
throw new Error(`Couldn't find separator pattern in Edge TTS binary message`)
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
const audioChunk = message.slice(indexOfPattern + patternAsBytes.length)
|
|
363
|
+
|
|
357
364
|
const headerBuffer = message.subarray(2, message.length - audioChunk.length)
|
|
358
|
-
const headerString = headerBuffer
|
|
365
|
+
const headerString = decodeUtf8(headerBuffer).trim()
|
|
359
366
|
|
|
360
367
|
return [parseHeaderString(headerString), audioChunk]
|
|
361
368
|
}
|
|
362
369
|
|
|
370
|
+
function indexOfByteSubsequence(sequence: Uint8Array, subsequence: Uint8Array) {
|
|
371
|
+
function tryMatchAtOffset(offset: number) {
|
|
372
|
+
if (offset + subsequence.length > sequence.length) {
|
|
373
|
+
return false
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
for (let i = 0; i < subsequence.length; i++) {
|
|
377
|
+
if (sequence[offset + i] !== subsequence[i]) {
|
|
378
|
+
return false
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
return true
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
for (let offset = 0; offset < sequence.length; offset++) {
|
|
386
|
+
const matched = tryMatchAtOffset(offset)
|
|
387
|
+
|
|
388
|
+
if (matched) {
|
|
389
|
+
return offset
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
return -1
|
|
394
|
+
}
|
package/src/synthesis/SapiTTS.ts
CHANGED
|
@@ -107,7 +107,7 @@ export function synthesize(text: string, voiceName: string, rate = 0, useSpeechP
|
|
|
107
107
|
EndStream: (streamId: number, streamPos: number) => {
|
|
108
108
|
clearInterval(dispatchMessagesInterval)
|
|
109
109
|
|
|
110
|
-
const audioData =
|
|
110
|
+
const audioData = new Uint8Array(sapiOutputStream.GetData())
|
|
111
111
|
const audioChannels = decodeToChannels(audioData, 1, 16, SampleFormat.PCM)
|
|
112
112
|
|
|
113
113
|
WinAX.release(sapiOutputStream)
|
|
@@ -92,7 +92,7 @@ export async function synthesizeFragment(text: string, voice: string) {
|
|
|
92
92
|
const audioUrl = responseObject.speak_url
|
|
93
93
|
const audioUrlResponse = await request<ArrayBuffer>({ url: audioUrl, responseType: 'arraybuffer' })
|
|
94
94
|
|
|
95
|
-
return
|
|
95
|
+
return new Uint8Array(audioUrlResponse.data)
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
export const voiceList: SynthesisVoice[] = [
|
|
@@ -5,8 +5,8 @@ import { bandwidthToQFactor } from '../dsp/BiquadFilter.js'
|
|
|
5
5
|
import { Logger } from '../utilities/Logger.js'
|
|
6
6
|
import { WasmMemoryManager } from '../utilities/WasmMemoryManager.js'
|
|
7
7
|
import { RawAudio } from '../audio/AudioUtilities.js'
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
8
|
+
import { readFileAsBinary } from '../utilities/FileSystem.js'
|
|
9
|
+
import { concatUint8Arrays } from '../utilities/Utilities.js'
|
|
10
10
|
|
|
11
11
|
let svoxPicoInstance: any
|
|
12
12
|
|
|
@@ -52,7 +52,7 @@ export async function synthesize(text: string, textAnalysisFilePath: string, sig
|
|
|
52
52
|
async function loadResource(localFilePath: string) {
|
|
53
53
|
const virtualFilePath = '.' + localFilePath.substring(localFilePath.lastIndexOf('/'))
|
|
54
54
|
|
|
55
|
-
const fileData = await
|
|
55
|
+
const fileData = await readFileAsBinary(localFilePath)
|
|
56
56
|
m.FS.writeFile(virtualFilePath, fileData)
|
|
57
57
|
|
|
58
58
|
const virtualFilePathRef = wasmMemory.allocNullTerminatedUtf8String(virtualFilePath)
|
|
@@ -109,7 +109,7 @@ export async function synthesize(text: string, textAnalysisFilePath: string, sig
|
|
|
109
109
|
|
|
110
110
|
const bytesWrittenRef = wasmMemory.allocInt32()
|
|
111
111
|
|
|
112
|
-
const audioParts:
|
|
112
|
+
const audioParts: Uint8Array[] = []
|
|
113
113
|
|
|
114
114
|
for (let textByteOffset = 0; textByteOffset < textRef.length;) {
|
|
115
115
|
bytesWrittenRef.value = 0
|
|
@@ -124,10 +124,10 @@ export async function synthesize(text: string, textAnalysisFilePath: string, sig
|
|
|
124
124
|
textByteOffset += bytesWritten
|
|
125
125
|
}
|
|
126
126
|
|
|
127
|
-
const audioData =
|
|
127
|
+
const audioData = concatUint8Arrays(audioParts)
|
|
128
128
|
|
|
129
129
|
function readAudioDataFromEngine() {
|
|
130
|
-
const outBuffers:
|
|
130
|
+
const outBuffers: Uint8Array[] = []
|
|
131
131
|
|
|
132
132
|
const outBufferLength = 16384
|
|
133
133
|
const outBufferRef = wasmMemory.allocUint8Array(outBufferLength)
|
|
@@ -148,11 +148,11 @@ export async function synthesize(text: string, textAnalysisFilePath: string, sig
|
|
|
148
148
|
}
|
|
149
149
|
|
|
150
150
|
if (outByteCount > 0) {
|
|
151
|
-
outBuffers.push(
|
|
151
|
+
outBuffers.push(outBufferRef.slice(0, outByteCount) as Uint8Array)
|
|
152
152
|
}
|
|
153
153
|
}
|
|
154
154
|
|
|
155
|
-
return
|
|
155
|
+
return concatUint8Arrays(outBuffers)
|
|
156
156
|
}
|
|
157
157
|
|
|
158
158
|
dispose()
|
package/src/synthesis/VitsTTS.ts
CHANGED
|
@@ -5,9 +5,9 @@ import { RawAudio, getEmptyRawAudio, getRawAudioDuration } from '../audio/AudioU
|
|
|
5
5
|
import { Lexicon } from '../nlp/Lexicon.js'
|
|
6
6
|
import { Timeline } from '../utilities/Timeline.js'
|
|
7
7
|
import { readAndParseJsonFile, readdir } from '../utilities/FileSystem.js'
|
|
8
|
-
import path from 'node:path'
|
|
9
8
|
import { EspeakOptions, defaultEspeakOptions } from '../synthesis/EspeakTTS.js'
|
|
10
9
|
import { OnnxExecutionProvider, getOnnxSessionOptions } from '../utilities/OnnxUtilities.js'
|
|
10
|
+
import { joinPath } from '../utilities/PathUtilities.js'
|
|
11
11
|
|
|
12
12
|
const cachedInstanceLookup = new Map<string, VitsTTS>()
|
|
13
13
|
|
|
@@ -196,7 +196,7 @@ export class VitsTTS {
|
|
|
196
196
|
throw new Error(`Couldn't file any ONNX model file in ${this.modelPath}`)
|
|
197
197
|
}
|
|
198
198
|
|
|
199
|
-
const onnxModelFilepath =
|
|
199
|
+
const onnxModelFilepath = joinPath(this.modelPath, onnxModelFilename)
|
|
200
200
|
|
|
201
201
|
const onnxSessionOptions = getOnnxSessionOptions({ executionProviders: this.executionProviders })
|
|
202
202
|
|
package/src/tests/Test.ts
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { setVoice } from '../synthesis/EspeakTTS.js'
|
|
3
|
-
import { concatBuffers, logToStderr, setupProgramTerminationListeners } from '../utilities/Utilities.js'
|
|
1
|
+
import { logToStderr, setupProgramTerminationListeners } from '../utilities/Utilities.js'
|
|
4
2
|
|
|
5
3
|
const log = logToStderr
|
|
6
4
|
|
|
@@ -9,61 +7,4 @@ setupProgramTerminationListeners()
|
|
|
9
7
|
//process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'
|
|
10
8
|
//process.env.http_proxy = 'http://localhost:8080'
|
|
11
9
|
|
|
12
|
-
if (false) {
|
|
13
|
-
for (let i = 0; i < 1000000; i++) {
|
|
14
|
-
if (i % 1000 === 0) {
|
|
15
|
-
console.log(`Iteration ${i}`)
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
await setVoice('en')
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
if (false) {
|
|
23
|
-
const fragments: string[] = []
|
|
24
|
-
|
|
25
|
-
for (let i = 0; i < 30000; i++) {
|
|
26
|
-
fragments.push(`hello`, `${i}`)
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
await createAlignmentReferenceUsingEspeakForFragments(fragments, {
|
|
30
|
-
voice: "gmw/en-US",
|
|
31
|
-
ssml: false,
|
|
32
|
-
rate: 150,
|
|
33
|
-
pitch: 50,
|
|
34
|
-
pitchRange: 50,
|
|
35
|
-
useKlatt: false,
|
|
36
|
-
insertSeparators: true,
|
|
37
|
-
})
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
if (false) {
|
|
41
|
-
const largeBuffer = Buffer.alloc(2 ** 33 + 1000)
|
|
42
|
-
|
|
43
|
-
largeBuffer.fill(111)
|
|
44
|
-
|
|
45
|
-
//const result = Buffer.concat([largeBuffer])
|
|
46
|
-
const result = concatBuffers([largeBuffer])
|
|
47
|
-
|
|
48
|
-
console.log(result)
|
|
49
|
-
|
|
50
|
-
console.log(result[result.length - 1])
|
|
51
|
-
|
|
52
|
-
const x = 0
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
if (false) {
|
|
56
|
-
const largeBuffer = Buffer.alloc(2 ** 33) // 8 GiB buffer
|
|
57
|
-
const { promisify } = await import('node:util')
|
|
58
|
-
const { default: gracefulFS } = await import('graceful-fs')
|
|
59
|
-
const gracefulFSWriteFile = promisify(gracefulFS.writeFile)
|
|
60
|
-
await gracefulFSWriteFile('out/test1', largeBuffer)
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
if (true) {
|
|
64
|
-
const largeBuffer = Buffer.alloc(2 ** 34) // 16 GiB buffer
|
|
65
|
-
const { writeFile } = await import('fs/promises')
|
|
66
|
-
await writeFile('out/test1', largeBuffer)
|
|
67
|
-
}
|
|
68
|
-
|
|
69
10
|
process.exit(0)
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import path from 'path'
|
|
2
1
|
import { languageCodeToName } from '../utilities/Locale.js'
|
|
3
2
|
import { OpenPromise } from '../utilities/OpenPromise.js'
|
|
4
3
|
import { resolveModuleMainPath, roundToDigits } from '../utilities/Utilities.js'
|
|
5
4
|
import { LanguageDetectionResults } from '../api/LanguageDetectionCommon.js'
|
|
5
|
+
import { getDirName, joinPath } from '../utilities/PathUtilities.js'
|
|
6
6
|
|
|
7
7
|
let fastTextLanguageDetectionModel: any
|
|
8
8
|
|
|
@@ -41,7 +41,7 @@ async function loadLanguageDetectionModel() {
|
|
|
41
41
|
const fastText = new FastText()
|
|
42
42
|
|
|
43
43
|
const moduleMainPath = await resolveModuleMainPath('@echogarden/fasttext-wasm')
|
|
44
|
-
const modelPath =
|
|
44
|
+
const modelPath = joinPath(getDirName(moduleMainPath), 'lid.176.ftz')
|
|
45
45
|
|
|
46
46
|
const model = await fastText.loadModel(modelPath)
|
|
47
47
|
|
package/src/typings/Fillers.d.ts
CHANGED
|
@@ -92,9 +92,7 @@ declare module 'onnxruntime-node' {
|
|
|
92
92
|
|
|
93
93
|
type RunOptions = InferenceSession.RunOptions
|
|
94
94
|
|
|
95
|
-
|
|
96
|
-
* Binding exports a simple synchronized inference session object wrap.
|
|
97
|
-
*/
|
|
95
|
+
// Binding exports a simple synchronized inference session object wrap.
|
|
98
96
|
export namespace Binding {
|
|
99
97
|
interface InferenceSession {
|
|
100
98
|
loadModel(modelPath: string, options: SessionOptions): void
|
|
@@ -115,5 +113,5 @@ declare module 'onnxruntime-node' {
|
|
|
115
113
|
}
|
|
116
114
|
|
|
117
115
|
// From version.d.ts
|
|
118
|
-
export const version = '1.
|
|
116
|
+
export const version = '1.20.0'
|
|
119
117
|
}
|