echogarden 2.10.2 → 3.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 (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 +118 -68
  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 +145 -69
  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()
@@ -59,8 +68,6 @@ export async function preprocessAndSynthesize(text: string, language: string, es
59
68
  wordsWithMerges.push(currentWord)
60
69
  }
61
70
  }
62
-
63
- words = wordsWithMerges
64
71
  }
65
72
 
66
73
  // Remove words containing only whitespace
@@ -97,8 +104,8 @@ export async function preprocessAndSynthesize(text: string, language: string, es
97
104
  }
98
105
 
99
106
  phonemizedFragmentsSubstitutions.set(fragmentIndex, substitutionPhonemes)
100
- const referenceIPA = (await textToPhonemes(fragment, espeakOptions.voice, true)).replaceAll('_', ' ')
101
- const referenceKirshenbaum = (await textToPhonemes(fragment, espeakOptions.voice, false)).replaceAll('_', '')
107
+ const referenceIPA = textToPhonemes(fragment, espeakOptions.voice, true).replaceAll('_', ' ')
108
+ const referenceKirshenbaum = textToPhonemes(fragment, espeakOptions.voice, false).replaceAll('_', '')
102
109
 
103
110
  const kirshenbaumPhonemes = substitutionPhonemes.map(phone => ipaPhoneToKirshenbaum(phone)).join('')
104
111
 
@@ -114,42 +121,95 @@ export async function preprocessAndSynthesize(text: string, language: string, es
114
121
 
115
122
  logger.start('Synthesize preprocessed fragments with eSpeak')
116
123
 
117
- const { rawAudio: referenceSynthesizedAudio, timeline: referenceTimeline } = await synthesizeFragments(preprocessedFragments, espeakOptions)
124
+ const { rawAudio: referenceSynthesizedAudio, timeline: referenceTimeline } = await synthesizeFragments(
125
+ preprocessedFragments,
126
+ espeakOptions,
127
+ { ...callbacks, logLevel: 'warning' }
128
+ )
118
129
 
119
130
  await logger.startAsync('Build phonemized tokens')
120
131
 
132
+ // Build modified clause timeline using word segmentation library instead
133
+ // of eSpeak's native clauses
134
+ const clauseTimeline: Timeline = []
135
+
136
+ {
137
+ const fragmentWordSequence = new TextSegmentation.WordSequence()
138
+
139
+ for (let fragment of fragments) {
140
+ fragmentWordSequence.addWord(fragment, 0, !wordCharacterRegExp.test(fragment))
141
+ }
142
+
143
+ const wordEntries = referenceTimeline.flatMap(phraseEntry => phraseEntry.timeline!)
144
+ const segmentedWords =
145
+ await TextSegmentation.segmentWordSequence(fragmentWordSequence, {
146
+ requireSpaceAfterColonsOrSemicolons: false
147
+ })
148
+
149
+ let phraseStartWordIndex = 0
150
+
151
+ for (const sentence of segmentedWords.sentences) {
152
+ for (const phrase of sentence.phrases) {
153
+ const phraseEndWordIndex = phraseStartWordIndex + phrase.words.length
154
+
155
+ const phraseEntryTimeline: Timeline = []
156
+
157
+ for (let wordIndex = phraseStartWordIndex; wordIndex < phraseEndWordIndex; wordIndex++) {
158
+ phraseEntryTimeline.push(wordEntries[wordIndex])
159
+ }
160
+
161
+ const clauseEntry: TimelineEntry = {
162
+ type: 'clause',
163
+ text: phraseEntryTimeline.map(wordEntry => wordEntry.text).join(' '),
164
+ startTime: phraseEntryTimeline[0].startTime,
165
+ endTime: phraseEntryTimeline[phraseEntryTimeline.length - 1].endTime,
166
+ timeline: phraseEntryTimeline,
167
+ }
168
+
169
+ clauseTimeline.push(clauseEntry)
170
+
171
+ phraseStartWordIndex = phraseEndWordIndex
172
+ }
173
+ }
174
+ }
175
+
121
176
  const phonemizedSentence: string[][][] = []
122
177
 
123
- let wordIndex = 0
124
- for (const phraseEntry of referenceTimeline) {
125
- const phrase: string[][] = []
178
+ {
179
+ let wordIndex = 0
126
180
 
127
- for (const wordEntry of phraseEntry.timeline!) {
128
- wordEntry.text = fragments[wordIndex]
181
+ for (const phraseEntry of clauseTimeline) {
182
+ const phrase: string[][] = []
129
183
 
130
- if (phonemizedFragmentsSubstitutions.has(wordIndex)) {
131
- phrase.push(phonemizedFragmentsSubstitutions.get(wordIndex)!)
132
- } else {
133
- for (const tokenEntry of wordEntry.timeline!) {
134
- const tokenPhonemes: string[] = []
184
+ for (const wordEntry of phraseEntry.timeline!) {
185
+ wordEntry.text = fragments[wordIndex]
186
+
187
+ if (phonemizedFragmentsSubstitutions.has(wordIndex)) {
188
+ phrase.push(phonemizedFragmentsSubstitutions.get(wordIndex)!)
189
+ } else {
190
+ for (const tokenEntry of wordEntry.timeline!) {
191
+ const tokenPhonemes: string[] = []
135
192
 
136
- for (const phoneme of tokenEntry.timeline!) {
137
- if (phoneme.text) {
138
- tokenPhonemes.push(phoneme.text)
193
+ for (const phoneme of tokenEntry.timeline!) {
194
+ if (phoneme.text) {
195
+ tokenPhonemes.push(phoneme.text)
196
+ }
139
197
  }
140
- }
141
198
 
142
- if (tokenPhonemes.length > 0) {
143
- phrase.push(tokenPhonemes)
199
+ if (tokenPhonemes.length > 0) {
200
+ phrase.push(tokenPhonemes)
201
+ }
144
202
  }
145
203
  }
204
+
205
+ wordIndex += 1
146
206
  }
147
207
 
148
- wordIndex += 1
149
- }
208
+ phraseEntry.text = phraseEntry.timeline!.map(wordEntry => wordEntry.text).join(' ')
150
209
 
151
- if (phrase.length > 0) {
152
- phonemizedSentence.push(phrase)
210
+ if (phrase.length > 0) {
211
+ phonemizedSentence.push(phrase)
212
+ }
153
213
  }
154
214
  }
155
215
 
@@ -157,15 +217,15 @@ export async function preprocessAndSynthesize(text: string, language: string, es
157
217
 
158
218
  logger.end()
159
219
 
160
- return { referenceSynthesizedAudio, referenceTimeline, fragments, preprocessedFragments, phonemizedFragmentsSubstitutions, phonemizedSentence }
220
+ return { referenceSynthesizedAudio, referenceTimeline: clauseTimeline, fragments, preprocessedFragments, phonemizedFragmentsSubstitutions, phonemizedSentence }
161
221
  }
162
222
 
163
- export async function synthesizeFragments(fragments: string[], espeakOptions: EspeakOptions) {
223
+ export async function synthesizeFragments(fragments: string[], espeakOptions: EspeakOptions, callbacks: SynthesisCallbacks) {
164
224
  espeakOptions = extendDeep(defaultEspeakOptions, espeakOptions)
165
225
 
166
226
  const voice = espeakOptions.voice
167
227
 
168
- const sampleRate = await getSampleRate()
228
+ const sampleRate = getSampleRate()
169
229
 
170
230
  if (fragments.length === 0) {
171
231
  return {
@@ -210,7 +270,7 @@ export async function synthesizeFragments(fragments: string[], espeakOptions: Es
210
270
  }
211
271
  }
212
272
 
213
- const { rawAudio, events } = await synthesize(textWithMarkers, { ...espeakOptions, ssml: true })
273
+ const { rawAudio, events } = await synthesize(textWithMarkers, { ...espeakOptions, ssml: true }, callbacks)
214
274
 
215
275
  // Add first marker if missing
216
276
  if (fragments.length > 0) {
@@ -352,7 +412,7 @@ export async function synthesizeFragments(fragments: string[], espeakOptions: Es
352
412
  continue
353
413
  }
354
414
 
355
- const wordReferencePhonemes = (await textToPhonemes(wordEntry.text, espeakOptions.voice, true)).split('_')
415
+ const wordReferencePhonemes = textToPhonemes(wordEntry.text, espeakOptions.voice, true).split('_')
356
416
 
357
417
  const wordReferenceIPA = wordReferencePhonemes.join(' ')
358
418
 
@@ -449,8 +509,8 @@ export async function synthesizeFragments(fragments: string[], espeakOptions: Es
449
509
  return { rawAudio, timeline: clauseTimeline, events }
450
510
  }
451
511
 
452
- export async function synthesize(text: string, espeakOptions: EspeakOptions) {
453
- const logger = new Logger()
512
+ export async function synthesize(text: string, espeakOptions: EspeakOptions, callbacks: SynthesisCallbacks) {
513
+ const logger = new Logger(callbacks.logLevel)
454
514
 
455
515
  espeakOptions = extendDeep(defaultEspeakOptions, espeakOptions)
456
516
 
@@ -460,7 +520,7 @@ export async function synthesize(text: string, espeakOptions: EspeakOptions) {
460
520
  text = escapeHtml(text)
461
521
  }
462
522
 
463
- const { instance } = await getEspeakInstance()
523
+ const { instance } = await getEspeakInstance(callbacks)
464
524
 
465
525
  const sampleChunks: Float32Array[] = []
466
526
  const allEvents: EspeakEvent[] = []
@@ -468,14 +528,14 @@ export async function synthesize(text: string, espeakOptions: EspeakOptions) {
468
528
  logger.start('Synthesize with eSpeak')
469
529
 
470
530
  if (espeakOptions.useKlatt) {
471
- await setVoice(`${espeakOptions.voice}+klatt6`)
531
+ setVoice(`${espeakOptions.voice}+klatt6`)
472
532
  } else {
473
- await setVoice(espeakOptions.voice)
533
+ setVoice(espeakOptions.voice)
474
534
  }
475
535
 
476
- await setRate(espeakOptions.rate)
477
- await setPitch(espeakOptions.pitch)
478
- await setPitchRange(espeakOptions.pitchRange)
536
+ setRate(espeakOptions.rate)
537
+ setPitch(espeakOptions.pitch)
538
+ setPitchRange(espeakOptions.pitchRange)
479
539
 
480
540
  instance.synthesize(text, (samples: Int16Array, events: EspeakEvent[]) => {
481
541
  if (samples && samples.length > 0) {
@@ -501,22 +561,24 @@ export async function synthesize(text: string, espeakOptions: EspeakOptions) {
501
561
  return { rawAudio, events: allEvents }
502
562
  }
503
563
 
504
- export async function textToIPA(text: string, voice: string) {
505
- await setVoice(voice)
564
+ export function textToIPA(text: string, voice: string) {
565
+ errorIfEspeakInstanceNotLoaded()
566
+
567
+ setVoice(voice)
506
568
 
507
- const { instance } = await getEspeakInstance()
508
- const ipa: string = (instance.synthesize_ipa(text).ipa as string).trim()
569
+ const ipa: string = (espeakInstance.synthesize_ipa(text).ipa as string).trim()
509
570
 
510
571
  return ipa
511
572
  }
512
573
 
513
- export async function textToPhonemes(text: string, voice: string, useIPA = true) {
514
- await setVoice(voice)
574
+ export function textToPhonemes(text: string, voice: string, useIPA = true) {
575
+ errorIfEspeakInstanceNotLoaded()
576
+
577
+ setVoice(voice)
515
578
 
516
- const { instance, module } = await getEspeakInstance()
517
- const textPtr = instance.convert_to_phonemes(text, useIPA)
579
+ const textPtr = espeakInstance.convert_to_phonemes(text, useIPA)
518
580
 
519
- const wasmHeap = wrapEmscriptenModuleHeap(module)
581
+ const wasmHeap = wrapEmscriptenModuleHeap(espeakModule)
520
582
 
521
583
  const resultRef = wasmHeap.wrapNullTerminatedUtf8String(textPtr.ptr)
522
584
  const result = resultRef.value
@@ -527,46 +589,46 @@ export async function textToPhonemes(text: string, voice: string, useIPA = true)
527
589
  }
528
590
 
529
591
  let lastVoiceId: string | undefined
530
- export async function setVoice(voiceId: string) {
531
- const { instance } = await getEspeakInstance()
592
+ export function setVoice(voiceId: string) {
593
+ errorIfEspeakInstanceNotLoaded()
532
594
 
533
595
  if (voiceId !== lastVoiceId) {
534
- instance.set_voice(voiceId)
596
+ espeakInstance.set_voice(voiceId)
535
597
 
536
598
  lastVoiceId = voiceId
537
599
  }
538
600
  }
539
601
 
540
- export async function setVolume(volume: number) {
541
- const { instance } = await getEspeakInstance()
602
+ export function setVolume(volume: number) {
603
+ errorIfEspeakInstanceNotLoaded()
542
604
 
543
- return instance.setVolume(volume)
605
+ return espeakInstance.setVolume(volume)
544
606
  }
545
607
 
546
608
  export async function setRate(rate: number) {
547
- const { instance } = await getEspeakInstance()
609
+ errorIfEspeakInstanceNotLoaded()
548
610
 
549
- return instance.set_rate(rate)
611
+ return espeakInstance.set_rate(rate)
550
612
  }
551
613
 
552
614
  export async function setPitch(pitch: number) {
553
- const { instance } = await getEspeakInstance()
615
+ errorIfEspeakInstanceNotLoaded()
554
616
 
555
- return instance.set_pitch(pitch)
617
+ return espeakInstance.set_pitch(pitch)
556
618
  }
557
619
 
558
620
  export async function setPitchRange(pitchRange: number) {
559
- const { instance } = await getEspeakInstance()
621
+ errorIfEspeakInstanceNotLoaded()
560
622
 
561
- return instance.set_range(pitchRange)
623
+ return espeakInstance.set_range(pitchRange)
562
624
  }
563
625
 
564
- export async function getSampleRate(): Promise<22050> {
626
+ export function getSampleRate(): 22050 {
565
627
  return 22050
566
628
  }
567
629
 
568
- export async function listVoices() {
569
- const { instance } = await getEspeakInstance()
630
+ export async function listVoices(callbacks: OperationCallbacks) {
631
+ const { instance } = await getEspeakInstance(callbacks)
570
632
 
571
633
  const voiceList: {
572
634
  identifier: string,
@@ -580,9 +642,19 @@ export async function listVoices() {
580
642
  return voiceList
581
643
  }
582
644
 
583
- async function getEspeakInstance() {
645
+ function errorIfEspeakInstanceNotLoaded() {
646
+ if (!espeakInstance) {
647
+ throw new Error(`Espeak instance has not been initialized.`)
648
+ }
649
+ }
650
+
651
+ async function getEspeakInstance(callbacks: OperationCallbacks) {
584
652
  if (!espeakInstance) {
585
- const { default: EspeakInitializer } = await import('@echogarden/espeak-ng-emscripten')
653
+ const packagePath = await loadPackage('espeak-ng-emscripten', callbacks)
654
+ const normalizedModulePath = resolvePath(packagePath, 'espeak-ng.js')
655
+ const modulePathAsFileUrl = pathToFileUrl(normalizedModulePath).href
656
+
657
+ const { default: EspeakInitializer } = await import(modulePathAsFileUrl)
586
658
 
587
659
  const m = await EspeakInitializer()
588
660
  espeakInstance = await (new m.eSpeakNGWorker())
@@ -592,6 +664,10 @@ async function getEspeakInstance() {
592
664
  return { instance: espeakInstance, module: espeakModule }
593
665
  }
594
666
 
667
+ export async function ensureEspeakInstanceInitialized(callbacks: OperationCallbacks) {
668
+ await getEspeakInstance(callbacks)
669
+ }
670
+
595
671
  export type EspeakEventType = 'sentence' | 'word' | 'phoneme' | 'end' | 'mark' | 'play' | 'msg_terminated' | 'list_terminated' | 'samplerate'
596
672
 
597
673
  export interface EspeakEvent {
@@ -622,8 +698,8 @@ export const defaultEspeakOptions: EspeakOptions = {
622
698
  }
623
699
 
624
700
  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)
701
+ const ipaPhonemizedSentence = phonemizeSentence(text, language).flatMap(clause => clause)
702
+ const kirshenbaumPhonemizedSentence = phonemizeSentence(text, language, undefined, false).flatMap(clause => clause)
627
703
 
628
704
  const ipaFragments = ipaPhonemizedSentence.map(word => word.join(''))
629
705
 
@@ -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) {