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.
Files changed (334) hide show
  1. package/README.md +15 -14
  2. package/data/schemas/options.json +398 -111
  3. package/dist/alignment/DTWMfccSequenceAlignment.d.ts +1 -1
  4. package/dist/alignment/DTWMfccSequenceAlignment.js +8 -8
  5. package/dist/alignment/DTWSequenceAlignment.d.ts +1 -1
  6. package/dist/alignment/DTWSequenceAlignment.js +1 -1
  7. package/dist/alignment/DTWSequenceAlignmentWindowed.d.ts +1 -1
  8. package/dist/alignment/DTWSequenceAlignmentWindowed.js +2 -2
  9. package/dist/alignment/LevenshteinSequenceAlignment.d.ts +1 -1
  10. package/dist/alignment/LevenshteinSequenceAlignment.js +1 -1
  11. package/dist/alignment/SpeechAlignment.d.ts +9 -10
  12. package/dist/alignment/SpeechAlignment.js +136 -105
  13. package/dist/alignment/SpeechAlignment.js.map +1 -1
  14. package/dist/api/API.d.ts +13 -12
  15. package/dist/api/API.js +14 -13
  16. package/dist/api/API.js.map +1 -1
  17. package/dist/api/APIOptions.d.ts +5 -4
  18. package/dist/api/Alignment.d.ts +15 -9
  19. package/dist/api/Alignment.js +88 -74
  20. package/dist/api/Alignment.js.map +1 -1
  21. package/dist/api/Common.js +1 -1
  22. package/dist/api/Denoising.d.ts +6 -6
  23. package/dist/api/Denoising.js +23 -23
  24. package/dist/api/Denoising.js.map +1 -1
  25. package/dist/api/LanguageDetection.d.ts +19 -12
  26. package/dist/api/LanguageDetection.js +88 -38
  27. package/dist/api/LanguageDetection.js.map +1 -1
  28. package/dist/api/Recognition.d.ts +16 -6
  29. package/dist/api/Recognition.js +129 -55
  30. package/dist/api/Recognition.js.map +1 -1
  31. package/dist/api/SourceSeparation.d.ts +17 -0
  32. package/dist/api/SourceSeparation.js +61 -0
  33. package/dist/api/SourceSeparation.js.map +1 -0
  34. package/dist/api/Synthesis.d.ts +18 -18
  35. package/dist/api/Synthesis.js +191 -164
  36. package/dist/api/Synthesis.js.map +1 -1
  37. package/dist/api/Translation.d.ts +19 -8
  38. package/dist/api/Translation.js +132 -35
  39. package/dist/api/Translation.js.map +1 -1
  40. package/dist/api/Vad.d.ts +10 -5
  41. package/dist/api/Vad.js +76 -38
  42. package/dist/api/Vad.js.map +1 -1
  43. package/dist/audio/AudioBufferConversion.d.ts +1 -1
  44. package/dist/audio/AudioBufferConversion.js +4 -4
  45. package/dist/audio/AudioPlayer.d.ts +1 -1
  46. package/dist/audio/AudioPlayer.js +26 -26
  47. package/dist/audio/AudioPlayer.js.map +1 -1
  48. package/dist/audio/AudioRecorder.d.ts +1 -1
  49. package/dist/audio/AudioRecorder.js +5 -5
  50. package/dist/audio/AudioUtilities.d.ts +13 -9
  51. package/dist/audio/AudioUtilities.js +86 -24
  52. package/dist/audio/AudioUtilities.js.map +1 -1
  53. package/dist/cli/CLI.d.ts +3 -3
  54. package/dist/cli/CLI.js +271 -162
  55. package/dist/cli/CLI.js.map +1 -1
  56. package/dist/cli/CLIConfigFile.js +8 -8
  57. package/dist/cli/CLILauncher.js +6 -6
  58. package/dist/cli/CLIOptionsSchema.js +2 -2
  59. package/dist/cli/CLIParser.js +5 -5
  60. package/dist/cli/CLIStarter.js +4 -4
  61. package/dist/codecs/FFMpegTranscoder.d.ts +2 -2
  62. package/dist/codecs/FFMpegTranscoder.js +37 -37
  63. package/dist/codecs/FFMpegTranscoder.js.map +1 -1
  64. package/dist/codecs/TIMITCodec.js +5 -5
  65. package/dist/codecs/WaveCodec.d.ts +1 -1
  66. package/dist/codecs/WaveCodec.js +22 -22
  67. package/dist/denoising/RNNoise.d.ts +1 -1
  68. package/dist/denoising/RNNoise.js +9 -9
  69. package/dist/dsp/BiquadFilter.d.ts +3 -2
  70. package/dist/dsp/BiquadFilter.js +18 -11
  71. package/dist/dsp/BiquadFilter.js.map +1 -1
  72. package/dist/dsp/DecayingPeakEstimator.d.ts +16 -0
  73. package/dist/dsp/DecayingPeakEstimator.js +23 -0
  74. package/dist/dsp/DecayingPeakEstimator.js.map +1 -0
  75. package/dist/dsp/FFT.d.ts +8 -4
  76. package/dist/dsp/FFT.js +76 -30
  77. package/dist/dsp/FFT.js.map +1 -1
  78. package/dist/dsp/KWeightingFilter.d.ts +9 -0
  79. package/dist/dsp/KWeightingFilter.js +40 -0
  80. package/dist/dsp/KWeightingFilter.js.map +1 -0
  81. package/dist/dsp/LoudnessEstimator.d.ts +21 -0
  82. package/dist/dsp/LoudnessEstimator.js +47 -0
  83. package/dist/dsp/LoudnessEstimator.js.map +1 -0
  84. package/dist/dsp/MFCC.d.ts +2 -2
  85. package/dist/dsp/MFCC.js +15 -15
  86. package/dist/dsp/MelSpectogram.d.ts +1 -1
  87. package/dist/dsp/MelSpectogram.js +6 -6
  88. package/dist/dsp/Rubberband.d.ts +11 -11
  89. package/dist/dsp/Rubberband.js +27 -27
  90. package/dist/dsp/Sonic.d.ts +1 -1
  91. package/dist/dsp/Sonic.js +3 -3
  92. package/dist/dsp/SpeexResampler.d.ts +1 -1
  93. package/dist/dsp/SpeexResampler.js +2 -2
  94. package/dist/math/VectorMath.d.ts +12 -8
  95. package/dist/math/VectorMath.js +35 -32
  96. package/dist/math/VectorMath.js.map +1 -1
  97. package/dist/nlp/ChineseSegmentation.js +2 -2
  98. package/dist/nlp/CompromiseNLP.js +3 -3
  99. package/dist/nlp/EspeakPhonemizer.js +30 -30
  100. package/dist/nlp/IPA.js +20 -20
  101. package/dist/nlp/JapaneseSegmentation.js +6 -6
  102. package/dist/nlp/Lexicon.d.ts +1 -1
  103. package/dist/nlp/Lexicon.js +7 -7
  104. package/dist/nlp/Segmentation.d.ts +3 -0
  105. package/dist/nlp/Segmentation.js +21 -14
  106. package/dist/nlp/Segmentation.js.map +1 -1
  107. package/dist/nlp/TextNormalizer.js +16 -16
  108. package/dist/recognition/AmazonTranscribeSTT.d.ts +2 -2
  109. package/dist/recognition/AmazonTranscribeSTT.js +13 -14
  110. package/dist/recognition/AmazonTranscribeSTT.js.map +1 -1
  111. package/dist/recognition/AzureCognitiveServicesSTT.js +5 -6
  112. package/dist/recognition/AzureCognitiveServicesSTT.js.map +1 -1
  113. package/dist/recognition/GoogleCloudSTT.d.ts +3 -3
  114. package/dist/recognition/GoogleCloudSTT.js +18 -18
  115. package/dist/recognition/OpenAICloudSTT.d.ts +19 -0
  116. package/dist/recognition/OpenAICloudSTT.js +81 -0
  117. package/dist/recognition/OpenAICloudSTT.js.map +1 -0
  118. package/dist/recognition/SileroSTT.d.ts +2 -2
  119. package/dist/recognition/SileroSTT.js +25 -25
  120. package/dist/recognition/VoskSTT.d.ts +2 -2
  121. package/dist/recognition/VoskSTT.js +8 -8
  122. package/dist/recognition/WhisperCppSTT.d.ts +88 -0
  123. package/dist/recognition/WhisperCppSTT.js +332 -0
  124. package/dist/recognition/WhisperCppSTT.js.map +1 -0
  125. package/dist/recognition/WhisperSTT.d.ts +49 -25
  126. package/dist/recognition/WhisperSTT.js +626 -481
  127. package/dist/recognition/WhisperSTT.js.map +1 -1
  128. package/dist/server/Client.d.ts +1 -1
  129. package/dist/server/Client.js +22 -22
  130. package/dist/server/Server.js +9 -9
  131. package/dist/server/Server.js.map +1 -1
  132. package/dist/server/Worker.d.ts +22 -22
  133. package/dist/server/Worker.js +36 -36
  134. package/dist/server/Worker.js.map +1 -1
  135. package/dist/server/WorkerStarter.js +2 -2
  136. package/dist/source-separation/MDXNetSourceSeparation.d.ts +11 -0
  137. package/dist/source-separation/MDXNetSourceSeparation.js +161 -0
  138. package/dist/source-separation/MDXNetSourceSeparation.js.map +1 -0
  139. package/dist/speech-language-detection/SileroLanguageDetection.d.ts +1 -1
  140. package/dist/speech-language-detection/SileroLanguageDetection.js +7 -7
  141. package/dist/subtitles/Subtitles.d.ts +10 -0
  142. package/dist/subtitles/Subtitles.js +2 -2
  143. package/dist/subtitles/Subtitles.js.map +1 -1
  144. package/dist/synthesis/AwsPollyTTS.d.ts +1 -1
  145. package/dist/synthesis/AwsPollyTTS.js +12 -12
  146. package/dist/synthesis/AzureCognitiveServicesTTS.js +7 -7
  147. package/dist/synthesis/CoquiServerTTS.js +10 -10
  148. package/dist/synthesis/CoquiServerTTS.js.map +1 -1
  149. package/dist/synthesis/ElevenlabsTTS.d.ts +23 -0
  150. package/dist/synthesis/ElevenlabsTTS.js +103 -0
  151. package/dist/synthesis/ElevenlabsTTS.js.map +1 -0
  152. package/dist/synthesis/EspeakTTS.d.ts +6 -5
  153. package/dist/synthesis/EspeakTTS.js +81 -69
  154. package/dist/synthesis/EspeakTTS.js.map +1 -1
  155. package/dist/synthesis/FliteTTS.d.ts +3 -3
  156. package/dist/synthesis/FliteTTS.js +154 -154
  157. package/dist/synthesis/FliteTTS.js.map +1 -1
  158. package/dist/synthesis/GoogleCloudTTS.d.ts +3 -3
  159. package/dist/synthesis/GoogleCloudTTS.js +17 -17
  160. package/dist/synthesis/GoogleCloudTTS.js.map +1 -1
  161. package/dist/synthesis/GoogleTranslateTTS.d.ts +1 -1
  162. package/dist/synthesis/GoogleTranslateTTS.js +103 -103
  163. package/dist/synthesis/MicrosoftEdgeTTS.d.ts +2 -2
  164. package/dist/synthesis/MicrosoftEdgeTTS.js +74 -74
  165. package/dist/synthesis/OpenAICloudTTS.d.ts +13 -0
  166. package/dist/synthesis/OpenAICloudTTS.js +169 -0
  167. package/dist/synthesis/OpenAICloudTTS.js.map +1 -0
  168. package/dist/synthesis/SamTTS.js +3 -3
  169. package/dist/synthesis/SapiTTS.d.ts +3 -3
  170. package/dist/synthesis/SapiTTS.js +26 -26
  171. package/dist/synthesis/StreamlabsPollyTTS.d.ts +2 -2
  172. package/dist/synthesis/StreamlabsPollyTTS.js +27 -27
  173. package/dist/synthesis/SvoxPicoTTS.d.ts +2 -2
  174. package/dist/synthesis/SvoxPicoTTS.js +65 -65
  175. package/dist/synthesis/SvoxPicoTTS.js.map +1 -1
  176. package/dist/synthesis/VitsTTS.d.ts +3 -3
  177. package/dist/synthesis/VitsTTS.js +378 -378
  178. package/dist/synthesis/VitsTTS.js.map +1 -1
  179. package/dist/tests/Test.js +2 -2
  180. package/dist/utilities/Compression.d.ts +5 -0
  181. package/dist/utilities/Compression.js +29 -13
  182. package/dist/utilities/Compression.js.map +1 -1
  183. package/dist/utilities/FileDownloader.d.ts +1 -1
  184. package/dist/utilities/FileDownloader.js +16 -16
  185. package/dist/utilities/FileSystem.js +7 -7
  186. package/dist/utilities/Locale.d.ts +7 -7
  187. package/dist/utilities/Locale.js +15 -15
  188. package/dist/utilities/Logger.js +3 -3
  189. package/dist/utilities/ObjectUtilities.js +19 -19
  190. package/dist/utilities/OpenPromise.js +2 -2
  191. package/dist/utilities/OpenPromise.js.map +1 -1
  192. package/dist/utilities/PackageManager.js +31 -0
  193. package/dist/utilities/PackageManager.js.map +1 -1
  194. package/dist/utilities/PathUtilities.js +8 -8
  195. package/dist/utilities/RandomGenerator.js +2 -2
  196. package/dist/utilities/SmoothEstimator.d.ts +8 -0
  197. package/dist/utilities/SmoothEstimator.js +25 -0
  198. package/dist/utilities/SmoothEstimator.js.map +1 -0
  199. package/dist/utilities/TarballMaker.js +8 -8
  200. package/dist/utilities/Timeline.d.ts +3 -2
  201. package/dist/utilities/Timeline.js +11 -11
  202. package/dist/utilities/Timeline.js.map +1 -1
  203. package/dist/utilities/Timer.js +4 -4
  204. package/dist/utilities/Utilities.d.ts +4 -0
  205. package/dist/utilities/Utilities.js +38 -15
  206. package/dist/utilities/Utilities.js.map +1 -1
  207. package/dist/utilities/WasmMemoryManager.js +7 -7
  208. package/dist/utilities/WebReader.js +23 -23
  209. package/dist/utilities/WikipediaReader.js +2 -2
  210. package/dist/voice-activity-detection/AdaptiveGateVAD.d.ts +28 -0
  211. package/dist/voice-activity-detection/AdaptiveGateVAD.js +138 -0
  212. package/dist/voice-activity-detection/AdaptiveGateVAD.js.map +1 -0
  213. package/dist/voice-activity-detection/SileroVAD.d.ts +1 -1
  214. package/dist/voice-activity-detection/SileroVAD.js +5 -5
  215. package/dist/voice-activity-detection/SileroVAD.js.map +1 -1
  216. package/dist/voice-activity-detection/WebRtcVAD.d.ts +1 -1
  217. package/dist/voice-activity-detection/WebRtcVAD.js +4 -4
  218. package/docs/API.md +29 -11
  219. package/docs/CLI.md +31 -7
  220. package/docs/Contributing.md +38 -0
  221. package/docs/Development.md +93 -19
  222. package/docs/Engines.md +28 -16
  223. package/docs/Licenses.md +4 -1
  224. package/docs/Options.md +158 -78
  225. package/docs/Releases.md +262 -0
  226. package/docs/Server.md +7 -7
  227. package/docs/Tasklist.md +95 -76
  228. package/docs/Technical.md +4 -4
  229. package/package.json +13 -14
  230. package/src/alignment/DTWMfccSequenceAlignment.ts +9 -9
  231. package/src/alignment/DTWSequenceAlignment.ts +2 -2
  232. package/src/alignment/DTWSequenceAlignmentWindowed.ts +3 -3
  233. package/src/alignment/LevenshteinSequenceAlignment.ts +2 -2
  234. package/src/alignment/SpeechAlignment.ts +204 -119
  235. package/src/api/API.ts +14 -13
  236. package/src/api/APIOptions.ts +12 -11
  237. package/src/api/Alignment.ts +147 -90
  238. package/src/api/Common.ts +1 -1
  239. package/src/api/Denoising.ts +28 -28
  240. package/src/api/LanguageDetection.ts +135 -48
  241. package/src/api/Recognition.ts +198 -59
  242. package/src/api/SourceSeparation.ts +99 -0
  243. package/src/api/Synthesis.ts +217 -181
  244. package/src/api/Translation.ts +193 -40
  245. package/src/api/Vad.ts +110 -41
  246. package/src/audio/AudioBufferConversion.ts +4 -4
  247. package/src/audio/AudioPlayer.ts +27 -27
  248. package/src/audio/AudioRecorder.ts +5 -5
  249. package/src/audio/AudioUtilities.ts +107 -24
  250. package/src/cli/CLI.ts +313 -164
  251. package/src/cli/CLIConfigFile.ts +8 -8
  252. package/src/cli/CLILauncher.ts +6 -6
  253. package/src/cli/CLIOptionsSchema.ts +2 -2
  254. package/src/cli/CLIParser.ts +5 -5
  255. package/src/cli/CLIStarter.ts +4 -4
  256. package/src/codecs/FFMpegTranscoder.ts +38 -38
  257. package/src/codecs/TIMITCodec.ts +5 -5
  258. package/src/codecs/WaveCodec.ts +22 -22
  259. package/src/denoising/RNNoise.ts +9 -9
  260. package/src/dsp/BiquadFilter.ts +19 -11
  261. package/src/dsp/DecayingPeakEstimator.ts +35 -0
  262. package/src/dsp/FFT.ts +103 -35
  263. package/src/dsp/KWeightingFilter.ts +43 -0
  264. package/src/dsp/LoudnessEstimator.ts +74 -0
  265. package/src/dsp/MFCC.ts +15 -15
  266. package/src/dsp/MelSpectogram.ts +7 -7
  267. package/src/dsp/Rubberband.ts +38 -38
  268. package/src/dsp/Sonic.ts +4 -4
  269. package/src/dsp/SpeexResampler.ts +2 -2
  270. package/src/math/VectorMath.ts +42 -33
  271. package/src/nlp/ChineseSegmentation.ts +3 -3
  272. package/src/nlp/CompromiseNLP.ts +3 -3
  273. package/src/nlp/EspeakPhonemizer.ts +30 -30
  274. package/src/nlp/IPA.ts +20 -20
  275. package/src/nlp/JapaneseSegmentation.ts +6 -6
  276. package/src/nlp/Lexicon.ts +8 -8
  277. package/src/nlp/Segmentation.ts +23 -14
  278. package/src/nlp/TextNormalizer.ts +16 -16
  279. package/src/recognition/AmazonTranscribeSTT.ts +16 -17
  280. package/src/recognition/AzureCognitiveServicesSTT.ts +8 -6
  281. package/src/recognition/GoogleCloudSTT.ts +21 -21
  282. package/src/recognition/OpenAICloudSTT.ts +142 -0
  283. package/src/recognition/SileroSTT.ts +26 -26
  284. package/src/recognition/VoskSTT.ts +10 -10
  285. package/src/recognition/WhisperCppSTT.ts +555 -0
  286. package/src/recognition/WhisperSTT.ts +760 -507
  287. package/src/server/Client.ts +23 -23
  288. package/src/server/Server.ts +9 -9
  289. package/src/server/Worker.ts +53 -53
  290. package/src/server/WorkerStarter.ts +2 -2
  291. package/src/source-separation/MDXNetSourceSeparation.ts +228 -0
  292. package/src/speech-language-detection/SileroLanguageDetection.ts +8 -8
  293. package/src/subtitles/Subtitles.ts +3 -3
  294. package/src/synthesis/AwsPollyTTS.ts +14 -14
  295. package/src/synthesis/AzureCognitiveServicesTTS.ts +10 -10
  296. package/src/synthesis/CoquiServerTTS.ts +10 -10
  297. package/src/synthesis/ElevenlabsTTS.ts +137 -0
  298. package/src/synthesis/EspeakTTS.ts +90 -71
  299. package/src/synthesis/FliteTTS.ts +157 -157
  300. package/src/synthesis/GoogleCloudTTS.ts +19 -19
  301. package/src/synthesis/GoogleTranslateTTS.ts +104 -104
  302. package/src/synthesis/MicrosoftEdgeTTS.ts +80 -80
  303. package/src/synthesis/OpenAICloudTTS.ts +196 -0
  304. package/src/synthesis/SamTTS.ts +3 -3
  305. package/src/synthesis/SapiTTS.ts +29 -29
  306. package/src/synthesis/StreamlabsPollyTTS.ts +29 -29
  307. package/src/synthesis/SvoxPicoTTS.ts +67 -67
  308. package/src/synthesis/VitsTTS.ts +380 -380
  309. package/src/tests/Test.ts +4 -4
  310. package/src/utilities/Compression.ts +34 -13
  311. package/src/utilities/FileDownloader.ts +19 -19
  312. package/src/utilities/FileSystem.ts +7 -7
  313. package/src/utilities/Locale.ts +22 -22
  314. package/src/utilities/Logger.ts +4 -4
  315. package/src/utilities/ObjectUtilities.ts +19 -19
  316. package/src/utilities/OpenPromise.ts +2 -2
  317. package/src/utilities/PackageManager.ts +40 -0
  318. package/src/utilities/PathUtilities.ts +8 -8
  319. package/src/utilities/RandomGenerator.ts +3 -3
  320. package/src/utilities/SmoothEstimator.ts +35 -0
  321. package/src/utilities/TarballMaker.ts +9 -9
  322. package/src/utilities/Timeline.ts +15 -13
  323. package/src/utilities/Timer.ts +4 -4
  324. package/src/utilities/Utilities.ts +49 -15
  325. package/src/utilities/WasmMemoryManager.ts +7 -7
  326. package/src/utilities/WebReader.ts +23 -23
  327. package/src/utilities/WikipediaReader.ts +2 -2
  328. package/src/voice-activity-detection/AdaptiveGateVAD.ts +202 -0
  329. package/src/voice-activity-detection/SileroVAD.ts +5 -5
  330. package/src/voice-activity-detection/WebRtcVAD.ts +5 -5
  331. package/dist/synthesis/ElevenLabsTTS.d.ts +0 -8
  332. package/dist/synthesis/ElevenLabsTTS.js +0 -82
  333. package/dist/synthesis/ElevenLabsTTS.js.map +0 -1
  334. package/src/synthesis/ElevenLabsTTS.ts +0 -104
@@ -1,16 +1,25 @@
1
- import { clip } from "../utilities/Utilities.js"
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("Compute reference MFCC features")
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("Compute source MFCC features")
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("Align MFCC features using DTW")
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("\nConvert path to timeline")
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("Unexpected: encountered a negative timestamp in timeline")
104
+ throw new Error('Unexpected: encountered a negative timestamp in timeline')
96
105
  }
97
106
 
98
- const mappedStartFrameIndex = getMappedFrameIndexForPath(referenceStartFrameIndex, compactedPath, "first")
99
- const mappedEndFrameIndex = getMappedFrameIndexForPath(referenceEndFrameIndex, compactedPath, "first")
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(sourceRawAudio: RawAudio, referenceRawAudio: RawAudio, referenceTimeline: Timeline, recognitionTimeline: Timeline, granularities: DtwGranularity[], windowDurations: number[], espeakOptions: EspeakOptions, phoneAlignmentMethod: API.PhoneAlignmentMethod = "interpolation") {
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 == "interpolation") {
187
+ if (phoneAlignmentMethod == 'interpolation') {
175
188
  // Add phone timelines by interpolating from reference words
176
- logger.start("Interpolate phone timing")
189
+ logger.start('Interpolate phone timing')
177
190
 
178
191
  recognitionTimelineWithPhones = await interpolatePhoneTimelines(recognitionTimeline, synthesizedRecognitionTimeline)
179
- } else if (phoneAlignmentMethod == "dtw") {
180
- logger.start("Align phone timing")
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(sourceRawAudio, recognitionTimeline, synthesizedRecognizedTranscriptRawAudio, synthesizedRecognitionTimeline)
185
- } else if (phoneAlignmentMethod == "dtw-knn") {
186
- logger.start("Align phone timing")
187
- throw new Error("Not implemented")
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 i = 0; i < synthesizedRecognitionTimeline.length; i++) {
200
- const synthesizedTimelineEntry = synthesizedRecognitionTimeline[i]
201
- const recognitionTimelineEntry = recognitionTimelineWithPhones[i]
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
- synthesizedToRecognizedTimeMapping.push({ synthesized: synthesizedTimelineEntry.startTime, recognized: recognitionTimelineEntry.startTime })
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
- if (synthesizedTimelineEntry.timeline) {
206
- for (let j = 0; j < synthesizedTimelineEntry.timeline.length; j++) {
207
- const synthesizedPhoneTimelineEntry = synthesizedTimelineEntry.timeline[j]
208
- const recognitionPhoneTimelineEntry = recognitionTimelineEntry.timeline![j]
231
+ synthesizedToRecognizedTimeMapping.push({
232
+ synthesized: synthesizedPhoneTimelineEntry.startTime,
233
+ recognized: recognitionPhoneTimelineEntry.startTime
234
+ })
209
235
 
210
- synthesizedToRecognizedTimeMapping.push({ synthesized: synthesizedPhoneTimelineEntry.startTime, recognized: recognitionPhoneTimelineEntry.startTime })
211
- synthesizedToRecognizedTimeMapping.push({ synthesized: synthesizedPhoneTimelineEntry.endTime, recognized: recognitionPhoneTimelineEntry.endTime })
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("Align the synthesized recognized transcript with the synthesized ground-truth transcript")
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(synthesizedRecognizedTranscriptRawAudio, referenceRawAudio, referenceTimeline, granularities, windowDurations)
246
+ const alignedSynthesizedRecognitionTimeline = await alignUsingDtw(
247
+ synthesizedRecognizedTranscriptRawAudio,
248
+ referenceRawAudio,
249
+ referenceTimeline,
250
+ granularities,
251
+ windowDurations)
221
252
 
222
- let currentSynthesizedToRecognizedMappingIndex = 0
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
- function mapSynthesizedToRecognizedTimeAndAdvance(synthesizedTime: number) {
225
- for (; ; currentSynthesizedToRecognizedMappingIndex += 1) {
226
- const left = synthesizedToRecognizedTimeMapping[currentSynthesizedToRecognizedMappingIndex].synthesized
258
+ let right: number
227
259
 
228
- let right: number
260
+ if (mappingIndex < synthesizedToRecognizedTimeMapping.length - 1) {
261
+ right = synthesizedToRecognizedTimeMapping[mappingIndex + 1].synthesized
262
+ } else {
263
+ right = Infinity
264
+ }
229
265
 
230
- if (currentSynthesizedToRecognizedMappingIndex < synthesizedToRecognizedTimeMapping.length - 1) {
231
- right = synthesizedToRecognizedTimeMapping[currentSynthesizedToRecognizedMappingIndex + 1].synthesized
232
- } else {
233
- right = Infinity
234
- }
266
+ if (left > right) {
267
+ throw new Error('Left is greater than right!')
268
+ }
235
269
 
236
- if (left > right) {
237
- throw new Error("left is larger than right!")
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 = { ...entry }
279
+ const mappedEntry = deepClone(entry)
251
280
 
252
- mappedEntry.startTime = mapSynthesizedToRecognizedTimeAndAdvance(entry.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 = { ...sourceTimeline[i] }
307
+ const interpolatedEntry = deepClone(sourceTimeline[i])
280
308
  interpolatedTimeline.push(interpolatedEntry)
281
309
 
282
- if (interpolatedEntry.type != "word") {
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
- interpolatedEntry.timeline = []
317
+ function mapEntry(targetEntry: TimelineEntry): TimelineEntry {
318
+ const targetStartTimePercentageRelativeToWord =
319
+ (targetEntry.startTime - referenceEntry.startTime) / synthesisEntryDuration
290
320
 
291
- for (const phoneEntry of referenceEntry.timeline!) {
292
- const phoneStartTimePercentageRelativeToWord =
293
- (phoneEntry.startTime - referenceEntry.startTime) / synthesisEntryDuration
321
+ const targetEndTimePercentageRelativeToWord =
322
+ (targetEntry.endTime - referenceEntry.startTime) / synthesisEntryDuration
294
323
 
295
- const phoneEndTimePercentageRelativeToWord =
296
- (phoneEntry.endTime - referenceEntry.startTime) / synthesisEntryDuration
324
+ const interpolatedStartTime =
325
+ interpolatedEntry.startTime + (zeroIfNaN(targetStartTimePercentageRelativeToWord) * interpolatedEntryDuration)
297
326
 
298
- const interpolatedPhoneStartTime = interpolatedEntry.startTime + (phoneStartTimePercentageRelativeToWord * interpolatedEntryDuration)
299
- const interpolatedPhoneEndTime = interpolatedEntry.startTime + (phoneEndTimePercentageRelativeToWord * interpolatedEntryDuration)
327
+ const interpolatedEndTime =
328
+ interpolatedEntry.startTime + (zeroIfNaN(targetEndTimePercentageRelativeToWord) * interpolatedEntryDuration)
300
329
 
301
- interpolatedEntry.timeline.push({
302
- ...phoneEntry,
330
+ return {
331
+ ...targetEntry,
303
332
 
304
- startTime: interpolatedPhoneStartTime,
305
- endTime: interpolatedPhoneEndTime
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(sourceRawAudio: RawAudio, sourceWordTimeline: Timeline, referenceRawAudio: RawAudio, referenceTimeline: Timeline) {
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 = { ...sourceWordTimeline[i] }
327
- alignedWordTimeline.push(alignedWordEntry)
379
+ const alignedWordEntry = deepClone(sourceWordTimeline[i])
328
380
 
329
- if (alignedWordEntry.type != "word") {
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, 60)
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
- alignedWordEntry.timeline = []
427
+ const alignedTokenTimeline: Timeline = []
428
+
429
+ for (const referenceTokenEntry of (referenceWordEntry.timeline || [])) {
430
+ const alignedPhoneTimeline: Timeline = []
359
431
 
360
- for (const referencePhoneEntry of referenceWordEntry.timeline!) {
361
- const referencePhoneStartFrameOffset = Math.floor((referencePhoneEntry.startTime - referenceWordEntry.startTime) * framesPerSecond)
362
- const alignedPhoneStartFrameOffset = getMappedFrameIndexForPath(referencePhoneStartFrameOffset, compactedPath)
363
- const alignedPhoneStartTime = alignedWordEntry.startTime + (alignedPhoneStartFrameOffset / framesPerSecond)
432
+ for (const referencePhoneEntry of (referenceTokenEntry.timeline || [])) {
433
+ alignedPhoneTimeline.push(mapEntry(referencePhoneEntry))
434
+ }
364
435
 
365
- const referencePhoneEndFrameOffset = Math.floor((referencePhoneEntry.endTime - referenceWordEntry.startTime) * framesPerSecond)
366
- const alignedPhoneEndFrameOffset = getMappedFrameIndexForPath(referencePhoneEndFrameOffset, compactedPath)
367
- const alignedPhoneEndTime = alignedWordEntry.startTime + (alignedPhoneEndFrameOffset / framesPerSecond)
436
+ alignedTokenTimeline.push({
437
+ ...mapEntry(referenceTokenEntry),
368
438
 
369
- alignedWordEntry.timeline.push({
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 createAlignmentReferenceUsingEspeakForFragments(fragments: string[], espeakOptions: EspeakOptions, insertSeparators = true) {
381
- const progressLogger = new Logger()
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
- progressLogger.start("Create alignment reference with eSpeak")
454
+ logger.start('Create alignment reference with eSpeak')
387
455
 
388
- const result = await Espeak.synthesizeFragments(fragments, espeakOptions, insertSeparators)
456
+ const synthesisOptions: API.SynthesisOptions = {
457
+ engine: 'espeak',
458
+ language,
389
459
 
390
- result.timeline = result.timeline.flatMap(clause => clause.timeline!)
460
+ plainText: plaintextOptions,
461
+ customLexiconPaths: customLexiconPaths,
391
462
 
392
- for (const wordEntry of result.timeline) {
393
- wordEntry.timeline = wordEntry.timeline!.flatMap(tokenEntry => tokenEntry.timeline!)
463
+ espeak: {
464
+ useKlatt: false,
465
+ insertSeparators,
466
+ }
394
467
  }
395
468
 
396
- progressLogger.end()
469
+ let {
470
+ audio: referenceRawAudio,
471
+ timeline: segmentTimeline,
472
+ voice: espeakVoice
473
+ } = await synthesize(transcript, synthesisOptions)
397
474
 
398
- return result
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: "first" | "last" = "first") {
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 == "first") {
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="../typings/Fillers.d.ts" />
1
+ /// <reference path='../typings/Fillers.d.ts' />
2
2
 
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 "../server/Server.js"
13
- export * from "../server/Client.js"
14
- export { timelineToSubtitles, subtitlesToTimeline } from "../subtitles/Subtitles.js"
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'
@@ -1,15 +1,16 @@
1
- import * as API from "./API.js"
2
- import type { ServerOptions } from "../server/Server.js"
1
+ import * as API from './API.js'
2
+ import type { ServerOptions } from '../server/Server.js'
3
3
 
4
- export type APIOptions = {
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
  }