echogarden 0.12.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -14
- package/data/schemas/options.json +398 -111
- package/dist/alignment/DTWMfccSequenceAlignment.d.ts +1 -1
- package/dist/alignment/DTWMfccSequenceAlignment.js +8 -8
- package/dist/alignment/DTWSequenceAlignment.d.ts +1 -1
- package/dist/alignment/DTWSequenceAlignment.js +1 -1
- package/dist/alignment/DTWSequenceAlignmentWindowed.d.ts +1 -1
- package/dist/alignment/DTWSequenceAlignmentWindowed.js +2 -2
- package/dist/alignment/LevenshteinSequenceAlignment.d.ts +1 -1
- package/dist/alignment/LevenshteinSequenceAlignment.js +1 -1
- package/dist/alignment/SpeechAlignment.d.ts +9 -10
- package/dist/alignment/SpeechAlignment.js +136 -105
- package/dist/alignment/SpeechAlignment.js.map +1 -1
- package/dist/api/API.d.ts +13 -12
- package/dist/api/API.js +14 -13
- package/dist/api/API.js.map +1 -1
- package/dist/api/APIOptions.d.ts +5 -4
- package/dist/api/Alignment.d.ts +15 -9
- package/dist/api/Alignment.js +88 -74
- package/dist/api/Alignment.js.map +1 -1
- package/dist/api/Common.js +1 -1
- package/dist/api/Denoising.d.ts +6 -6
- package/dist/api/Denoising.js +23 -23
- package/dist/api/Denoising.js.map +1 -1
- package/dist/api/LanguageDetection.d.ts +19 -12
- package/dist/api/LanguageDetection.js +88 -38
- package/dist/api/LanguageDetection.js.map +1 -1
- package/dist/api/Recognition.d.ts +16 -6
- package/dist/api/Recognition.js +129 -55
- package/dist/api/Recognition.js.map +1 -1
- package/dist/api/SourceSeparation.d.ts +17 -0
- package/dist/api/SourceSeparation.js +61 -0
- package/dist/api/SourceSeparation.js.map +1 -0
- package/dist/api/Synthesis.d.ts +18 -18
- package/dist/api/Synthesis.js +191 -164
- package/dist/api/Synthesis.js.map +1 -1
- package/dist/api/Translation.d.ts +19 -8
- package/dist/api/Translation.js +132 -35
- package/dist/api/Translation.js.map +1 -1
- package/dist/api/Vad.d.ts +10 -5
- package/dist/api/Vad.js +76 -38
- package/dist/api/Vad.js.map +1 -1
- package/dist/audio/AudioBufferConversion.d.ts +1 -1
- package/dist/audio/AudioBufferConversion.js +4 -4
- package/dist/audio/AudioPlayer.d.ts +1 -1
- package/dist/audio/AudioPlayer.js +26 -26
- package/dist/audio/AudioPlayer.js.map +1 -1
- package/dist/audio/AudioRecorder.d.ts +1 -1
- package/dist/audio/AudioRecorder.js +5 -5
- package/dist/audio/AudioUtilities.d.ts +13 -9
- package/dist/audio/AudioUtilities.js +86 -24
- package/dist/audio/AudioUtilities.js.map +1 -1
- package/dist/cli/CLI.d.ts +3 -3
- package/dist/cli/CLI.js +271 -162
- package/dist/cli/CLI.js.map +1 -1
- package/dist/cli/CLIConfigFile.js +8 -8
- package/dist/cli/CLILauncher.js +6 -6
- package/dist/cli/CLIOptionsSchema.js +2 -2
- package/dist/cli/CLIParser.js +5 -5
- package/dist/cli/CLIStarter.js +4 -4
- package/dist/codecs/FFMpegTranscoder.d.ts +2 -2
- package/dist/codecs/FFMpegTranscoder.js +37 -37
- package/dist/codecs/FFMpegTranscoder.js.map +1 -1
- package/dist/codecs/TIMITCodec.js +5 -5
- package/dist/codecs/WaveCodec.d.ts +1 -1
- package/dist/codecs/WaveCodec.js +22 -22
- package/dist/denoising/RNNoise.d.ts +1 -1
- package/dist/denoising/RNNoise.js +9 -9
- package/dist/dsp/BiquadFilter.d.ts +3 -2
- package/dist/dsp/BiquadFilter.js +18 -11
- package/dist/dsp/BiquadFilter.js.map +1 -1
- package/dist/dsp/DecayingPeakEstimator.d.ts +16 -0
- package/dist/dsp/DecayingPeakEstimator.js +23 -0
- package/dist/dsp/DecayingPeakEstimator.js.map +1 -0
- package/dist/dsp/FFT.d.ts +8 -4
- package/dist/dsp/FFT.js +76 -30
- package/dist/dsp/FFT.js.map +1 -1
- package/dist/dsp/KWeightingFilter.d.ts +9 -0
- package/dist/dsp/KWeightingFilter.js +40 -0
- package/dist/dsp/KWeightingFilter.js.map +1 -0
- package/dist/dsp/LoudnessEstimator.d.ts +21 -0
- package/dist/dsp/LoudnessEstimator.js +47 -0
- package/dist/dsp/LoudnessEstimator.js.map +1 -0
- package/dist/dsp/MFCC.d.ts +2 -2
- package/dist/dsp/MFCC.js +15 -15
- package/dist/dsp/MelSpectogram.d.ts +1 -1
- package/dist/dsp/MelSpectogram.js +6 -6
- package/dist/dsp/Rubberband.d.ts +11 -11
- package/dist/dsp/Rubberband.js +27 -27
- package/dist/dsp/Sonic.d.ts +1 -1
- package/dist/dsp/Sonic.js +3 -3
- package/dist/dsp/SpeexResampler.d.ts +1 -1
- package/dist/dsp/SpeexResampler.js +2 -2
- package/dist/math/VectorMath.d.ts +12 -8
- package/dist/math/VectorMath.js +35 -32
- package/dist/math/VectorMath.js.map +1 -1
- package/dist/nlp/ChineseSegmentation.js +2 -2
- package/dist/nlp/CompromiseNLP.js +3 -3
- package/dist/nlp/EspeakPhonemizer.js +30 -30
- package/dist/nlp/IPA.js +20 -20
- package/dist/nlp/JapaneseSegmentation.js +6 -6
- package/dist/nlp/Lexicon.d.ts +1 -1
- package/dist/nlp/Lexicon.js +7 -7
- package/dist/nlp/Segmentation.d.ts +3 -0
- package/dist/nlp/Segmentation.js +21 -14
- package/dist/nlp/Segmentation.js.map +1 -1
- package/dist/nlp/TextNormalizer.js +16 -16
- package/dist/recognition/AmazonTranscribeSTT.d.ts +2 -2
- package/dist/recognition/AmazonTranscribeSTT.js +13 -14
- package/dist/recognition/AmazonTranscribeSTT.js.map +1 -1
- package/dist/recognition/AzureCognitiveServicesSTT.js +5 -6
- package/dist/recognition/AzureCognitiveServicesSTT.js.map +1 -1
- package/dist/recognition/GoogleCloudSTT.d.ts +3 -3
- package/dist/recognition/GoogleCloudSTT.js +18 -18
- package/dist/recognition/OpenAICloudSTT.d.ts +19 -0
- package/dist/recognition/OpenAICloudSTT.js +81 -0
- package/dist/recognition/OpenAICloudSTT.js.map +1 -0
- package/dist/recognition/SileroSTT.d.ts +2 -2
- package/dist/recognition/SileroSTT.js +25 -25
- package/dist/recognition/VoskSTT.d.ts +2 -2
- package/dist/recognition/VoskSTT.js +8 -8
- package/dist/recognition/WhisperCppSTT.d.ts +88 -0
- package/dist/recognition/WhisperCppSTT.js +332 -0
- package/dist/recognition/WhisperCppSTT.js.map +1 -0
- package/dist/recognition/WhisperSTT.d.ts +49 -25
- package/dist/recognition/WhisperSTT.js +626 -481
- package/dist/recognition/WhisperSTT.js.map +1 -1
- package/dist/server/Client.d.ts +1 -1
- package/dist/server/Client.js +22 -22
- package/dist/server/Server.js +9 -9
- package/dist/server/Server.js.map +1 -1
- package/dist/server/Worker.d.ts +22 -22
- package/dist/server/Worker.js +36 -36
- package/dist/server/Worker.js.map +1 -1
- package/dist/server/WorkerStarter.js +2 -2
- package/dist/source-separation/MDXNetSourceSeparation.d.ts +11 -0
- package/dist/source-separation/MDXNetSourceSeparation.js +161 -0
- package/dist/source-separation/MDXNetSourceSeparation.js.map +1 -0
- package/dist/speech-language-detection/SileroLanguageDetection.d.ts +1 -1
- package/dist/speech-language-detection/SileroLanguageDetection.js +7 -7
- package/dist/subtitles/Subtitles.d.ts +10 -0
- package/dist/subtitles/Subtitles.js +2 -2
- package/dist/subtitles/Subtitles.js.map +1 -1
- package/dist/synthesis/AwsPollyTTS.d.ts +1 -1
- package/dist/synthesis/AwsPollyTTS.js +12 -12
- package/dist/synthesis/AzureCognitiveServicesTTS.js +7 -7
- package/dist/synthesis/CoquiServerTTS.js +10 -10
- package/dist/synthesis/CoquiServerTTS.js.map +1 -1
- package/dist/synthesis/ElevenlabsTTS.d.ts +23 -0
- package/dist/synthesis/ElevenlabsTTS.js +103 -0
- package/dist/synthesis/ElevenlabsTTS.js.map +1 -0
- package/dist/synthesis/EspeakTTS.d.ts +6 -5
- package/dist/synthesis/EspeakTTS.js +81 -69
- package/dist/synthesis/EspeakTTS.js.map +1 -1
- package/dist/synthesis/FliteTTS.d.ts +3 -3
- package/dist/synthesis/FliteTTS.js +154 -154
- package/dist/synthesis/FliteTTS.js.map +1 -1
- package/dist/synthesis/GoogleCloudTTS.d.ts +3 -3
- package/dist/synthesis/GoogleCloudTTS.js +17 -17
- package/dist/synthesis/GoogleCloudTTS.js.map +1 -1
- package/dist/synthesis/GoogleTranslateTTS.d.ts +1 -1
- package/dist/synthesis/GoogleTranslateTTS.js +103 -103
- package/dist/synthesis/MicrosoftEdgeTTS.d.ts +2 -2
- package/dist/synthesis/MicrosoftEdgeTTS.js +74 -74
- package/dist/synthesis/OpenAICloudTTS.d.ts +13 -0
- package/dist/synthesis/OpenAICloudTTS.js +169 -0
- package/dist/synthesis/OpenAICloudTTS.js.map +1 -0
- package/dist/synthesis/SamTTS.js +3 -3
- package/dist/synthesis/SapiTTS.d.ts +3 -3
- package/dist/synthesis/SapiTTS.js +26 -26
- package/dist/synthesis/StreamlabsPollyTTS.d.ts +2 -2
- package/dist/synthesis/StreamlabsPollyTTS.js +27 -27
- package/dist/synthesis/SvoxPicoTTS.d.ts +2 -2
- package/dist/synthesis/SvoxPicoTTS.js +65 -65
- package/dist/synthesis/SvoxPicoTTS.js.map +1 -1
- package/dist/synthesis/VitsTTS.d.ts +3 -3
- package/dist/synthesis/VitsTTS.js +378 -378
- package/dist/synthesis/VitsTTS.js.map +1 -1
- package/dist/tests/Test.js +2 -2
- package/dist/utilities/Compression.d.ts +5 -0
- package/dist/utilities/Compression.js +29 -13
- package/dist/utilities/Compression.js.map +1 -1
- package/dist/utilities/FileDownloader.d.ts +1 -1
- package/dist/utilities/FileDownloader.js +16 -16
- package/dist/utilities/FileSystem.js +7 -7
- package/dist/utilities/Locale.d.ts +7 -7
- package/dist/utilities/Locale.js +15 -15
- package/dist/utilities/Logger.js +3 -3
- package/dist/utilities/ObjectUtilities.js +19 -19
- package/dist/utilities/OpenPromise.js +2 -2
- package/dist/utilities/OpenPromise.js.map +1 -1
- package/dist/utilities/PackageManager.js +31 -0
- package/dist/utilities/PackageManager.js.map +1 -1
- package/dist/utilities/PathUtilities.js +8 -8
- package/dist/utilities/RandomGenerator.js +2 -2
- package/dist/utilities/SmoothEstimator.d.ts +8 -0
- package/dist/utilities/SmoothEstimator.js +25 -0
- package/dist/utilities/SmoothEstimator.js.map +1 -0
- package/dist/utilities/TarballMaker.js +8 -8
- package/dist/utilities/Timeline.d.ts +3 -2
- package/dist/utilities/Timeline.js +11 -11
- package/dist/utilities/Timeline.js.map +1 -1
- package/dist/utilities/Timer.js +4 -4
- package/dist/utilities/Utilities.d.ts +4 -0
- package/dist/utilities/Utilities.js +38 -15
- package/dist/utilities/Utilities.js.map +1 -1
- package/dist/utilities/WasmMemoryManager.js +7 -7
- package/dist/utilities/WebReader.js +23 -23
- package/dist/utilities/WikipediaReader.js +2 -2
- package/dist/voice-activity-detection/AdaptiveGateVAD.d.ts +28 -0
- package/dist/voice-activity-detection/AdaptiveGateVAD.js +138 -0
- package/dist/voice-activity-detection/AdaptiveGateVAD.js.map +1 -0
- package/dist/voice-activity-detection/SileroVAD.d.ts +1 -1
- package/dist/voice-activity-detection/SileroVAD.js +5 -5
- package/dist/voice-activity-detection/SileroVAD.js.map +1 -1
- package/dist/voice-activity-detection/WebRtcVAD.d.ts +1 -1
- package/dist/voice-activity-detection/WebRtcVAD.js +4 -4
- package/docs/API.md +29 -11
- package/docs/CLI.md +31 -7
- package/docs/Contributing.md +38 -0
- package/docs/Development.md +93 -19
- package/docs/Engines.md +28 -16
- package/docs/Licenses.md +4 -1
- package/docs/Options.md +158 -78
- package/docs/Releases.md +262 -0
- package/docs/Server.md +7 -7
- package/docs/Tasklist.md +95 -76
- package/docs/Technical.md +4 -4
- package/package.json +13 -14
- package/src/alignment/DTWMfccSequenceAlignment.ts +9 -9
- package/src/alignment/DTWSequenceAlignment.ts +2 -2
- package/src/alignment/DTWSequenceAlignmentWindowed.ts +3 -3
- package/src/alignment/LevenshteinSequenceAlignment.ts +2 -2
- package/src/alignment/SpeechAlignment.ts +204 -119
- package/src/api/API.ts +14 -13
- package/src/api/APIOptions.ts +12 -11
- package/src/api/Alignment.ts +147 -90
- package/src/api/Common.ts +1 -1
- package/src/api/Denoising.ts +28 -28
- package/src/api/LanguageDetection.ts +135 -48
- package/src/api/Recognition.ts +198 -59
- package/src/api/SourceSeparation.ts +99 -0
- package/src/api/Synthesis.ts +217 -181
- package/src/api/Translation.ts +193 -40
- package/src/api/Vad.ts +110 -41
- package/src/audio/AudioBufferConversion.ts +4 -4
- package/src/audio/AudioPlayer.ts +27 -27
- package/src/audio/AudioRecorder.ts +5 -5
- package/src/audio/AudioUtilities.ts +107 -24
- package/src/cli/CLI.ts +313 -164
- package/src/cli/CLIConfigFile.ts +8 -8
- package/src/cli/CLILauncher.ts +6 -6
- package/src/cli/CLIOptionsSchema.ts +2 -2
- package/src/cli/CLIParser.ts +5 -5
- package/src/cli/CLIStarter.ts +4 -4
- package/src/codecs/FFMpegTranscoder.ts +38 -38
- package/src/codecs/TIMITCodec.ts +5 -5
- package/src/codecs/WaveCodec.ts +22 -22
- package/src/denoising/RNNoise.ts +9 -9
- package/src/dsp/BiquadFilter.ts +19 -11
- package/src/dsp/DecayingPeakEstimator.ts +35 -0
- package/src/dsp/FFT.ts +103 -35
- package/src/dsp/KWeightingFilter.ts +43 -0
- package/src/dsp/LoudnessEstimator.ts +74 -0
- package/src/dsp/MFCC.ts +15 -15
- package/src/dsp/MelSpectogram.ts +7 -7
- package/src/dsp/Rubberband.ts +38 -38
- package/src/dsp/Sonic.ts +4 -4
- package/src/dsp/SpeexResampler.ts +2 -2
- package/src/math/VectorMath.ts +42 -33
- package/src/nlp/ChineseSegmentation.ts +3 -3
- package/src/nlp/CompromiseNLP.ts +3 -3
- package/src/nlp/EspeakPhonemizer.ts +30 -30
- package/src/nlp/IPA.ts +20 -20
- package/src/nlp/JapaneseSegmentation.ts +6 -6
- package/src/nlp/Lexicon.ts +8 -8
- package/src/nlp/Segmentation.ts +23 -14
- package/src/nlp/TextNormalizer.ts +16 -16
- package/src/recognition/AmazonTranscribeSTT.ts +16 -17
- package/src/recognition/AzureCognitiveServicesSTT.ts +8 -6
- package/src/recognition/GoogleCloudSTT.ts +21 -21
- package/src/recognition/OpenAICloudSTT.ts +142 -0
- package/src/recognition/SileroSTT.ts +26 -26
- package/src/recognition/VoskSTT.ts +10 -10
- package/src/recognition/WhisperCppSTT.ts +555 -0
- package/src/recognition/WhisperSTT.ts +760 -507
- package/src/server/Client.ts +23 -23
- package/src/server/Server.ts +9 -9
- package/src/server/Worker.ts +53 -53
- package/src/server/WorkerStarter.ts +2 -2
- package/src/source-separation/MDXNetSourceSeparation.ts +228 -0
- package/src/speech-language-detection/SileroLanguageDetection.ts +8 -8
- package/src/subtitles/Subtitles.ts +3 -3
- package/src/synthesis/AwsPollyTTS.ts +14 -14
- package/src/synthesis/AzureCognitiveServicesTTS.ts +10 -10
- package/src/synthesis/CoquiServerTTS.ts +10 -10
- package/src/synthesis/ElevenlabsTTS.ts +137 -0
- package/src/synthesis/EspeakTTS.ts +90 -71
- package/src/synthesis/FliteTTS.ts +157 -157
- package/src/synthesis/GoogleCloudTTS.ts +19 -19
- package/src/synthesis/GoogleTranslateTTS.ts +104 -104
- package/src/synthesis/MicrosoftEdgeTTS.ts +80 -80
- package/src/synthesis/OpenAICloudTTS.ts +196 -0
- package/src/synthesis/SamTTS.ts +3 -3
- package/src/synthesis/SapiTTS.ts +29 -29
- package/src/synthesis/StreamlabsPollyTTS.ts +29 -29
- package/src/synthesis/SvoxPicoTTS.ts +67 -67
- package/src/synthesis/VitsTTS.ts +380 -380
- package/src/tests/Test.ts +4 -4
- package/src/utilities/Compression.ts +34 -13
- package/src/utilities/FileDownloader.ts +19 -19
- package/src/utilities/FileSystem.ts +7 -7
- package/src/utilities/Locale.ts +22 -22
- package/src/utilities/Logger.ts +4 -4
- package/src/utilities/ObjectUtilities.ts +19 -19
- package/src/utilities/OpenPromise.ts +2 -2
- package/src/utilities/PackageManager.ts +40 -0
- package/src/utilities/PathUtilities.ts +8 -8
- package/src/utilities/RandomGenerator.ts +3 -3
- package/src/utilities/SmoothEstimator.ts +35 -0
- package/src/utilities/TarballMaker.ts +9 -9
- package/src/utilities/Timeline.ts +15 -13
- package/src/utilities/Timer.ts +4 -4
- package/src/utilities/Utilities.ts +49 -15
- package/src/utilities/WasmMemoryManager.ts +7 -7
- package/src/utilities/WebReader.ts +23 -23
- package/src/utilities/WikipediaReader.ts +2 -2
- package/src/voice-activity-detection/AdaptiveGateVAD.ts +202 -0
- package/src/voice-activity-detection/SileroVAD.ts +5 -5
- package/src/voice-activity-detection/WebRtcVAD.ts +5 -5
- package/dist/synthesis/ElevenLabsTTS.d.ts +0 -8
- package/dist/synthesis/ElevenLabsTTS.js +0 -82
- package/dist/synthesis/ElevenLabsTTS.js.map +0 -1
- package/src/synthesis/ElevenLabsTTS.ts +0 -104
|
@@ -1,16 +1,25 @@
|
|
|
1
|
-
import { clip } from
|
|
1
|
+
import { clip } from '../utilities/Utilities.js'
|
|
2
|
+
|
|
3
|
+
import * as API from '../api/API.js'
|
|
4
|
+
|
|
5
|
+
import { computeMFCCs, extendDefaultMfccOptions, MfccOptions } from '../dsp/MFCC.js'
|
|
6
|
+
import { alignMFCC_DTW, getCostMatrixMemorySizeMB } from './DTWMfccSequenceAlignment.js'
|
|
7
|
+
import { Logger } from '../utilities/Logger.js'
|
|
8
|
+
import { Timeline, TimelineEntry } from '../utilities/Timeline.js'
|
|
9
|
+
import { downmixToMonoAndNormalize, getEndingSilentSampleCount, getRawAudioDuration, getStartingSilentSampleCount, RawAudio } from '../audio/AudioUtilities.js'
|
|
10
|
+
import chalk from 'chalk'
|
|
11
|
+
import { synthesize } from '../api/API.js'
|
|
12
|
+
import { resampleAudioSpeex } from '../dsp/SpeexResampler.js'
|
|
13
|
+
import { deepClone } from '../utilities/ObjectUtilities.js'
|
|
14
|
+
import { zeroIfNaN } from '../math/VectorMath.js'
|
|
15
|
+
|
|
16
|
+
export async function alignUsingDtw(
|
|
17
|
+
sourceRawAudio: RawAudio,
|
|
18
|
+
referenceRawAudio: RawAudio,
|
|
19
|
+
referenceTimeline: Timeline,
|
|
20
|
+
granularities: DtwGranularity[],
|
|
21
|
+
windowDurations: number[]) {
|
|
2
22
|
|
|
3
|
-
import * as API from "../api/API.js"
|
|
4
|
-
|
|
5
|
-
import { computeMFCCs, extendDefaultMfccOptions, MfccOptions } from "../dsp/MFCC.js"
|
|
6
|
-
import { alignMFCC_DTW, getCostMatrixMemorySizeMB } from "./DTWMfccSequenceAlignment.js"
|
|
7
|
-
import { Logger } from "../utilities/Logger.js"
|
|
8
|
-
import { Timeline, TimelineEntry } from "../utilities/Timeline.js"
|
|
9
|
-
import { getEndingSilentSampleCount, getRawAudioDuration, getStartingSilentSampleCount, RawAudio } from "../audio/AudioUtilities.js"
|
|
10
|
-
import { type EspeakOptions } from "../synthesis/EspeakTTS.js"
|
|
11
|
-
import chalk from "chalk"
|
|
12
|
-
|
|
13
|
-
export async function alignUsingDtw(sourceRawAudio: RawAudio, referenceRawAudio: RawAudio, referenceTimeline: Timeline, granularities: DtwGranularity[], windowDurations: number[]) {
|
|
14
23
|
const logger = new Logger()
|
|
15
24
|
|
|
16
25
|
if (windowDurations.length == 0) {
|
|
@@ -38,11 +47,11 @@ export async function alignUsingDtw(sourceRawAudio: RawAudio, referenceRawAudio:
|
|
|
38
47
|
framesPerSecond = 1 / mfccOptions.hopDuration!
|
|
39
48
|
|
|
40
49
|
// Compute reference MFCCs
|
|
41
|
-
logger.start(
|
|
50
|
+
logger.start('Compute reference MFCC features')
|
|
42
51
|
const referenceMfccs = await computeMFCCs(referenceRawAudio, mfccOptions)
|
|
43
52
|
|
|
44
53
|
// Compute source MFCCs
|
|
45
|
-
logger.start(
|
|
54
|
+
logger.start('Compute source MFCC features')
|
|
46
55
|
const sourceMfccs = await computeMFCCs(sourceRawAudio, mfccOptions)
|
|
47
56
|
logger.end()
|
|
48
57
|
|
|
@@ -52,12 +61,12 @@ export async function alignUsingDtw(sourceRawAudio: RawAudio, referenceRawAudio:
|
|
|
52
61
|
if (passIndex == 0) {
|
|
53
62
|
const minRecommendedWindowDuration = 0.2 * rawAudioDuration
|
|
54
63
|
|
|
55
|
-
if (windowDuration < minRecommendedWindowDuration
|
|
64
|
+
if (windowDuration < minRecommendedWindowDuration) {
|
|
56
65
|
logger.logTitledMessage('Warning', `Maximum DTW window duration is set to ${windowDuration.toFixed(1)}s, which is smaller than 20% of the source audio duration of ${rawAudioDuration.toFixed(1)}s. This may lead to suboptimal results in some cases. Consider increasing window duration if needed.`, chalk.yellowBright)
|
|
57
66
|
}
|
|
58
67
|
}
|
|
59
68
|
|
|
60
|
-
logger.start(
|
|
69
|
+
logger.start('Align MFCC features using DTW')
|
|
61
70
|
const dtwWindowLength = Math.floor(windowDuration * framesPerSecond)
|
|
62
71
|
|
|
63
72
|
let centerIndexes: number[] | undefined
|
|
@@ -85,18 +94,18 @@ export async function alignUsingDtw(sourceRawAudio: RawAudio, referenceRawAudio:
|
|
|
85
94
|
logger.end()
|
|
86
95
|
}
|
|
87
96
|
|
|
88
|
-
logger.start(
|
|
97
|
+
logger.start('\nConvert path to timeline')
|
|
89
98
|
|
|
90
99
|
function getMappedTimelineEntry(timelineEntry: TimelineEntry, recurse = true): TimelineEntry {
|
|
91
100
|
const referenceStartFrameIndex = Math.floor(timelineEntry.startTime * framesPerSecond)
|
|
92
101
|
const referenceEndFrameIndex = Math.floor(timelineEntry.endTime * framesPerSecond)
|
|
93
102
|
|
|
94
103
|
if (referenceStartFrameIndex < 0 || referenceEndFrameIndex < 0) {
|
|
95
|
-
throw new Error(
|
|
104
|
+
throw new Error('Unexpected: encountered a negative timestamp in timeline')
|
|
96
105
|
}
|
|
97
106
|
|
|
98
|
-
const mappedStartFrameIndex = getMappedFrameIndexForPath(referenceStartFrameIndex, compactedPath,
|
|
99
|
-
const mappedEndFrameIndex = getMappedFrameIndexForPath(referenceEndFrameIndex, compactedPath,
|
|
107
|
+
const mappedStartFrameIndex = getMappedFrameIndexForPath(referenceStartFrameIndex, compactedPath, 'first')
|
|
108
|
+
const mappedEndFrameIndex = getMappedFrameIndexForPath(referenceEndFrameIndex, compactedPath, 'first')
|
|
100
109
|
|
|
101
110
|
let innerTimeline: Timeline | undefined
|
|
102
111
|
|
|
@@ -141,7 +150,17 @@ export async function alignUsingDtw(sourceRawAudio: RawAudio, referenceRawAudio:
|
|
|
141
150
|
return mappedTimeline
|
|
142
151
|
}
|
|
143
152
|
|
|
144
|
-
export async function alignUsingDtwWithRecognition(
|
|
153
|
+
export async function alignUsingDtwWithRecognition(
|
|
154
|
+
sourceRawAudio: RawAudio,
|
|
155
|
+
referenceRawAudio: RawAudio,
|
|
156
|
+
referenceTimeline: Timeline,
|
|
157
|
+
recognitionTimeline: Timeline,
|
|
158
|
+
synthesizedRecognizedTranscriptRawAudio: RawAudio,
|
|
159
|
+
synthesizedRecognitionTimeline: Timeline,
|
|
160
|
+
granularities: DtwGranularity[],
|
|
161
|
+
windowDurations: number[],
|
|
162
|
+
phoneAlignmentMethod: API.PhoneAlignmentMethod = 'interpolation') {
|
|
163
|
+
|
|
145
164
|
const logger = new Logger()
|
|
146
165
|
|
|
147
166
|
if (recognitionTimeline.length == 0) {
|
|
@@ -163,100 +182,109 @@ export async function alignUsingDtwWithRecognition(sourceRawAudio: RawAudio, ref
|
|
|
163
182
|
return interpolatedTimeline
|
|
164
183
|
}
|
|
165
184
|
|
|
166
|
-
// Synthesize the recognized transcript and get its timeline
|
|
167
|
-
logger.start("Synthesize recognized transcript with eSpeak")
|
|
168
|
-
const recognizedWords = recognitionTimeline.map(entry => entry.text)
|
|
169
|
-
|
|
170
|
-
const { rawAudio: synthesizedRecognizedTranscriptRawAudio, timeline: synthesizedRecognitionTimeline } = await createAlignmentReferenceUsingEspeakForFragments(recognizedWords, espeakOptions)
|
|
171
|
-
|
|
172
185
|
let recognitionTimelineWithPhones: Timeline
|
|
173
186
|
|
|
174
|
-
if (phoneAlignmentMethod ==
|
|
187
|
+
if (phoneAlignmentMethod == 'interpolation') {
|
|
175
188
|
// Add phone timelines by interpolating from reference words
|
|
176
|
-
logger.start(
|
|
189
|
+
logger.start('Interpolate phone timing')
|
|
177
190
|
|
|
178
191
|
recognitionTimelineWithPhones = await interpolatePhoneTimelines(recognitionTimeline, synthesizedRecognitionTimeline)
|
|
179
|
-
} else if (phoneAlignmentMethod ==
|
|
180
|
-
logger.start(
|
|
192
|
+
} else if (phoneAlignmentMethod == 'dtw') {
|
|
193
|
+
logger.start('Align phone timing')
|
|
181
194
|
|
|
182
195
|
// Add phone timelines by aligning each individual recognized word with the corresponding word
|
|
183
196
|
// in the reference timeline
|
|
184
|
-
recognitionTimelineWithPhones = await alignPhoneTimelines(
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
197
|
+
recognitionTimelineWithPhones = await alignPhoneTimelines(
|
|
198
|
+
sourceRawAudio,
|
|
199
|
+
recognitionTimeline,
|
|
200
|
+
synthesizedRecognizedTranscriptRawAudio,
|
|
201
|
+
synthesizedRecognitionTimeline,
|
|
202
|
+
60)
|
|
188
203
|
} else {
|
|
189
204
|
throw new Error(`Unknown phone alignment method: ${phoneAlignmentMethod}`)
|
|
190
205
|
}
|
|
191
206
|
|
|
192
|
-
logger.start("Map from the synthesized recognized timeline to the recognized timeline")
|
|
193
207
|
// Create a mapping from the synthesized recognized timeline to the recognized timeline
|
|
208
|
+
logger.start('Map from the synthesized recognized timeline to the recognized timeline')
|
|
209
|
+
|
|
210
|
+
type SynthesizedToRecognizedTimeMappingEntry = {
|
|
211
|
+
synthesized: number
|
|
212
|
+
recognized: number
|
|
213
|
+
}
|
|
214
|
+
|
|
194
215
|
type SynthesizedToRecognizedTimeMapping = SynthesizedToRecognizedTimeMappingEntry[]
|
|
195
|
-
type SynthesizedToRecognizedTimeMappingEntry = { synthesized: number, recognized: number }
|
|
196
216
|
|
|
197
217
|
const synthesizedToRecognizedTimeMapping: SynthesizedToRecognizedTimeMapping = []
|
|
198
218
|
|
|
199
|
-
for (let
|
|
200
|
-
const
|
|
201
|
-
const
|
|
219
|
+
for (let wordEntryIndex = 0; wordEntryIndex < synthesizedRecognitionTimeline.length; wordEntryIndex++) {
|
|
220
|
+
const synthesizedWordTimelineEntry = synthesizedRecognitionTimeline[wordEntryIndex]
|
|
221
|
+
const recognitionWordTimelineEntry = recognitionTimelineWithPhones[wordEntryIndex]
|
|
222
|
+
|
|
223
|
+
for (let tokenEntryIndex = 0; tokenEntryIndex < synthesizedWordTimelineEntry.timeline!.length; tokenEntryIndex++) {
|
|
224
|
+
const synthesizedTokenTimelineEntry = synthesizedWordTimelineEntry.timeline![tokenEntryIndex]
|
|
225
|
+
const recognitionTokenTimelineEntry = recognitionWordTimelineEntry.timeline![tokenEntryIndex]
|
|
202
226
|
|
|
203
|
-
|
|
227
|
+
for (let phoneEntryIndex = 0; phoneEntryIndex < synthesizedTokenTimelineEntry.timeline!.length; phoneEntryIndex++) {
|
|
228
|
+
const synthesizedPhoneTimelineEntry = synthesizedTokenTimelineEntry.timeline![phoneEntryIndex]
|
|
229
|
+
const recognitionPhoneTimelineEntry = recognitionTokenTimelineEntry.timeline![phoneEntryIndex]
|
|
204
230
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
231
|
+
synthesizedToRecognizedTimeMapping.push({
|
|
232
|
+
synthesized: synthesizedPhoneTimelineEntry.startTime,
|
|
233
|
+
recognized: recognitionPhoneTimelineEntry.startTime
|
|
234
|
+
})
|
|
209
235
|
|
|
210
|
-
synthesizedToRecognizedTimeMapping.push({
|
|
211
|
-
|
|
236
|
+
synthesizedToRecognizedTimeMapping.push({
|
|
237
|
+
synthesized: synthesizedPhoneTimelineEntry.endTime,
|
|
238
|
+
recognized: recognitionPhoneTimelineEntry.endTime
|
|
239
|
+
})
|
|
212
240
|
}
|
|
213
241
|
}
|
|
214
|
-
|
|
215
|
-
synthesizedToRecognizedTimeMapping.push({ synthesized: synthesizedTimelineEntry.endTime, recognized: recognitionTimelineEntry.endTime })
|
|
216
242
|
}
|
|
217
243
|
|
|
218
|
-
logger.start(
|
|
244
|
+
logger.start('Align the synthesized recognized transcript with the synthesized ground-truth transcript')
|
|
219
245
|
// Align the synthesized recognized transcript to the synthesized reference transcript
|
|
220
|
-
const alignedSynthesizedRecognitionTimeline = await alignUsingDtw(
|
|
246
|
+
const alignedSynthesizedRecognitionTimeline = await alignUsingDtw(
|
|
247
|
+
synthesizedRecognizedTranscriptRawAudio,
|
|
248
|
+
referenceRawAudio,
|
|
249
|
+
referenceTimeline,
|
|
250
|
+
granularities,
|
|
251
|
+
windowDurations)
|
|
221
252
|
|
|
222
|
-
|
|
253
|
+
function mapTimeline(timeline: Timeline) {
|
|
254
|
+
function mapSynthesizedToRecognizedTime(synthesizedTime: number) {
|
|
255
|
+
for (let mappingIndex = 0; ; mappingIndex += 1) {
|
|
256
|
+
const left = synthesizedToRecognizedTimeMapping[mappingIndex].synthesized
|
|
223
257
|
|
|
224
|
-
|
|
225
|
-
for (; ; currentSynthesizedToRecognizedMappingIndex += 1) {
|
|
226
|
-
const left = synthesizedToRecognizedTimeMapping[currentSynthesizedToRecognizedMappingIndex].synthesized
|
|
258
|
+
let right: number
|
|
227
259
|
|
|
228
|
-
|
|
260
|
+
if (mappingIndex < synthesizedToRecognizedTimeMapping.length - 1) {
|
|
261
|
+
right = synthesizedToRecognizedTimeMapping[mappingIndex + 1].synthesized
|
|
262
|
+
} else {
|
|
263
|
+
right = Infinity
|
|
264
|
+
}
|
|
229
265
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
right = Infinity
|
|
234
|
-
}
|
|
266
|
+
if (left > right) {
|
|
267
|
+
throw new Error('Left is greater than right!')
|
|
268
|
+
}
|
|
235
269
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
if (Math.abs(synthesizedTime - left) < Math.abs(synthesizedTime - right)) {
|
|
241
|
-
return synthesizedToRecognizedTimeMapping[currentSynthesizedToRecognizedMappingIndex].recognized
|
|
270
|
+
if (Math.abs(synthesizedTime - left) < Math.abs(synthesizedTime - right)) {
|
|
271
|
+
return synthesizedToRecognizedTimeMapping[mappingIndex].recognized
|
|
272
|
+
}
|
|
242
273
|
}
|
|
243
274
|
}
|
|
244
|
-
}
|
|
245
275
|
|
|
246
|
-
function mapTimeline(timeline: Timeline) {
|
|
247
276
|
const mappedTimeline: Timeline = []
|
|
248
277
|
|
|
249
278
|
for (const entry of timeline) {
|
|
250
|
-
const mappedEntry =
|
|
279
|
+
const mappedEntry = deepClone(entry)
|
|
251
280
|
|
|
252
|
-
mappedEntry.startTime =
|
|
281
|
+
mappedEntry.startTime = mapSynthesizedToRecognizedTime(entry.startTime)
|
|
282
|
+
mappedEntry.endTime = mapSynthesizedToRecognizedTime(entry.endTime)
|
|
253
283
|
|
|
254
284
|
if (entry.timeline) {
|
|
255
285
|
mappedEntry.timeline = mapTimeline(entry.timeline)
|
|
256
286
|
}
|
|
257
287
|
|
|
258
|
-
mappedEntry.endTime = mapSynthesizedToRecognizedTimeAndAdvance(entry.endTime)
|
|
259
|
-
|
|
260
288
|
mappedTimeline.push(mappedEntry)
|
|
261
289
|
}
|
|
262
290
|
|
|
@@ -276,41 +304,66 @@ export async function interpolatePhoneTimelines(sourceTimeline: Timeline, refere
|
|
|
276
304
|
for (let i = 0; i < sourceTimeline.length; i++) {
|
|
277
305
|
const referenceEntry = referenceTimeline[i]
|
|
278
306
|
|
|
279
|
-
const interpolatedEntry =
|
|
307
|
+
const interpolatedEntry = deepClone(sourceTimeline[i])
|
|
280
308
|
interpolatedTimeline.push(interpolatedEntry)
|
|
281
309
|
|
|
282
|
-
if (interpolatedEntry.type !=
|
|
310
|
+
if (interpolatedEntry.type != 'word') {
|
|
283
311
|
continue
|
|
284
312
|
}
|
|
285
313
|
|
|
286
314
|
const interpolatedEntryDuration = interpolatedEntry.endTime - interpolatedEntry.startTime
|
|
287
315
|
const synthesisEntryDuration = referenceEntry.endTime - referenceEntry.startTime
|
|
288
316
|
|
|
289
|
-
|
|
317
|
+
function mapEntry(targetEntry: TimelineEntry): TimelineEntry {
|
|
318
|
+
const targetStartTimePercentageRelativeToWord =
|
|
319
|
+
(targetEntry.startTime - referenceEntry.startTime) / synthesisEntryDuration
|
|
290
320
|
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
(phoneEntry.startTime - referenceEntry.startTime) / synthesisEntryDuration
|
|
321
|
+
const targetEndTimePercentageRelativeToWord =
|
|
322
|
+
(targetEntry.endTime - referenceEntry.startTime) / synthesisEntryDuration
|
|
294
323
|
|
|
295
|
-
const
|
|
296
|
-
|
|
324
|
+
const interpolatedStartTime =
|
|
325
|
+
interpolatedEntry.startTime + (zeroIfNaN(targetStartTimePercentageRelativeToWord) * interpolatedEntryDuration)
|
|
297
326
|
|
|
298
|
-
const
|
|
299
|
-
|
|
327
|
+
const interpolatedEndTime =
|
|
328
|
+
interpolatedEntry.startTime + (zeroIfNaN(targetEndTimePercentageRelativeToWord) * interpolatedEntryDuration)
|
|
300
329
|
|
|
301
|
-
|
|
302
|
-
...
|
|
330
|
+
return {
|
|
331
|
+
...targetEntry,
|
|
303
332
|
|
|
304
|
-
startTime:
|
|
305
|
-
endTime:
|
|
306
|
-
}
|
|
333
|
+
startTime: interpolatedStartTime,
|
|
334
|
+
endTime: interpolatedEndTime
|
|
335
|
+
}
|
|
307
336
|
}
|
|
337
|
+
|
|
338
|
+
const interpolatedTokenEntries: Timeline = []
|
|
339
|
+
|
|
340
|
+
for (const tokenEntry of (referenceEntry.timeline || [])!) {
|
|
341
|
+
const interpolatedTokenEntry = mapEntry(tokenEntry)
|
|
342
|
+
|
|
343
|
+
const interpolatedPhoneEntries: Timeline = []
|
|
344
|
+
|
|
345
|
+
for (const phoneEntry of (tokenEntry.timeline || [])) {
|
|
346
|
+
interpolatedPhoneEntries.push(mapEntry(phoneEntry))
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
interpolatedTokenEntry.timeline = interpolatedPhoneEntries
|
|
350
|
+
|
|
351
|
+
interpolatedTokenEntries.push(interpolatedTokenEntry)
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
interpolatedEntry.timeline = interpolatedTokenEntries
|
|
308
355
|
}
|
|
309
356
|
|
|
310
357
|
return interpolatedTimeline
|
|
311
358
|
}
|
|
312
359
|
|
|
313
|
-
export async function alignPhoneTimelines(
|
|
360
|
+
export async function alignPhoneTimelines(
|
|
361
|
+
sourceRawAudio: RawAudio,
|
|
362
|
+
sourceWordTimeline: Timeline,
|
|
363
|
+
referenceRawAudio: RawAudio,
|
|
364
|
+
referenceTimeline: Timeline,
|
|
365
|
+
windowDuration: number) {
|
|
366
|
+
|
|
314
367
|
const mfccOptions: MfccOptions = extendDefaultMfccOptions({ zeroFirstCoefficient: true })
|
|
315
368
|
|
|
316
369
|
const framesPerSecond = 1 / mfccOptions.hopDuration!
|
|
@@ -323,10 +376,9 @@ export async function alignPhoneTimelines(sourceRawAudio: RawAudio, sourceWordTi
|
|
|
323
376
|
for (let i = 0; i < referenceTimeline.length; i++) {
|
|
324
377
|
const referenceWordEntry = referenceTimeline[i]
|
|
325
378
|
|
|
326
|
-
const alignedWordEntry =
|
|
327
|
-
alignedWordTimeline.push(alignedWordEntry)
|
|
379
|
+
const alignedWordEntry = deepClone(sourceWordTimeline[i])
|
|
328
380
|
|
|
329
|
-
if (alignedWordEntry.type !=
|
|
381
|
+
if (alignedWordEntry.type != 'word') {
|
|
330
382
|
continue
|
|
331
383
|
}
|
|
332
384
|
|
|
@@ -351,51 +403,84 @@ export async function alignPhoneTimelines(sourceRawAudio: RawAudio, sourceWordTi
|
|
|
351
403
|
const sourceWordMfccs = sourceMfccs.slice(alignedWordStartFrameIndex, alignedWordEndFrameIndex)
|
|
352
404
|
|
|
353
405
|
// Compute DTW path
|
|
354
|
-
const rawPath = await alignMFCC_DTW(referenceWordMfccs, sourceWordMfccs,
|
|
406
|
+
const rawPath = await alignMFCC_DTW(referenceWordMfccs, sourceWordMfccs, windowDuration * framesPerSecond)
|
|
355
407
|
const compactedPath = compactPath(rawPath)
|
|
356
408
|
|
|
409
|
+
function mapEntry(referenceEntry: TimelineEntry): TimelineEntry {
|
|
410
|
+
const referenceStartFrameOffset = Math.floor((referenceEntry.startTime - referenceWordEntry.startTime) * framesPerSecond)
|
|
411
|
+
const alignedStartFrameOffset = getMappedFrameIndexForPath(referenceStartFrameOffset, compactedPath)
|
|
412
|
+
const alignedStartTime = alignedWordEntry.startTime + (alignedStartFrameOffset / framesPerSecond)
|
|
413
|
+
|
|
414
|
+
const referenceEndFrameOffset = Math.floor((referenceEntry.endTime - referenceWordEntry.startTime) * framesPerSecond)
|
|
415
|
+
const alignedEndFrameOffset = getMappedFrameIndexForPath(referenceEndFrameOffset, compactedPath)
|
|
416
|
+
const alignedEndTime = alignedWordEntry.startTime + (alignedEndFrameOffset / framesPerSecond)
|
|
417
|
+
|
|
418
|
+
return {
|
|
419
|
+
...referenceEntry,
|
|
420
|
+
|
|
421
|
+
startTime: alignedStartTime,
|
|
422
|
+
endTime: alignedEndTime
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
|
|
357
426
|
// Add phone timeline using the mapped time information
|
|
358
|
-
|
|
427
|
+
const alignedTokenTimeline: Timeline = []
|
|
428
|
+
|
|
429
|
+
for (const referenceTokenEntry of (referenceWordEntry.timeline || [])) {
|
|
430
|
+
const alignedPhoneTimeline: Timeline = []
|
|
359
431
|
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
const alignedPhoneStartTime = alignedWordEntry.startTime + (alignedPhoneStartFrameOffset / framesPerSecond)
|
|
432
|
+
for (const referencePhoneEntry of (referenceTokenEntry.timeline || [])) {
|
|
433
|
+
alignedPhoneTimeline.push(mapEntry(referencePhoneEntry))
|
|
434
|
+
}
|
|
364
435
|
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
const alignedPhoneEndTime = alignedWordEntry.startTime + (alignedPhoneEndFrameOffset / framesPerSecond)
|
|
436
|
+
alignedTokenTimeline.push({
|
|
437
|
+
...mapEntry(referenceTokenEntry),
|
|
368
438
|
|
|
369
|
-
|
|
370
|
-
...referencePhoneEntry,
|
|
371
|
-
startTime: alignedPhoneStartTime,
|
|
372
|
-
endTime: alignedPhoneEndTime
|
|
439
|
+
timeline: alignedPhoneTimeline
|
|
373
440
|
})
|
|
374
441
|
}
|
|
442
|
+
|
|
443
|
+
alignedWordEntry.timeline = alignedTokenTimeline
|
|
444
|
+
|
|
445
|
+
alignedWordTimeline.push(alignedWordEntry)
|
|
375
446
|
}
|
|
376
447
|
|
|
377
448
|
return alignedWordTimeline
|
|
378
449
|
}
|
|
379
450
|
|
|
380
|
-
export async function
|
|
381
|
-
const
|
|
382
|
-
|
|
383
|
-
progressLogger.start("Load espeak module")
|
|
384
|
-
const Espeak = await import("../synthesis/EspeakTTS.js")
|
|
451
|
+
export async function createAlignmentReferenceUsingEspeak(transcript: string, language: string, plaintextOptions?: API.PlainTextOptions, customLexiconPaths?: string[], insertSeparators?: boolean) {
|
|
452
|
+
const logger = new Logger()
|
|
385
453
|
|
|
386
|
-
|
|
454
|
+
logger.start('Create alignment reference with eSpeak')
|
|
387
455
|
|
|
388
|
-
const
|
|
456
|
+
const synthesisOptions: API.SynthesisOptions = {
|
|
457
|
+
engine: 'espeak',
|
|
458
|
+
language,
|
|
389
459
|
|
|
390
|
-
|
|
460
|
+
plainText: plaintextOptions,
|
|
461
|
+
customLexiconPaths: customLexiconPaths,
|
|
391
462
|
|
|
392
|
-
|
|
393
|
-
|
|
463
|
+
espeak: {
|
|
464
|
+
useKlatt: false,
|
|
465
|
+
insertSeparators,
|
|
466
|
+
}
|
|
394
467
|
}
|
|
395
468
|
|
|
396
|
-
|
|
469
|
+
let {
|
|
470
|
+
audio: referenceRawAudio,
|
|
471
|
+
timeline: segmentTimeline,
|
|
472
|
+
voice: espeakVoice
|
|
473
|
+
} = await synthesize(transcript, synthesisOptions)
|
|
397
474
|
|
|
398
|
-
|
|
475
|
+
const sentenceTimeline = segmentTimeline.flatMap(entry => entry.timeline!)
|
|
476
|
+
const wordTimeline = sentenceTimeline.flatMap(entry => entry.timeline!)
|
|
477
|
+
|
|
478
|
+
referenceRawAudio = await resampleAudioSpeex(referenceRawAudio as RawAudio, 16000)
|
|
479
|
+
referenceRawAudio = downmixToMonoAndNormalize(referenceRawAudio)
|
|
480
|
+
|
|
481
|
+
logger.end()
|
|
482
|
+
|
|
483
|
+
return { referenceRawAudio, referenceTimeline: wordTimeline, espeakVoice }
|
|
399
484
|
}
|
|
400
485
|
|
|
401
486
|
function compactPath(path: AlignmentPath) {
|
|
@@ -414,7 +499,7 @@ function compactPath(path: AlignmentPath) {
|
|
|
414
499
|
return compactedPath
|
|
415
500
|
}
|
|
416
501
|
|
|
417
|
-
function getMappedFrameIndexForPath(referenceFrameIndex: number, compactedPath: CompactedPath, mappingKind:
|
|
502
|
+
function getMappedFrameIndexForPath(referenceFrameIndex: number, compactedPath: CompactedPath, mappingKind: 'first' | 'last' = 'first') {
|
|
418
503
|
if (compactedPath.length == 0) {
|
|
419
504
|
return 0
|
|
420
505
|
}
|
|
@@ -425,7 +510,7 @@ function getMappedFrameIndexForPath(referenceFrameIndex: number, compactedPath:
|
|
|
425
510
|
|
|
426
511
|
let mappedFrameIndex: number
|
|
427
512
|
|
|
428
|
-
if (mappingKind ==
|
|
513
|
+
if (mappingKind == 'first') {
|
|
429
514
|
mappedFrameIndex = compactedPathEntry.first
|
|
430
515
|
} else {
|
|
431
516
|
mappedFrameIndex = compactedPathEntry.last
|
package/src/api/API.ts
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
/// <reference path=
|
|
1
|
+
/// <reference path='../typings/Fillers.d.ts' />
|
|
2
2
|
|
|
3
|
-
export * from
|
|
4
|
-
export * from
|
|
5
|
-
export * from
|
|
6
|
-
export * from
|
|
7
|
-
export * from
|
|
8
|
-
export * from
|
|
9
|
-
export * from
|
|
10
|
-
export * from
|
|
11
|
-
export * from
|
|
12
|
-
export * from
|
|
13
|
-
export * from
|
|
14
|
-
export
|
|
3
|
+
export * from './Common.js'
|
|
4
|
+
export * from './GlobalOptions.js'
|
|
5
|
+
export * from './Synthesis.js'
|
|
6
|
+
export * from './Recognition.js'
|
|
7
|
+
export * from './Alignment.js'
|
|
8
|
+
export * from './Translation.js'
|
|
9
|
+
export * from './LanguageDetection.js'
|
|
10
|
+
export * from './Vad.js'
|
|
11
|
+
export * from './Denoising.js'
|
|
12
|
+
export * from './SourceSeparation.js'
|
|
13
|
+
export * from '../server/Server.js'
|
|
14
|
+
export * from '../server/Client.js'
|
|
15
|
+
export { timelineToSubtitles, subtitlesToTimeline } from '../subtitles/Subtitles.js'
|
package/src/api/APIOptions.ts
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
import * as API from
|
|
2
|
-
import type { ServerOptions } from
|
|
1
|
+
import * as API from './API.js'
|
|
2
|
+
import type { ServerOptions } from '../server/Server.js'
|
|
3
3
|
|
|
4
|
-
export
|
|
5
|
-
VoiceListRequestOptions: API.VoiceListRequestOptions
|
|
6
|
-
SynthesisOptions: API.SynthesisOptions
|
|
7
|
-
RecognitionOptions: API.RecognitionOptions
|
|
8
|
-
AlignmentOptions: API.AlignmentOptions
|
|
4
|
+
export interface APIOptions {
|
|
5
|
+
VoiceListRequestOptions: API.VoiceListRequestOptions
|
|
6
|
+
SynthesisOptions: API.SynthesisOptions
|
|
7
|
+
RecognitionOptions: API.RecognitionOptions
|
|
8
|
+
AlignmentOptions: API.AlignmentOptions
|
|
9
9
|
SpeechTranslationOptions: API.SpeechTranslationOptions
|
|
10
|
-
SpeechLanguageDetectionOptions: API.SpeechLanguageDetectionOptions
|
|
11
|
-
TextLanguageDetectionOptions: API.TextLanguageDetectionOptions
|
|
12
|
-
VADOptions: API.VADOptions
|
|
13
|
-
DenoisingOptions: API.DenoisingOptions
|
|
10
|
+
SpeechLanguageDetectionOptions: API.SpeechLanguageDetectionOptions
|
|
11
|
+
TextLanguageDetectionOptions: API.TextLanguageDetectionOptions
|
|
12
|
+
VADOptions: API.VADOptions
|
|
13
|
+
DenoisingOptions: API.DenoisingOptions
|
|
14
|
+
SourceSeparationOptions: API.SourceSeparationOptions
|
|
14
15
|
ServerOptions: ServerOptions
|
|
15
16
|
}
|