echogarden 2.10.2 → 3.0.1

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 (496) hide show
  1. package/LICENSE.MIT.md +7 -0
  2. package/README.md +9 -1
  3. package/data/lexicons/heteronyms.en.json +44 -10
  4. package/data/lexicons/words.en.json +726 -22
  5. package/data/schemas/options.json +91 -153
  6. package/dist/alignment/DTWMfccSequenceAlignment.js.map +1 -1
  7. package/dist/alignment/SemanticTextAlignment.d.ts +4 -2
  8. package/dist/alignment/SemanticTextAlignment.d.ts.map +1 -1
  9. package/dist/alignment/SemanticTextAlignment.js +7 -7
  10. package/dist/alignment/SemanticTextAlignment.js.map +1 -1
  11. package/dist/alignment/SpeechAlignment.d.ts +9 -10
  12. package/dist/alignment/SpeechAlignment.d.ts.map +1 -1
  13. package/dist/alignment/SpeechAlignment.js +23 -96
  14. package/dist/alignment/SpeechAlignment.js.map +1 -1
  15. package/dist/api/APIOptions.d.ts +1 -1
  16. package/dist/api/APIOptions.d.ts.map +1 -1
  17. package/dist/api/Alignment.d.ts +8 -6
  18. package/dist/api/Alignment.d.ts.map +1 -1
  19. package/dist/api/Alignment.js +31 -40
  20. package/dist/api/Alignment.js.map +1 -1
  21. package/dist/api/Common.d.ts +7 -0
  22. package/dist/api/Common.d.ts.map +1 -1
  23. package/dist/api/Common.js.map +1 -1
  24. package/dist/api/Denoising.d.ts +5 -2
  25. package/dist/api/Denoising.d.ts.map +1 -1
  26. package/dist/api/Denoising.js +15 -15
  27. package/dist/api/Denoising.js.map +1 -1
  28. package/dist/api/GlobalOptions.d.ts +2 -8
  29. package/dist/api/GlobalOptions.d.ts.map +1 -1
  30. package/dist/api/GlobalOptions.js +2 -13
  31. package/dist/api/GlobalOptions.js.map +1 -1
  32. package/dist/api/Recognition.d.ts +11 -12
  33. package/dist/api/Recognition.d.ts.map +1 -1
  34. package/dist/api/Recognition.js +32 -82
  35. package/dist/api/Recognition.js.map +1 -1
  36. package/dist/api/SourceSeparation.d.ts +7 -2
  37. package/dist/api/SourceSeparation.d.ts.map +1 -1
  38. package/dist/api/SourceSeparation.js +12 -10
  39. package/dist/api/SourceSeparation.js.map +1 -1
  40. package/dist/api/SpeechLanguageDetection.d.ts +11 -7
  41. package/dist/api/SpeechLanguageDetection.d.ts.map +1 -1
  42. package/dist/api/SpeechLanguageDetection.js +37 -30
  43. package/dist/api/SpeechLanguageDetection.js.map +1 -1
  44. package/dist/api/SpeechSearch.d.ts +4 -1
  45. package/dist/api/SpeechSearch.d.ts.map +1 -1
  46. package/dist/api/SpeechSearch.js.map +1 -1
  47. package/dist/api/SpeechTranslation.d.ts +10 -6
  48. package/dist/api/SpeechTranslation.d.ts.map +1 -1
  49. package/dist/api/SpeechTranslation.js +28 -26
  50. package/dist/api/SpeechTranslation.js.map +1 -1
  51. package/dist/api/Synthesis.d.ts +13 -8
  52. package/dist/api/Synthesis.d.ts.map +1 -1
  53. package/dist/api/Synthesis.js +67 -89
  54. package/dist/api/Synthesis.js.map +1 -1
  55. package/dist/api/TextLanguageDetection.d.ts +4 -2
  56. package/dist/api/TextLanguageDetection.d.ts.map +1 -1
  57. package/dist/api/TextLanguageDetection.js +4 -7
  58. package/dist/api/TextLanguageDetection.js.map +1 -1
  59. package/dist/api/TextTranslation.d.ts +4 -2
  60. package/dist/api/TextTranslation.d.ts.map +1 -1
  61. package/dist/api/TextTranslation.js +13 -24
  62. package/dist/api/TextTranslation.js.map +1 -1
  63. package/dist/api/TimelineTranslationAlignment.d.ts +6 -3
  64. package/dist/api/TimelineTranslationAlignment.d.ts.map +1 -1
  65. package/dist/api/TimelineTranslationAlignment.js +20 -11
  66. package/dist/api/TimelineTranslationAlignment.js.map +1 -1
  67. package/dist/api/TranscriptAndTranslationAlignment.d.ts +6 -4
  68. package/dist/api/TranscriptAndTranslationAlignment.d.ts.map +1 -1
  69. package/dist/api/TranscriptAndTranslationAlignment.js +11 -12
  70. package/dist/api/TranscriptAndTranslationAlignment.js.map +1 -1
  71. package/dist/api/TranslationAlignment.d.ts +6 -4
  72. package/dist/api/TranslationAlignment.d.ts.map +1 -1
  73. package/dist/api/TranslationAlignment.js +20 -21
  74. package/dist/api/TranslationAlignment.js.map +1 -1
  75. package/dist/api/VoiceActivityDetection.d.ts +9 -8
  76. package/dist/api/VoiceActivityDetection.d.ts.map +1 -1
  77. package/dist/api/VoiceActivityDetection.js +20 -43
  78. package/dist/api/VoiceActivityDetection.js.map +1 -1
  79. package/dist/audio/AudioBufferConversion.js.map +1 -1
  80. package/dist/audio/AudioPlayer.d.ts +1 -3
  81. package/dist/audio/AudioPlayer.d.ts.map +1 -1
  82. package/dist/audio/AudioPlayer.js +3 -188
  83. package/dist/audio/AudioPlayer.js.map +1 -1
  84. package/dist/audio/AudioUtilities.d.ts +2 -1
  85. package/dist/audio/AudioUtilities.d.ts.map +1 -1
  86. package/dist/audio/AudioUtilities.js +2 -2
  87. package/dist/audio/AudioUtilities.js.map +1 -1
  88. package/dist/build-tools/MakeTarballsForInstalledPackages.js +3 -3
  89. package/dist/build-tools/MakeTarballsForInstalledPackages.js.map +1 -1
  90. package/dist/cli/CLI.d.ts.map +1 -1
  91. package/dist/cli/CLI.js +139 -92
  92. package/dist/cli/CLI.js.map +1 -1
  93. package/dist/codecs/FFMpegTranscoder.d.ts +4 -3
  94. package/dist/codecs/FFMpegTranscoder.d.ts.map +1 -1
  95. package/dist/codecs/FFMpegTranscoder.js +16 -14
  96. package/dist/codecs/FFMpegTranscoder.js.map +1 -1
  97. package/dist/codecs/TIMITCodec.d.ts.map +1 -1
  98. package/dist/data-structures/DynamicTypedArray.d.ts.map +1 -1
  99. package/dist/data-structures/DynamicTypedArray.js.map +1 -1
  100. package/dist/data-structures/Queue.d.ts.map +1 -1
  101. package/dist/data-structures/WindowedList.d.ts.map +1 -1
  102. package/dist/data-structures/WindowedList.js.map +1 -1
  103. package/dist/denoising/NSNet2.d.ts +3 -2
  104. package/dist/denoising/NSNet2.d.ts.map +1 -1
  105. package/dist/denoising/NSNet2.js +4 -4
  106. package/dist/denoising/NSNet2.js.map +1 -1
  107. package/dist/denoising/RNNoise.d.ts +2 -1
  108. package/dist/denoising/RNNoise.d.ts.map +1 -1
  109. package/dist/denoising/RNNoise.js +10 -6
  110. package/dist/denoising/RNNoise.js.map +1 -1
  111. package/dist/dsp/BiquadFilter.d.ts.map +1 -1
  112. package/dist/dsp/DecayingPeakEstimator.d.ts.map +1 -1
  113. package/dist/dsp/DecayingPeakEstimator.js.map +1 -1
  114. package/dist/dsp/FFT.d.ts.map +1 -1
  115. package/dist/dsp/FFT.js +2 -1
  116. package/dist/dsp/FFT.js.map +1 -1
  117. package/dist/dsp/KWeightingFilter.d.ts.map +1 -1
  118. package/dist/dsp/KWeightingFilter.js.map +1 -1
  119. package/dist/dsp/LoudnessEstimator.d.ts.map +1 -1
  120. package/dist/dsp/LoudnessEstimator.js.map +1 -1
  121. package/dist/dsp/MFCC.d.ts +3 -2
  122. package/dist/dsp/MFCC.d.ts.map +1 -1
  123. package/dist/dsp/MFCC.js +4 -4
  124. package/dist/dsp/MFCC.js.map +1 -1
  125. package/dist/dsp/MelSpectrogram.d.ts +10 -8
  126. package/dist/dsp/MelSpectrogram.d.ts.map +1 -1
  127. package/dist/dsp/MelSpectrogram.js +31 -34
  128. package/dist/dsp/MelSpectrogram.js.map +1 -1
  129. package/dist/dsp/Rubberband.d.ts.map +1 -1
  130. package/dist/dsp/Rubberband.js +8 -3
  131. package/dist/dsp/Rubberband.js.map +1 -1
  132. package/dist/dsp/Sonic.d.ts.map +1 -1
  133. package/dist/dsp/Sonic.js +1 -1
  134. package/dist/dsp/Sonic.js.map +1 -1
  135. package/dist/dsp/SpeexResampler.d.ts.map +1 -1
  136. package/dist/dsp/SpeexResampler.js +1 -1
  137. package/dist/dsp/SpeexResampler.js.map +1 -1
  138. package/dist/encodings/Ascii.d.ts +1 -1
  139. package/dist/encodings/Ascii.d.ts.map +1 -1
  140. package/dist/encodings/Base64.js.map +1 -1
  141. package/dist/encodings/Utf16.d.ts.map +1 -1
  142. package/dist/encodings/Utf8.d.ts.map +1 -1
  143. package/dist/math/VectorMath.d.ts +1 -0
  144. package/dist/math/VectorMath.d.ts.map +1 -1
  145. package/dist/math/VectorMath.js +9 -5
  146. package/dist/math/VectorMath.js.map +1 -1
  147. package/dist/nlp/ChineseSegmentation.d.ts +1 -1
  148. package/dist/nlp/ChineseSegmentation.d.ts.map +1 -1
  149. package/dist/nlp/EspeakPhonemizer.d.ts +1 -1
  150. package/dist/nlp/EspeakPhonemizer.d.ts.map +1 -1
  151. package/dist/nlp/EspeakPhonemizer.js +2 -2
  152. package/dist/nlp/EspeakPhonemizer.js.map +1 -1
  153. package/dist/nlp/IPA.d.ts +2 -2
  154. package/dist/nlp/Segmentation.d.ts +1 -1
  155. package/dist/nlp/Segmentation.d.ts.map +1 -1
  156. package/dist/nlp/Segmentation.js +8 -4
  157. package/dist/nlp/Segmentation.js.map +1 -1
  158. package/dist/recognition/AmazonTranscribeSTT.d.ts +2 -1
  159. package/dist/recognition/AmazonTranscribeSTT.d.ts.map +1 -1
  160. package/dist/recognition/AmazonTranscribeSTT.js +3 -3
  161. package/dist/recognition/AmazonTranscribeSTT.js.map +1 -1
  162. package/dist/recognition/AzureCognitiveServicesSTT.d.ts +2 -1
  163. package/dist/recognition/AzureCognitiveServicesSTT.d.ts.map +1 -1
  164. package/dist/recognition/AzureCognitiveServicesSTT.js +4 -4
  165. package/dist/recognition/AzureCognitiveServicesSTT.js.map +1 -1
  166. package/dist/recognition/DeepgramSTT.d.ts +2 -1
  167. package/dist/recognition/DeepgramSTT.d.ts.map +1 -1
  168. package/dist/recognition/DeepgramSTT.js +12 -13
  169. package/dist/recognition/DeepgramSTT.js.map +1 -1
  170. package/dist/recognition/GoogleCloudSTT.d.ts +2 -1
  171. package/dist/recognition/GoogleCloudSTT.d.ts.map +1 -1
  172. package/dist/recognition/GoogleCloudSTT.js +11 -10
  173. package/dist/recognition/GoogleCloudSTT.js.map +1 -1
  174. package/dist/recognition/OpenAICloudSTT.d.ts +2 -1
  175. package/dist/recognition/OpenAICloudSTT.d.ts.map +1 -1
  176. package/dist/recognition/OpenAICloudSTT.js +6 -6
  177. package/dist/recognition/OpenAICloudSTT.js.map +1 -1
  178. package/dist/recognition/WhisperCommon.d.ts +9 -0
  179. package/dist/recognition/WhisperCommon.d.ts.map +1 -0
  180. package/dist/recognition/WhisperCommon.js +52 -0
  181. package/dist/recognition/WhisperCommon.js.map +1 -0
  182. package/dist/recognition/{WhisperCppSTT.d.ts → WhisperCppCliSTT.d.ts} +14 -16
  183. package/dist/recognition/WhisperCppCliSTT.d.ts.map +1 -0
  184. package/dist/recognition/{WhisperCppSTT.js → WhisperCppCliSTT.js} +55 -84
  185. package/dist/recognition/WhisperCppCliSTT.js.map +1 -0
  186. package/dist/recognition/WhisperSTT.d.ts +72 -85
  187. package/dist/recognition/WhisperSTT.d.ts.map +1 -1
  188. package/dist/recognition/WhisperSTT.js +384 -519
  189. package/dist/recognition/WhisperSTT.js.map +1 -1
  190. package/dist/server/Client.d.ts +2 -2
  191. package/dist/server/Client.d.ts.map +1 -1
  192. package/dist/server/Client.js.map +1 -1
  193. package/dist/server/Worker.d.ts +6 -7
  194. package/dist/server/Worker.d.ts.map +1 -1
  195. package/dist/server/Worker.js +42 -44
  196. package/dist/server/Worker.js.map +1 -1
  197. package/dist/source-separation/MDXNetSourceSeparation.d.ts +3 -2
  198. package/dist/source-separation/MDXNetSourceSeparation.d.ts.map +1 -1
  199. package/dist/source-separation/MDXNetSourceSeparation.js +10 -8
  200. package/dist/source-separation/MDXNetSourceSeparation.js.map +1 -1
  201. package/dist/speech-embeddings/WavToVec2BertFeatureEmbeddings.d.ts +3 -2
  202. package/dist/speech-embeddings/WavToVec2BertFeatureEmbeddings.d.ts.map +1 -1
  203. package/dist/speech-embeddings/WavToVec2BertFeatureEmbeddings.js +5 -5
  204. package/dist/speech-embeddings/WavToVec2BertFeatureEmbeddings.js.map +1 -1
  205. package/dist/speech-language-detection/SileroLanguageDetection.d.ts +5 -3
  206. package/dist/speech-language-detection/SileroLanguageDetection.d.ts.map +1 -1
  207. package/dist/speech-language-detection/SileroLanguageDetection.js +8 -8
  208. package/dist/speech-language-detection/SileroLanguageDetection.js.map +1 -1
  209. package/dist/speech-search/DTWSpeechSearch.d.ts +2 -1
  210. package/dist/speech-search/DTWSpeechSearch.d.ts.map +1 -1
  211. package/dist/speech-search/DTWSpeechSearch.js +4 -4
  212. package/dist/speech-search/DTWSpeechSearch.js.map +1 -1
  213. package/dist/subtitles/Subtitles.d.ts +13 -1
  214. package/dist/subtitles/Subtitles.d.ts.map +1 -1
  215. package/dist/subtitles/Subtitles.js +22 -22
  216. package/dist/subtitles/Subtitles.js.map +1 -1
  217. package/dist/synthesis/AwsPollyTTS.d.ts +3 -2
  218. package/dist/synthesis/AwsPollyTTS.d.ts.map +1 -1
  219. package/dist/synthesis/AwsPollyTTS.js +5 -5
  220. package/dist/synthesis/AwsPollyTTS.js.map +1 -1
  221. package/dist/synthesis/AzureCognitiveServicesTTS.d.ts +2 -1
  222. package/dist/synthesis/AzureCognitiveServicesTTS.d.ts.map +1 -1
  223. package/dist/synthesis/AzureCognitiveServicesTTS.js +3 -3
  224. package/dist/synthesis/AzureCognitiveServicesTTS.js.map +1 -1
  225. package/dist/synthesis/CoquiServerTTS.d.ts +2 -1
  226. package/dist/synthesis/CoquiServerTTS.d.ts.map +1 -1
  227. package/dist/synthesis/CoquiServerTTS.js +7 -8
  228. package/dist/synthesis/CoquiServerTTS.js.map +1 -1
  229. package/dist/synthesis/DeepgramTTS.d.ts +2 -2
  230. package/dist/synthesis/DeepgramTTS.d.ts.map +1 -1
  231. package/dist/synthesis/DeepgramTTS.js +13 -13
  232. package/dist/synthesis/DeepgramTTS.js.map +1 -1
  233. package/dist/synthesis/ElevenLabsTTS.d.ts +3 -3
  234. package/dist/synthesis/ElevenLabsTTS.d.ts.map +1 -1
  235. package/dist/synthesis/ElevenLabsTTS.js +22 -21
  236. package/dist/synthesis/ElevenLabsTTS.js.map +1 -1
  237. package/dist/synthesis/EspeakTTS.d.ts +11 -9
  238. package/dist/synthesis/EspeakTTS.d.ts.map +1 -1
  239. package/dist/synthesis/EspeakTTS.js +129 -71
  240. package/dist/synthesis/EspeakTTS.js.map +1 -1
  241. package/dist/synthesis/FliteTTS.d.ts +2 -2
  242. package/dist/synthesis/FliteTTS.d.ts.map +1 -1
  243. package/dist/synthesis/FliteTTS.js +2 -2
  244. package/dist/synthesis/FliteTTS.js.map +1 -1
  245. package/dist/synthesis/GnuSpeechTTS.d.ts +2 -2
  246. package/dist/synthesis/GnuSpeechTTS.d.ts.map +1 -1
  247. package/dist/synthesis/GnuSpeechTTS.js +1 -1
  248. package/dist/synthesis/GnuSpeechTTS.js.map +1 -1
  249. package/dist/synthesis/GoogleCloudTTS.d.ts +3 -2
  250. package/dist/synthesis/GoogleCloudTTS.d.ts.map +1 -1
  251. package/dist/synthesis/GoogleCloudTTS.js +15 -14
  252. package/dist/synthesis/GoogleCloudTTS.js.map +1 -1
  253. package/dist/synthesis/GoogleTranslateTTS.d.ts +3 -2
  254. package/dist/synthesis/GoogleTranslateTTS.d.ts.map +1 -1
  255. package/dist/synthesis/GoogleTranslateTTS.js +11 -11
  256. package/dist/synthesis/GoogleTranslateTTS.js.map +1 -1
  257. package/dist/synthesis/KokoroTTS.d.ts +4 -4
  258. package/dist/synthesis/KokoroTTS.d.ts.map +1 -1
  259. package/dist/synthesis/KokoroTTS.js +11 -10
  260. package/dist/synthesis/KokoroTTS.js.map +1 -1
  261. package/dist/synthesis/MicrosoftEdgeTTS.d.ts +4 -3
  262. package/dist/synthesis/MicrosoftEdgeTTS.d.ts.map +1 -1
  263. package/dist/synthesis/MicrosoftEdgeTTS.js +41 -20
  264. package/dist/synthesis/MicrosoftEdgeTTS.js.map +1 -1
  265. package/dist/synthesis/OpenAICloudTTS.d.ts +2 -2
  266. package/dist/synthesis/OpenAICloudTTS.d.ts.map +1 -1
  267. package/dist/synthesis/OpenAICloudTTS.js +6 -5
  268. package/dist/synthesis/OpenAICloudTTS.js.map +1 -1
  269. package/dist/synthesis/SamTTS.d.ts +2 -1
  270. package/dist/synthesis/SamTTS.d.ts.map +1 -1
  271. package/dist/synthesis/SamTTS.js +2 -2
  272. package/dist/synthesis/SamTTS.js.map +1 -1
  273. package/dist/synthesis/SapiTTS.d.ts +2 -2
  274. package/dist/synthesis/SapiTTS.d.ts.map +1 -1
  275. package/dist/synthesis/SapiTTS.js +2 -2
  276. package/dist/synthesis/SapiTTS.js.map +1 -1
  277. package/dist/synthesis/SvoxPicoTTS.d.ts +2 -2
  278. package/dist/synthesis/SvoxPicoTTS.d.ts.map +1 -1
  279. package/dist/synthesis/SvoxPicoTTS.js +3 -3
  280. package/dist/synthesis/SvoxPicoTTS.js.map +1 -1
  281. package/dist/synthesis/VitsTTS.d.ts +3 -3
  282. package/dist/synthesis/VitsTTS.d.ts.map +1 -1
  283. package/dist/synthesis/VitsTTS.js +14 -11
  284. package/dist/synthesis/VitsTTS.js.map +1 -1
  285. package/dist/text-translation/DeepLTextTranslation.d.ts +2 -2
  286. package/dist/text-translation/DeepLTextTranslation.d.ts.map +1 -1
  287. package/dist/text-translation/DeepLTextTranslation.js +10 -9
  288. package/dist/text-translation/DeepLTextTranslation.js.map +1 -1
  289. package/dist/text-translation/GoogleTranslateTextTranslation.d.ts +4 -4
  290. package/dist/text-translation/GoogleTranslateTextTranslation.d.ts.map +1 -1
  291. package/dist/text-translation/GoogleTranslateTextTranslation.js +20 -18
  292. package/dist/text-translation/GoogleTranslateTextTranslation.js.map +1 -1
  293. package/dist/text-translation/NLLBTextTranslation.d.ts +2 -2
  294. package/dist/text-translation/NLLBTextTranslation.d.ts.map +1 -1
  295. package/dist/text-translation/NLLBTextTranslation.js +4 -6
  296. package/dist/text-translation/NLLBTextTranslation.js.map +1 -1
  297. package/dist/typings/TypedArray.d.ts.map +1 -1
  298. package/dist/utilities/Compression.d.ts +4 -3
  299. package/dist/utilities/Compression.d.ts.map +1 -1
  300. package/dist/utilities/Compression.js +9 -9
  301. package/dist/utilities/Compression.js.map +1 -1
  302. package/dist/utilities/FileDownloader.d.ts +6 -3
  303. package/dist/utilities/FileDownloader.d.ts.map +1 -1
  304. package/dist/utilities/FileDownloader.js +25 -21
  305. package/dist/utilities/FileDownloader.js.map +1 -1
  306. package/dist/utilities/FileReader.d.ts.map +1 -1
  307. package/dist/utilities/FileReader.js.map +1 -1
  308. package/dist/utilities/FileSystem.js +1 -1
  309. package/dist/utilities/FileSystem.js.map +1 -1
  310. package/dist/utilities/FileWriter.d.ts.map +1 -1
  311. package/dist/utilities/FileWriter.js.map +1 -1
  312. package/dist/utilities/Hashing.d.ts.map +1 -1
  313. package/dist/utilities/Hashing.js.map +1 -1
  314. package/dist/utilities/Locale.js.map +1 -1
  315. package/dist/utilities/Logger.d.ts +17 -9
  316. package/dist/utilities/Logger.d.ts.map +1 -1
  317. package/dist/utilities/Logger.js +50 -35
  318. package/dist/utilities/Logger.js.map +1 -1
  319. package/dist/utilities/NpmUtilities.d.ts.map +1 -1
  320. package/dist/utilities/NpmUtilities.js +4 -5
  321. package/dist/utilities/NpmUtilities.js.map +1 -1
  322. package/dist/utilities/ObjectUtilities.js.map +1 -1
  323. package/dist/utilities/OpenPromise.d.ts.map +1 -1
  324. package/dist/utilities/OpenPromise.js.map +1 -1
  325. package/dist/utilities/PackageManager.d.ts +4 -1
  326. package/dist/utilities/PackageManager.d.ts.map +1 -1
  327. package/dist/utilities/PackageManager.js +37 -22
  328. package/dist/utilities/PackageManager.js.map +1 -1
  329. package/dist/utilities/PathUtilities.d.ts +2 -0
  330. package/dist/utilities/PathUtilities.d.ts.map +1 -1
  331. package/dist/utilities/PathUtilities.js +5 -2
  332. package/dist/utilities/PathUtilities.js.map +1 -1
  333. package/dist/utilities/RandomGenerator.d.ts.map +1 -1
  334. package/dist/utilities/SignalChannel.d.ts.map +1 -1
  335. package/dist/utilities/SmoothEstimator.d.ts.map +1 -1
  336. package/dist/utilities/SmoothEstimator.js.map +1 -1
  337. package/dist/utilities/StringBuilder.d.ts.map +1 -1
  338. package/dist/utilities/TarballMaker.d.ts +4 -3
  339. package/dist/utilities/TarballMaker.d.ts.map +1 -1
  340. package/dist/utilities/TarballMaker.js +6 -6
  341. package/dist/utilities/TarballMaker.js.map +1 -1
  342. package/dist/utilities/Timeline.js.map +1 -1
  343. package/dist/utilities/Timer.d.ts.map +1 -1
  344. package/dist/utilities/Utilities.d.ts +9 -7
  345. package/dist/utilities/Utilities.d.ts.map +1 -1
  346. package/dist/utilities/Utilities.js +49 -33
  347. package/dist/utilities/Utilities.js.map +1 -1
  348. package/dist/utilities/VirtualFileReadStream.d.ts.map +1 -1
  349. package/dist/utilities/WebReader.d.ts +2 -1
  350. package/dist/utilities/WebReader.d.ts.map +1 -1
  351. package/dist/utilities/WebReader.js +7 -6
  352. package/dist/utilities/WebReader.js.map +1 -1
  353. package/dist/utilities/WikipediaReader.d.ts +2 -1
  354. package/dist/utilities/WikipediaReader.d.ts.map +1 -1
  355. package/dist/utilities/WikipediaReader.js +1 -5
  356. package/dist/utilities/WikipediaReader.js.map +1 -1
  357. package/dist/voice-activity-detection/AdaptiveGateVAD.d.ts +2 -1
  358. package/dist/voice-activity-detection/AdaptiveGateVAD.d.ts.map +1 -1
  359. package/dist/voice-activity-detection/AdaptiveGateVAD.js +1 -1
  360. package/dist/voice-activity-detection/AdaptiveGateVAD.js.map +1 -1
  361. package/dist/voice-activity-detection/SileroVAD.d.ts.map +1 -1
  362. package/dist/voice-activity-detection/SileroVAD.js.map +1 -1
  363. package/dist/voice-activity-detection/WebRtcVAD.d.ts.map +1 -1
  364. package/dist/voice-activity-detection/WebRtcVAD.js +1 -1
  365. package/dist/voice-activity-detection/WebRtcVAD.js.map +1 -1
  366. package/docs/API.md +62 -17
  367. package/docs/CUDA.md +4 -3
  368. package/docs/Engines.md +8 -7
  369. package/docs/Licenses.md +0 -3
  370. package/docs/Options.md +27 -31
  371. package/docs/Server.md +1 -0
  372. package/docs/Tasklist.md +2 -1
  373. package/docs/Technical.md +2 -2
  374. package/package.json +45 -35
  375. package/src/alignment/SemanticTextAlignment.ts +14 -7
  376. package/src/alignment/SpeechAlignment.ts +47 -150
  377. package/src/api/APIOptions.ts +1 -1
  378. package/src/api/Alignment.ts +95 -61
  379. package/src/api/Common.ts +11 -0
  380. package/src/api/Denoising.ts +22 -17
  381. package/src/api/GlobalOptions.ts +4 -20
  382. package/src/api/Recognition.ts +106 -123
  383. package/src/api/SourceSeparation.ts +39 -21
  384. package/src/api/SpeechLanguageDetection.ts +77 -37
  385. package/src/api/SpeechSearch.ts +6 -1
  386. package/src/api/SpeechTranslation.ts +75 -38
  387. package/src/api/Synthesis.ts +220 -116
  388. package/src/api/TextLanguageDetection.ts +10 -12
  389. package/src/api/TextTranslation.ts +43 -26
  390. package/src/api/TimelineTranslationAlignment.ts +41 -13
  391. package/src/api/TranscriptAndTranslationAlignment.ts +28 -15
  392. package/src/api/TranslationAlignment.ts +53 -24
  393. package/src/api/VoiceActivityDetection.ts +33 -68
  394. package/src/audio/AudioPlayer.ts +4 -232
  395. package/src/audio/AudioUtilities.ts +9 -2
  396. package/src/build-tools/MakeTarballsForInstalledPackages.ts +4 -3
  397. package/src/cli/CLI.ts +209 -101
  398. package/src/codecs/FFMpegTranscoder.ts +18 -16
  399. package/src/denoising/NSNet2.ts +5 -4
  400. package/src/denoising/RNNoise.ts +14 -6
  401. package/src/dsp/FFT.ts +2 -1
  402. package/src/dsp/MFCC.ts +7 -5
  403. package/src/dsp/MelSpectrogram.ts +56 -36
  404. package/src/dsp/Rubberband.ts +10 -3
  405. package/src/dsp/Sonic.ts +2 -1
  406. package/src/dsp/SpeexResampler.ts +2 -1
  407. package/src/encodings/Ascii.ts +1 -1
  408. package/src/encodings/Base64.ts +1 -1
  409. package/src/math/VectorMath.ts +10 -6
  410. package/src/nlp/EspeakPhonemizer.ts +2 -2
  411. package/src/nlp/Segmentation.ts +9 -4
  412. package/src/recognition/AmazonTranscribeSTT.ts +4 -3
  413. package/src/recognition/AzureCognitiveServicesSTT.ts +5 -4
  414. package/src/recognition/DeepgramSTT.ts +16 -16
  415. package/src/recognition/GoogleCloudSTT.ts +14 -12
  416. package/src/recognition/OpenAICloudSTT.ts +12 -6
  417. package/src/recognition/WhisperCommon.ts +130 -0
  418. package/src/recognition/{WhisperCppSTT.ts → WhisperCppCliSTT.ts} +73 -133
  419. package/src/recognition/WhisperSTT.ts +569 -718
  420. package/src/server/Client.ts +4 -4
  421. package/src/server/Worker.ts +59 -59
  422. package/src/source-separation/MDXNetSourceSeparation.ts +15 -10
  423. package/src/speech-embeddings/WavToVec2BertFeatureEmbeddings.ts +7 -5
  424. package/src/speech-language-detection/SileroLanguageDetection.ts +18 -9
  425. package/src/speech-search/DTWSpeechSearch.ts +6 -5
  426. package/src/subtitles/Subtitles.ts +22 -22
  427. package/src/synthesis/AwsPollyTTS.ts +12 -5
  428. package/src/synthesis/AzureCognitiveServicesTTS.ts +11 -3
  429. package/src/synthesis/CoquiServerTTS.ts +8 -7
  430. package/src/synthesis/DeepgramTTS.ts +21 -15
  431. package/src/synthesis/ElevenLabsTTS.ts +33 -23
  432. package/src/synthesis/EspeakTTS.ts +158 -71
  433. package/src/synthesis/FliteTTS.ts +3 -3
  434. package/src/synthesis/GnuSpeechTTS.ts +2 -2
  435. package/src/synthesis/GoogleCloudTTS.ts +23 -14
  436. package/src/synthesis/GoogleTranslateTTS.ts +19 -11
  437. package/src/synthesis/KokoroTTS.ts +37 -14
  438. package/src/synthesis/MicrosoftEdgeTTS.ts +71 -23
  439. package/src/synthesis/OpenAICloudTTS.ts +7 -6
  440. package/src/synthesis/SamTTS.ts +3 -2
  441. package/src/synthesis/SapiTTS.ts +3 -3
  442. package/src/synthesis/SvoxPicoTTS.ts +4 -5
  443. package/src/synthesis/VitsTTS.ts +43 -15
  444. package/src/text-translation/DeepLTextTranslation.ts +12 -10
  445. package/src/text-translation/GoogleTranslateTextTranslation.ts +35 -21
  446. package/src/text-translation/NLLBTextTranslation.ts +5 -9
  447. package/src/typings/Fillers.d.ts +0 -60
  448. package/src/typings/TypedArray.ts +12 -1
  449. package/src/utilities/Compression.ts +10 -9
  450. package/src/utilities/FileDownloader.ts +38 -23
  451. package/src/utilities/FileSystem.ts +1 -1
  452. package/src/utilities/Logger.ts +59 -42
  453. package/src/utilities/NpmUtilities.ts +4 -6
  454. package/src/utilities/OpenPromise.ts +1 -2
  455. package/src/utilities/PackageManager.ts +53 -26
  456. package/src/utilities/PathUtilities.ts +6 -2
  457. package/src/utilities/TarballMaker.ts +7 -7
  458. package/src/utilities/Utilities.ts +58 -41
  459. package/src/utilities/WebReader.ts +11 -6
  460. package/src/utilities/WikipediaReader.ts +2 -8
  461. package/src/voice-activity-detection/AdaptiveGateVAD.ts +13 -8
  462. package/src/voice-activity-detection/WebRtcVAD.ts +1 -2
  463. package/tsconfig.json +53 -54
  464. package/dist/audio/AudioRecorder.d.ts +0 -4
  465. package/dist/audio/AudioRecorder.d.ts.map +0 -1
  466. package/dist/audio/AudioRecorder.js +0 -68
  467. package/dist/audio/AudioRecorder.js.map +0 -1
  468. package/dist/audio/SoxPath.d.ts +0 -2
  469. package/dist/audio/SoxPath.d.ts.map +0 -1
  470. package/dist/audio/SoxPath.js +0 -24
  471. package/dist/audio/SoxPath.js.map +0 -1
  472. package/dist/recognition/SileroSTT.d.ts +0 -30
  473. package/dist/recognition/SileroSTT.d.ts.map +0 -1
  474. package/dist/recognition/SileroSTT.js +0 -152
  475. package/dist/recognition/SileroSTT.js.map +0 -1
  476. package/dist/recognition/VoskSTT.d.ts +0 -11
  477. package/dist/recognition/VoskSTT.d.ts.map +0 -1
  478. package/dist/recognition/VoskSTT.js +0 -72
  479. package/dist/recognition/VoskSTT.js.map +0 -1
  480. package/dist/recognition/WhisperCppSTT.d.ts.map +0 -1
  481. package/dist/recognition/WhisperCppSTT.js.map +0 -1
  482. package/dist/synthesis/StreamlabsPollyTTS.d.ts +0 -12
  483. package/dist/synthesis/StreamlabsPollyTTS.d.ts.map +0 -1
  484. package/dist/synthesis/StreamlabsPollyTTS.js +0 -88
  485. package/dist/synthesis/StreamlabsPollyTTS.js.map +0 -1
  486. package/dist/utilities/BinaryUtilities.d.ts +0 -14
  487. package/dist/utilities/BinaryUtilities.d.ts.map +0 -1
  488. package/dist/utilities/BinaryUtilities.js +0 -113
  489. package/dist/utilities/BinaryUtilities.js.map +0 -1
  490. package/src/audio/AudioRecorder.ts +0 -91
  491. package/src/audio/SoxPath.ts +0 -31
  492. package/src/recognition/SileroSTT.ts +0 -222
  493. package/src/recognition/VoskSTT.ts +0 -112
  494. package/src/synthesis/StreamlabsPollyTTS.ts +0 -114
  495. package/src/utilities/BinaryUtilities.ts +0 -138
  496. /package/{LICENSE.md → LICENSE.GPLv3.md} +0 -0
@@ -4,25 +4,34 @@ import { Logger } from '../utilities/Logger.js'
4
4
  import { RawAudio, getEmptyRawAudio } from '../audio/AudioUtilities.js'
5
5
  import { getNormalizedFragmentsForSpeech, simplifyPunctuationCharacters } from '../nlp/TextNormalizer.js'
6
6
  import { ipaPhoneToKirshenbaum } from '../nlp/PhoneConversion.js'
7
- import { splitToWords, wordCharacterRegExp } from '../nlp/Segmentation.js'
7
+ import { includesPunctuation, splitToWords, wordCharacterRegExp } from '../nlp/Segmentation.js'
8
8
  import { Lexicon, tryGetFirstLexiconSubstitution } from '../nlp/Lexicon.js'
9
9
  import { phonemizeSentence } from '../nlp/EspeakPhonemizer.js'
10
10
  import { Timeline, TimelineEntry } from '../utilities/Timeline.js'
11
11
  import { extendDeep } from '../utilities/ObjectUtilities.js'
12
12
  import { escapeHtml } from '../encodings/HtmlEscape.js'
13
+ import * as TextSegmentation from '@echogarden/text-segmentation'
14
+
15
+ import { getGlobalOption, OperationCallbacks, SynthesisCallbacks } from '../api/API.js'
16
+ import { loadPackage } from '../utilities/PackageManager.js'
13
17
 
14
18
  import { wrapEmscriptenModuleHeap } from 'wasm-heap-manager'
19
+ import { pathToFileUrl, resolvePath } from '../utilities/PathUtilities.js'
15
20
 
16
21
  const log = logToStderr
17
22
 
18
23
  let espeakInstance: any
19
24
  let espeakModule: any
20
25
 
21
- export async function preprocessAndSynthesize(text: string, language: string, espeakOptions: EspeakOptions, lexicons: Lexicon[] = []) {
22
- const logger = new Logger()
26
+ export async function preprocessAndSynthesize(text: string, language: string, espeakOptions: EspeakOptions, lexicons: Lexicon[] = [], callbacks: SynthesisCallbacks) {
27
+ const logger = new Logger(callbacks.logLevel)
23
28
 
24
29
  espeakOptions = extendDeep(defaultEspeakOptions, espeakOptions)
25
30
 
31
+ await logger.startAsync('Load espeak instance')
32
+
33
+ await ensureEspeakInstanceInitialized(callbacks)
34
+
26
35
  await logger.startAsync('Tokenize and analyze text')
27
36
 
28
37
  let lowerCaseLanguageCode = language.toLowerCase()
@@ -42,7 +51,7 @@ export async function preprocessAndSynthesize(text: string, language: string, es
42
51
 
43
52
  // Merge repeating non-words to a single word to work around eSpeak bug
44
53
  {
45
- const wordsWithMerges: string[] = []
54
+ const mergedWords: string[] = []
46
55
 
47
56
  for (let i = 0; i < words.length; i++) {
48
57
  const currentWord = words[i]
@@ -54,13 +63,22 @@ export async function preprocessAndSynthesize(text: string, language: string, es
54
63
  !['[', ']'].includes(currentWord) && // Work around eSpeak-NG marker bug with repeating squared brackets
55
64
  !wordCharacterRegExp.test(currentWord)) {
56
65
 
57
- wordsWithMerges[wordsWithMerges.length - 1] += currentWord
66
+ mergedWords[mergedWords.length - 1] += currentWord
58
67
  } else {
59
- wordsWithMerges.push(currentWord)
68
+ mergedWords.push(currentWord)
69
+ }
70
+ }
71
+
72
+ for (let i = 0; i < mergedWords.length; i++) {
73
+ const mergedWord = mergedWords[i]
74
+
75
+ // Replace vertical bar only words with empty words
76
+ if (/^[\|│]+$/.test(mergedWord)) {
77
+ mergedWords[i] = ''
60
78
  }
61
79
  }
62
80
 
63
- words = wordsWithMerges
81
+ words = mergedWords
64
82
  }
65
83
 
66
84
  // Remove words containing only whitespace
@@ -97,8 +115,8 @@ export async function preprocessAndSynthesize(text: string, language: string, es
97
115
  }
98
116
 
99
117
  phonemizedFragmentsSubstitutions.set(fragmentIndex, substitutionPhonemes)
100
- const referenceIPA = (await textToPhonemes(fragment, espeakOptions.voice, true)).replaceAll('_', ' ')
101
- const referenceKirshenbaum = (await textToPhonemes(fragment, espeakOptions.voice, false)).replaceAll('_', '')
118
+ const referenceIPA = textToPhonemes(fragment, espeakOptions.voice, true).replaceAll('_', ' ')
119
+ const referenceKirshenbaum = textToPhonemes(fragment, espeakOptions.voice, false).replaceAll('_', '')
102
120
 
103
121
  const kirshenbaumPhonemes = substitutionPhonemes.map(phone => ipaPhoneToKirshenbaum(phone)).join('')
104
122
 
@@ -114,42 +132,95 @@ export async function preprocessAndSynthesize(text: string, language: string, es
114
132
 
115
133
  logger.start('Synthesize preprocessed fragments with eSpeak')
116
134
 
117
- const { rawAudio: referenceSynthesizedAudio, timeline: referenceTimeline } = await synthesizeFragments(preprocessedFragments, espeakOptions)
135
+ const { rawAudio: referenceSynthesizedAudio, timeline: referenceTimeline } = await synthesizeFragments(
136
+ preprocessedFragments,
137
+ espeakOptions,
138
+ { ...callbacks, logLevel: 'warning' }
139
+ )
118
140
 
119
141
  await logger.startAsync('Build phonemized tokens')
120
142
 
143
+ // Build modified clause timeline using word segmentation library instead
144
+ // of eSpeak's native clauses
145
+ const clauseTimeline: Timeline = []
146
+
147
+ {
148
+ const fragmentWordSequence = new TextSegmentation.WordSequence()
149
+
150
+ for (let fragment of fragments) {
151
+ fragmentWordSequence.addWord(fragment, 0, !wordCharacterRegExp.test(fragment))
152
+ }
153
+
154
+ const wordEntries = referenceTimeline.flatMap(phraseEntry => phraseEntry.timeline!)
155
+ const segmentedWords =
156
+ await TextSegmentation.segmentWordSequence(fragmentWordSequence, {
157
+ requireSpaceAfterColonsOrSemicolons: false
158
+ })
159
+
160
+ let phraseStartWordIndex = 0
161
+
162
+ for (const sentence of segmentedWords.sentences) {
163
+ for (const phrase of sentence.phrases) {
164
+ const phraseEndWordIndex = phraseStartWordIndex + phrase.words.length
165
+
166
+ const phraseEntryTimeline: Timeline = []
167
+
168
+ for (let wordIndex = phraseStartWordIndex; wordIndex < phraseEndWordIndex; wordIndex++) {
169
+ phraseEntryTimeline.push(wordEntries[wordIndex])
170
+ }
171
+
172
+ const clauseEntry: TimelineEntry = {
173
+ type: 'clause',
174
+ text: phraseEntryTimeline.map(wordEntry => wordEntry.text).join(' '),
175
+ startTime: phraseEntryTimeline[0].startTime,
176
+ endTime: phraseEntryTimeline[phraseEntryTimeline.length - 1].endTime,
177
+ timeline: phraseEntryTimeline,
178
+ }
179
+
180
+ clauseTimeline.push(clauseEntry)
181
+
182
+ phraseStartWordIndex = phraseEndWordIndex
183
+ }
184
+ }
185
+ }
186
+
121
187
  const phonemizedSentence: string[][][] = []
122
188
 
123
- let wordIndex = 0
124
- for (const phraseEntry of referenceTimeline) {
125
- const phrase: string[][] = []
189
+ {
190
+ let wordIndex = 0
126
191
 
127
- for (const wordEntry of phraseEntry.timeline!) {
128
- wordEntry.text = fragments[wordIndex]
192
+ for (const phraseEntry of clauseTimeline) {
193
+ const phrase: string[][] = []
129
194
 
130
- if (phonemizedFragmentsSubstitutions.has(wordIndex)) {
131
- phrase.push(phonemizedFragmentsSubstitutions.get(wordIndex)!)
132
- } else {
133
- for (const tokenEntry of wordEntry.timeline!) {
134
- const tokenPhonemes: string[] = []
195
+ for (const wordEntry of phraseEntry.timeline!) {
196
+ wordEntry.text = fragments[wordIndex]
197
+
198
+ if (phonemizedFragmentsSubstitutions.has(wordIndex)) {
199
+ phrase.push(phonemizedFragmentsSubstitutions.get(wordIndex)!)
200
+ } else {
201
+ for (const tokenEntry of wordEntry.timeline!) {
202
+ const tokenPhonemes: string[] = []
135
203
 
136
- for (const phoneme of tokenEntry.timeline!) {
137
- if (phoneme.text) {
138
- tokenPhonemes.push(phoneme.text)
204
+ for (const phoneme of tokenEntry.timeline!) {
205
+ if (phoneme.text) {
206
+ tokenPhonemes.push(phoneme.text)
207
+ }
139
208
  }
140
- }
141
209
 
142
- if (tokenPhonemes.length > 0) {
143
- phrase.push(tokenPhonemes)
210
+ if (tokenPhonemes.length > 0) {
211
+ phrase.push(tokenPhonemes)
212
+ }
144
213
  }
145
214
  }
215
+
216
+ wordIndex += 1
146
217
  }
147
218
 
148
- wordIndex += 1
149
- }
219
+ phraseEntry.text = phraseEntry.timeline!.map(wordEntry => wordEntry.text).join(' ')
150
220
 
151
- if (phrase.length > 0) {
152
- phonemizedSentence.push(phrase)
221
+ if (phrase.length > 0) {
222
+ phonemizedSentence.push(phrase)
223
+ }
153
224
  }
154
225
  }
155
226
 
@@ -157,15 +228,15 @@ export async function preprocessAndSynthesize(text: string, language: string, es
157
228
 
158
229
  logger.end()
159
230
 
160
- return { referenceSynthesizedAudio, referenceTimeline, fragments, preprocessedFragments, phonemizedFragmentsSubstitutions, phonemizedSentence }
231
+ return { referenceSynthesizedAudio, referenceTimeline: clauseTimeline, fragments, preprocessedFragments, phonemizedFragmentsSubstitutions, phonemizedSentence }
161
232
  }
162
233
 
163
- export async function synthesizeFragments(fragments: string[], espeakOptions: EspeakOptions) {
234
+ export async function synthesizeFragments(fragments: string[], espeakOptions: EspeakOptions, callbacks: SynthesisCallbacks) {
164
235
  espeakOptions = extendDeep(defaultEspeakOptions, espeakOptions)
165
236
 
166
237
  const voice = espeakOptions.voice
167
238
 
168
- const sampleRate = await getSampleRate()
239
+ const sampleRate = getSampleRate()
169
240
 
170
241
  if (fragments.length === 0) {
171
242
  return {
@@ -210,7 +281,7 @@ export async function synthesizeFragments(fragments: string[], espeakOptions: Es
210
281
  }
211
282
  }
212
283
 
213
- const { rawAudio, events } = await synthesize(textWithMarkers, { ...espeakOptions, ssml: true })
284
+ const { rawAudio, events } = await synthesize(textWithMarkers, { ...espeakOptions, ssml: true }, callbacks)
214
285
 
215
286
  // Add first marker if missing
216
287
  if (fragments.length > 0) {
@@ -352,7 +423,7 @@ export async function synthesizeFragments(fragments: string[], espeakOptions: Es
352
423
  continue
353
424
  }
354
425
 
355
- const wordReferencePhonemes = (await textToPhonemes(wordEntry.text, espeakOptions.voice, true)).split('_')
426
+ const wordReferencePhonemes = textToPhonemes(wordEntry.text, espeakOptions.voice, true).split('_')
356
427
 
357
428
  const wordReferenceIPA = wordReferencePhonemes.join(' ')
358
429
 
@@ -449,8 +520,8 @@ export async function synthesizeFragments(fragments: string[], espeakOptions: Es
449
520
  return { rawAudio, timeline: clauseTimeline, events }
450
521
  }
451
522
 
452
- export async function synthesize(text: string, espeakOptions: EspeakOptions) {
453
- const logger = new Logger()
523
+ export async function synthesize(text: string, espeakOptions: EspeakOptions, callbacks: SynthesisCallbacks) {
524
+ const logger = new Logger(callbacks.logLevel)
454
525
 
455
526
  espeakOptions = extendDeep(defaultEspeakOptions, espeakOptions)
456
527
 
@@ -460,7 +531,7 @@ export async function synthesize(text: string, espeakOptions: EspeakOptions) {
460
531
  text = escapeHtml(text)
461
532
  }
462
533
 
463
- const { instance } = await getEspeakInstance()
534
+ const { instance } = await getEspeakInstance(callbacks)
464
535
 
465
536
  const sampleChunks: Float32Array[] = []
466
537
  const allEvents: EspeakEvent[] = []
@@ -468,14 +539,14 @@ export async function synthesize(text: string, espeakOptions: EspeakOptions) {
468
539
  logger.start('Synthesize with eSpeak')
469
540
 
470
541
  if (espeakOptions.useKlatt) {
471
- await setVoice(`${espeakOptions.voice}+klatt6`)
542
+ setVoice(`${espeakOptions.voice}+klatt6`)
472
543
  } else {
473
- await setVoice(espeakOptions.voice)
544
+ setVoice(espeakOptions.voice)
474
545
  }
475
546
 
476
- await setRate(espeakOptions.rate)
477
- await setPitch(espeakOptions.pitch)
478
- await setPitchRange(espeakOptions.pitchRange)
547
+ setRate(espeakOptions.rate)
548
+ setPitch(espeakOptions.pitch)
549
+ setPitchRange(espeakOptions.pitchRange)
479
550
 
480
551
  instance.synthesize(text, (samples: Int16Array, events: EspeakEvent[]) => {
481
552
  if (samples && samples.length > 0) {
@@ -501,22 +572,24 @@ export async function synthesize(text: string, espeakOptions: EspeakOptions) {
501
572
  return { rawAudio, events: allEvents }
502
573
  }
503
574
 
504
- export async function textToIPA(text: string, voice: string) {
505
- await setVoice(voice)
575
+ export function textToIPA(text: string, voice: string) {
576
+ errorIfEspeakInstanceNotLoaded()
577
+
578
+ setVoice(voice)
506
579
 
507
- const { instance } = await getEspeakInstance()
508
- const ipa: string = (instance.synthesize_ipa(text).ipa as string).trim()
580
+ const ipa: string = (espeakInstance.synthesize_ipa(text).ipa as string).trim()
509
581
 
510
582
  return ipa
511
583
  }
512
584
 
513
- export async function textToPhonemes(text: string, voice: string, useIPA = true) {
514
- await setVoice(voice)
585
+ export function textToPhonemes(text: string, voice: string, useIPA = true) {
586
+ errorIfEspeakInstanceNotLoaded()
515
587
 
516
- const { instance, module } = await getEspeakInstance()
517
- const textPtr = instance.convert_to_phonemes(text, useIPA)
588
+ setVoice(voice)
518
589
 
519
- const wasmHeap = wrapEmscriptenModuleHeap(module)
590
+ const textPtr = espeakInstance.convert_to_phonemes(text, useIPA)
591
+
592
+ const wasmHeap = wrapEmscriptenModuleHeap(espeakModule)
520
593
 
521
594
  const resultRef = wasmHeap.wrapNullTerminatedUtf8String(textPtr.ptr)
522
595
  const result = resultRef.value
@@ -527,46 +600,46 @@ export async function textToPhonemes(text: string, voice: string, useIPA = true)
527
600
  }
528
601
 
529
602
  let lastVoiceId: string | undefined
530
- export async function setVoice(voiceId: string) {
531
- const { instance } = await getEspeakInstance()
603
+ export function setVoice(voiceId: string) {
604
+ errorIfEspeakInstanceNotLoaded()
532
605
 
533
606
  if (voiceId !== lastVoiceId) {
534
- instance.set_voice(voiceId)
607
+ espeakInstance.set_voice(voiceId)
535
608
 
536
609
  lastVoiceId = voiceId
537
610
  }
538
611
  }
539
612
 
540
- export async function setVolume(volume: number) {
541
- const { instance } = await getEspeakInstance()
613
+ export function setVolume(volume: number) {
614
+ errorIfEspeakInstanceNotLoaded()
542
615
 
543
- return instance.setVolume(volume)
616
+ return espeakInstance.setVolume(volume)
544
617
  }
545
618
 
546
619
  export async function setRate(rate: number) {
547
- const { instance } = await getEspeakInstance()
620
+ errorIfEspeakInstanceNotLoaded()
548
621
 
549
- return instance.set_rate(rate)
622
+ return espeakInstance.set_rate(rate)
550
623
  }
551
624
 
552
625
  export async function setPitch(pitch: number) {
553
- const { instance } = await getEspeakInstance()
626
+ errorIfEspeakInstanceNotLoaded()
554
627
 
555
- return instance.set_pitch(pitch)
628
+ return espeakInstance.set_pitch(pitch)
556
629
  }
557
630
 
558
631
  export async function setPitchRange(pitchRange: number) {
559
- const { instance } = await getEspeakInstance()
632
+ errorIfEspeakInstanceNotLoaded()
560
633
 
561
- return instance.set_range(pitchRange)
634
+ return espeakInstance.set_range(pitchRange)
562
635
  }
563
636
 
564
- export async function getSampleRate(): Promise<22050> {
637
+ export function getSampleRate(): 22050 {
565
638
  return 22050
566
639
  }
567
640
 
568
- export async function listVoices() {
569
- const { instance } = await getEspeakInstance()
641
+ export async function listVoices(callbacks: OperationCallbacks) {
642
+ const { instance } = await getEspeakInstance(callbacks)
570
643
 
571
644
  const voiceList: {
572
645
  identifier: string,
@@ -580,9 +653,19 @@ export async function listVoices() {
580
653
  return voiceList
581
654
  }
582
655
 
583
- async function getEspeakInstance() {
656
+ function errorIfEspeakInstanceNotLoaded() {
584
657
  if (!espeakInstance) {
585
- const { default: EspeakInitializer } = await import('@echogarden/espeak-ng-emscripten')
658
+ throw new Error(`Espeak instance has not been initialized.`)
659
+ }
660
+ }
661
+
662
+ async function getEspeakInstance(callbacks: OperationCallbacks) {
663
+ if (!espeakInstance) {
664
+ const packagePath = await loadPackage('espeak-ng-emscripten', callbacks)
665
+ const normalizedModulePath = resolvePath(packagePath, 'espeak-ng.js')
666
+ const modulePathAsFileUrl = pathToFileUrl(normalizedModulePath).href
667
+
668
+ const { default: EspeakInitializer } = await import(modulePathAsFileUrl)
586
669
 
587
670
  const m = await EspeakInitializer()
588
671
  espeakInstance = await (new m.eSpeakNGWorker())
@@ -592,6 +675,10 @@ async function getEspeakInstance() {
592
675
  return { instance: espeakInstance, module: espeakModule }
593
676
  }
594
677
 
678
+ export async function ensureEspeakInstanceInitialized(callbacks: OperationCallbacks) {
679
+ await getEspeakInstance(callbacks)
680
+ }
681
+
595
682
  export type EspeakEventType = 'sentence' | 'word' | 'phoneme' | 'end' | 'mark' | 'play' | 'msg_terminated' | 'list_terminated' | 'samplerate'
596
683
 
597
684
  export interface EspeakEvent {
@@ -622,8 +709,8 @@ export const defaultEspeakOptions: EspeakOptions = {
622
709
  }
623
710
 
624
711
  export async function testKirshenbaumPhonemization(text: string, language = 'en-us') {
625
- const ipaPhonemizedSentence = (await phonemizeSentence(text, language)).flatMap(clause => clause)
626
- const kirshenbaumPhonemizedSentence = (await phonemizeSentence(text, language, undefined, false)).flatMap(clause => clause)
712
+ const ipaPhonemizedSentence = phonemizeSentence(text, language).flatMap(clause => clause)
713
+ const kirshenbaumPhonemizedSentence = phonemizeSentence(text, language, undefined, false).flatMap(clause => clause)
627
714
 
628
715
  const ipaFragments = ipaPhonemizedSentence.map(word => word.join(''))
629
716
 
@@ -1,4 +1,4 @@
1
- import { SynthesisVoice } from '../api/API.js'
1
+ import { SynthesisCallbacks, 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'
@@ -11,8 +11,8 @@ export type FliteVoiceName = 'kal' | 'kal16' | 'awb' | 'rms' | 'slt' | string
11
11
 
12
12
  let fliteModuleObject: WebAssembly.Module
13
13
 
14
- export async function synthesize(text: string, voice: FliteVoiceName, voiceDir: string | undefined, rate: number, pitchMeanHz?: number, pitchStdDev?: number) {
15
- const logger = new Logger()
14
+ export async function synthesize(text: string, voice: FliteVoiceName, voiceDir: string | undefined, rate: number, pitchMeanHz: number | undefined, pitchStdDev: number | undefined, callbacks: SynthesisCallbacks) {
15
+ const logger = new Logger(callbacks.logLevel)
16
16
  logger.start('Get Flite WASI instance')
17
17
 
18
18
  const randomId = getRandomHexString(16)
@@ -1,9 +1,9 @@
1
1
  import { defaultGnuSpeechOptions, GnuSpeechOptions, synthesize as gnuSpeechSynthesize } from '@echogarden/gnuspeech-wasm'
2
- import { SynthesisVoice } from '../api/Synthesis.js'
2
+ import { SynthesisCallbacks, SynthesisVoice } from '../api/Synthesis.js'
3
3
  import { decodeWaveToRawAudio } from '../audio/AudioUtilities.js'
4
4
  import { extendDeep } from '../utilities/ObjectUtilities.js'
5
5
 
6
- export async function synthesize(text: string, options: GnuSpeechOptions) {
6
+ export async function synthesize(text: string, options: GnuSpeechOptions, callbacks: SynthesisCallbacks) {
7
7
  const gnuSpeechOptions = extendDeep(defaultGnuSpeechOptions, options)
8
8
 
9
9
  const { audioData, params } = await gnuSpeechSynthesize(text, gnuSpeechOptions)
@@ -1,8 +1,9 @@
1
- import { request } from 'gaxios'
2
1
  import { Logger } from '../utilities/Logger.js'
3
2
  import { logToStderr } from '../utilities/Utilities.js'
4
3
  import { decodeBase64 } from '../encodings/Base64.js'
5
4
  import * as FFMpegTranscoder from '../codecs/FFMpegTranscoder.js'
5
+ import { requestHttp } from 'easier-http-request'
6
+ import { VoiceListRequestCallbacks, SynthesisCallbacks } from '../api/API.js'
6
7
 
7
8
  const log = logToStderr
8
9
 
@@ -16,9 +17,10 @@ export async function synthesize(
16
17
  volumeGainDecibels = 0.0,
17
18
  ssml = false,
18
19
  audioEncoding: AudioEncoding = 'MP3',
19
- sampleRate = 24000) {
20
+ sampleRate = 24000,
21
+ callbacks: SynthesisCallbacks) {
20
22
 
21
- const logger = new Logger()
23
+ const logger = new Logger(callbacks.logLevel)
22
24
  logger.start('Request synthesis from Google Cloud')
23
25
 
24
26
  const requestBody = {
@@ -49,7 +51,7 @@ export async function synthesize(
49
51
  requestBody.input.text = text
50
52
  }
51
53
 
52
- const response = await request<any>({
54
+ const response = await requestHttp({
53
55
  method: 'POST',
54
56
 
55
57
  url: `https://texttospeech.googleapis.com/v1beta1/text:synthesize`,
@@ -62,18 +64,25 @@ export async function synthesize(
62
64
  'User-Agent': ''
63
65
  },
64
66
 
65
- data: requestBody,
67
+ body: requestBody,
66
68
 
67
- responseType: 'json'
69
+ abortSignal: callbacks?.abortSignal
68
70
  })
69
71
 
72
+ const responseObject = await response.json()
73
+
70
74
  logger.start('Parse result')
71
75
 
72
- const result = parseResponseBody(response.data)
76
+ const result = parseResponseObject(responseObject)
73
77
 
74
78
  logger.start('Decode to raw audio')
75
79
 
76
- const rawAudio = await FFMpegTranscoder.decodeToChannels(result.audioData)
80
+ const rawAudio = await FFMpegTranscoder.decodeToChannels(
81
+ result.audioData,
82
+ undefined,
83
+ undefined,
84
+ { abortSignal: callbacks.abortSignal, logLevel: 'warning' },
85
+ )
77
86
  const timepoints = result.timepoints
78
87
 
79
88
  logger.end()
@@ -81,7 +90,7 @@ export async function synthesize(
81
90
  return { rawAudio, timepoints }
82
91
  }
83
92
 
84
- function parseResponseBody(responseBody: any) {
93
+ function parseResponseObject(responseBody: any) {
85
94
  const audioData = decodeBase64(responseBody.audioContent)
86
95
  const timepoints: timePoint[] = responseBody.timepoints
87
96
 
@@ -89,10 +98,10 @@ function parseResponseBody(responseBody: any) {
89
98
  }
90
99
 
91
100
  // Voices with audio samples: https://cloud.google.com/text-to-speech/docs/voices
92
- export async function getVoiceList(apiKey: string) {
101
+ export async function getVoiceList(apiKey: string, callbacks: VoiceListRequestCallbacks) {
93
102
  const requestURL = `https://texttospeech.googleapis.com/v1beta1/voices`
94
103
 
95
- const response = await request<any>({
104
+ const response = await requestHttp({
96
105
  method: 'GET',
97
106
 
98
107
  url: requestURL,
@@ -105,12 +114,12 @@ export async function getVoiceList(apiKey: string) {
105
114
  'User-Agent': ''
106
115
  },
107
116
 
108
- responseType: 'json'
117
+ abortSignal: callbacks?.abortSignal
109
118
  })
110
119
 
111
- const responseData = response.data
120
+ const responseObject = await response.json()
112
121
 
113
- const voices: GoogleCloudVoice[] = responseData.voices
122
+ const voices: GoogleCloudVoice[] = responseObject.voices
114
123
 
115
124
  return voices
116
125
  }
@@ -1,4 +1,3 @@
1
- import { request } from 'gaxios'
2
1
  import { Phrase, splitToFragments } from '../nlp/Segmentation.js'
3
2
  import { concatFloat32Arrays, concatUint8Arrays, logToStderr } from '../utilities/Utilities.js'
4
3
  import * as FFMpegTranscoder from '../codecs/FFMpegTranscoder.js'
@@ -8,17 +7,18 @@ import { Timeline } from '../utilities/Timeline.js'
8
7
  import { getShortLanguageCode } from '../utilities/Locale.js'
9
8
  import { getChromeOnWindowsHeaders } from '../utilities/BrowserRequestHeaders.js'
10
9
  import { decodeBase64 } from '../encodings/Base64.js'
11
-
12
- const log = logToStderr
10
+ import { requestHttp } from 'easier-http-request'
11
+ import { SynthesisCallbacks } from '../api/API.js'
13
12
 
14
13
  const maxTextLengthPerRequest = 200
15
14
 
16
- export async function synthesizeLongText(text: string, languageCode = 'en', tld = 'us', sentenceEndPause = 0.75, segmentEndPause = 1.0) {
15
+ export async function synthesizeLongText(text: string, languageCode = 'en', tld = 'us', sentenceEndPause = 0.75, segmentEndPause = 1.0, callbacks: SynthesisCallbacks) {
17
16
  if (text.length == 0) {
18
17
  throw new Error('Text is empty')
19
18
  }
20
19
 
21
- const logger = new Logger()
20
+ const logger = new Logger(callbacks.logLevel)
21
+
22
22
  logger.start('Prepare and split text')
23
23
 
24
24
  const fragments = await splitToFragments(text, maxTextLengthPerRequest, languageCode)
@@ -32,13 +32,19 @@ export async function synthesizeLongText(text: string, languageCode = 'en', tld
32
32
  const fragment = fragments[i]
33
33
 
34
34
  logger.start(`Request synthesis for text fragment ${i + 1}/${fragments.length} from Google Translate`)
35
- const fragmentMp3Stream = await synthesizeShortText(fragment.text, languageCode, tld)
35
+ const fragmentMp3Stream = await synthesizeShortText(fragment.text, languageCode, tld, callbacks)
36
36
 
37
37
  if (fragmentMp3Stream.length == 0) {
38
38
  continue
39
39
  }
40
40
 
41
- const rawAudio = await FFMpegTranscoder.decodeToChannels(fragmentMp3Stream, 24000, 1)
41
+ const rawAudio = await FFMpegTranscoder.decodeToChannels(
42
+ fragmentMp3Stream,
43
+ 24000,
44
+ 1,
45
+ { abortSignal: callbacks.abortSignal, logLevel: 'warning' }
46
+ )
47
+
42
48
  fragmentsSampleRate = rawAudio.sampleRate
43
49
 
44
50
  let targetEndingSilenceTime: number
@@ -76,7 +82,7 @@ export async function synthesizeLongText(text: string, languageCode = 'en', tld
76
82
  }
77
83
  }
78
84
 
79
- export async function synthesizeShortText(text: string, languageCode = 'en', tld = 'us') {
85
+ export async function synthesizeShortText(text: string, languageCode = 'en', tld = 'us', callbacks: SynthesisCallbacks) {
80
86
  if (text.length > maxTextLengthPerRequest) {
81
87
  throw new Error(`Text is ${text.length} characters, which is longer than the maximum of ${maxTextLengthPerRequest}`)
82
88
  }
@@ -90,7 +96,7 @@ export async function synthesizeShortText(text: string, languageCode = 'en', tld
90
96
  const stringifiedForm = JSON.stringify(requestForm)
91
97
  const requestBody = `f.req=${encodeURIComponent(stringifiedForm)}&`
92
98
 
93
- const response = await request<string>({
99
+ const response = await requestHttp({
94
100
  method: 'POST',
95
101
 
96
102
  url: `https://translate.google.${tld}/_/TranslateWebserverUi/data/batchexecute`,
@@ -109,14 +115,16 @@ export async function synthesizeShortText(text: string, languageCode = 'en', tld
109
115
 
110
116
  body: requestBody,
111
117
 
112
- responseType: 'text'
118
+ abortSignal: callbacks?.abortSignal,
113
119
  })
114
120
 
121
+ const responseBody = await response.text()
122
+
115
123
  //log(response.data)
116
124
 
117
125
  const audioChunks: Uint8Array[] = []
118
126
 
119
- for (const line of response.data.split(/\r?\n/)) {
127
+ for (const line of responseBody.split(/\r?\n/)) {
120
128
  const match = line.match(/"jQ1olc","\[\\"(.*)\\"]/)
121
129
 
122
130
  if (match != null) {