echogarden 0.12.2 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (334) hide show
  1. package/README.md +15 -14
  2. package/data/schemas/options.json +398 -111
  3. package/dist/alignment/DTWMfccSequenceAlignment.d.ts +1 -1
  4. package/dist/alignment/DTWMfccSequenceAlignment.js +8 -8
  5. package/dist/alignment/DTWSequenceAlignment.d.ts +1 -1
  6. package/dist/alignment/DTWSequenceAlignment.js +1 -1
  7. package/dist/alignment/DTWSequenceAlignmentWindowed.d.ts +1 -1
  8. package/dist/alignment/DTWSequenceAlignmentWindowed.js +2 -2
  9. package/dist/alignment/LevenshteinSequenceAlignment.d.ts +1 -1
  10. package/dist/alignment/LevenshteinSequenceAlignment.js +1 -1
  11. package/dist/alignment/SpeechAlignment.d.ts +9 -10
  12. package/dist/alignment/SpeechAlignment.js +136 -105
  13. package/dist/alignment/SpeechAlignment.js.map +1 -1
  14. package/dist/api/API.d.ts +13 -12
  15. package/dist/api/API.js +14 -13
  16. package/dist/api/API.js.map +1 -1
  17. package/dist/api/APIOptions.d.ts +5 -4
  18. package/dist/api/Alignment.d.ts +15 -9
  19. package/dist/api/Alignment.js +88 -74
  20. package/dist/api/Alignment.js.map +1 -1
  21. package/dist/api/Common.js +1 -1
  22. package/dist/api/Denoising.d.ts +6 -6
  23. package/dist/api/Denoising.js +23 -23
  24. package/dist/api/Denoising.js.map +1 -1
  25. package/dist/api/LanguageDetection.d.ts +19 -12
  26. package/dist/api/LanguageDetection.js +88 -38
  27. package/dist/api/LanguageDetection.js.map +1 -1
  28. package/dist/api/Recognition.d.ts +16 -6
  29. package/dist/api/Recognition.js +129 -55
  30. package/dist/api/Recognition.js.map +1 -1
  31. package/dist/api/SourceSeparation.d.ts +17 -0
  32. package/dist/api/SourceSeparation.js +61 -0
  33. package/dist/api/SourceSeparation.js.map +1 -0
  34. package/dist/api/Synthesis.d.ts +18 -18
  35. package/dist/api/Synthesis.js +191 -164
  36. package/dist/api/Synthesis.js.map +1 -1
  37. package/dist/api/Translation.d.ts +19 -8
  38. package/dist/api/Translation.js +132 -35
  39. package/dist/api/Translation.js.map +1 -1
  40. package/dist/api/Vad.d.ts +10 -5
  41. package/dist/api/Vad.js +76 -38
  42. package/dist/api/Vad.js.map +1 -1
  43. package/dist/audio/AudioBufferConversion.d.ts +1 -1
  44. package/dist/audio/AudioBufferConversion.js +4 -4
  45. package/dist/audio/AudioPlayer.d.ts +1 -1
  46. package/dist/audio/AudioPlayer.js +26 -26
  47. package/dist/audio/AudioPlayer.js.map +1 -1
  48. package/dist/audio/AudioRecorder.d.ts +1 -1
  49. package/dist/audio/AudioRecorder.js +5 -5
  50. package/dist/audio/AudioUtilities.d.ts +13 -9
  51. package/dist/audio/AudioUtilities.js +86 -24
  52. package/dist/audio/AudioUtilities.js.map +1 -1
  53. package/dist/cli/CLI.d.ts +3 -3
  54. package/dist/cli/CLI.js +271 -162
  55. package/dist/cli/CLI.js.map +1 -1
  56. package/dist/cli/CLIConfigFile.js +8 -8
  57. package/dist/cli/CLILauncher.js +6 -6
  58. package/dist/cli/CLIOptionsSchema.js +2 -2
  59. package/dist/cli/CLIParser.js +5 -5
  60. package/dist/cli/CLIStarter.js +4 -4
  61. package/dist/codecs/FFMpegTranscoder.d.ts +2 -2
  62. package/dist/codecs/FFMpegTranscoder.js +37 -37
  63. package/dist/codecs/FFMpegTranscoder.js.map +1 -1
  64. package/dist/codecs/TIMITCodec.js +5 -5
  65. package/dist/codecs/WaveCodec.d.ts +1 -1
  66. package/dist/codecs/WaveCodec.js +22 -22
  67. package/dist/denoising/RNNoise.d.ts +1 -1
  68. package/dist/denoising/RNNoise.js +9 -9
  69. package/dist/dsp/BiquadFilter.d.ts +3 -2
  70. package/dist/dsp/BiquadFilter.js +18 -11
  71. package/dist/dsp/BiquadFilter.js.map +1 -1
  72. package/dist/dsp/DecayingPeakEstimator.d.ts +16 -0
  73. package/dist/dsp/DecayingPeakEstimator.js +23 -0
  74. package/dist/dsp/DecayingPeakEstimator.js.map +1 -0
  75. package/dist/dsp/FFT.d.ts +8 -4
  76. package/dist/dsp/FFT.js +76 -30
  77. package/dist/dsp/FFT.js.map +1 -1
  78. package/dist/dsp/KWeightingFilter.d.ts +9 -0
  79. package/dist/dsp/KWeightingFilter.js +40 -0
  80. package/dist/dsp/KWeightingFilter.js.map +1 -0
  81. package/dist/dsp/LoudnessEstimator.d.ts +21 -0
  82. package/dist/dsp/LoudnessEstimator.js +47 -0
  83. package/dist/dsp/LoudnessEstimator.js.map +1 -0
  84. package/dist/dsp/MFCC.d.ts +2 -2
  85. package/dist/dsp/MFCC.js +15 -15
  86. package/dist/dsp/MelSpectogram.d.ts +1 -1
  87. package/dist/dsp/MelSpectogram.js +6 -6
  88. package/dist/dsp/Rubberband.d.ts +11 -11
  89. package/dist/dsp/Rubberband.js +27 -27
  90. package/dist/dsp/Sonic.d.ts +1 -1
  91. package/dist/dsp/Sonic.js +3 -3
  92. package/dist/dsp/SpeexResampler.d.ts +1 -1
  93. package/dist/dsp/SpeexResampler.js +2 -2
  94. package/dist/math/VectorMath.d.ts +12 -8
  95. package/dist/math/VectorMath.js +35 -32
  96. package/dist/math/VectorMath.js.map +1 -1
  97. package/dist/nlp/ChineseSegmentation.js +2 -2
  98. package/dist/nlp/CompromiseNLP.js +3 -3
  99. package/dist/nlp/EspeakPhonemizer.js +30 -30
  100. package/dist/nlp/IPA.js +20 -20
  101. package/dist/nlp/JapaneseSegmentation.js +6 -6
  102. package/dist/nlp/Lexicon.d.ts +1 -1
  103. package/dist/nlp/Lexicon.js +7 -7
  104. package/dist/nlp/Segmentation.d.ts +3 -0
  105. package/dist/nlp/Segmentation.js +21 -14
  106. package/dist/nlp/Segmentation.js.map +1 -1
  107. package/dist/nlp/TextNormalizer.js +16 -16
  108. package/dist/recognition/AmazonTranscribeSTT.d.ts +2 -2
  109. package/dist/recognition/AmazonTranscribeSTT.js +13 -14
  110. package/dist/recognition/AmazonTranscribeSTT.js.map +1 -1
  111. package/dist/recognition/AzureCognitiveServicesSTT.js +5 -6
  112. package/dist/recognition/AzureCognitiveServicesSTT.js.map +1 -1
  113. package/dist/recognition/GoogleCloudSTT.d.ts +3 -3
  114. package/dist/recognition/GoogleCloudSTT.js +18 -18
  115. package/dist/recognition/OpenAICloudSTT.d.ts +19 -0
  116. package/dist/recognition/OpenAICloudSTT.js +81 -0
  117. package/dist/recognition/OpenAICloudSTT.js.map +1 -0
  118. package/dist/recognition/SileroSTT.d.ts +2 -2
  119. package/dist/recognition/SileroSTT.js +25 -25
  120. package/dist/recognition/VoskSTT.d.ts +2 -2
  121. package/dist/recognition/VoskSTT.js +8 -8
  122. package/dist/recognition/WhisperCppSTT.d.ts +88 -0
  123. package/dist/recognition/WhisperCppSTT.js +332 -0
  124. package/dist/recognition/WhisperCppSTT.js.map +1 -0
  125. package/dist/recognition/WhisperSTT.d.ts +49 -25
  126. package/dist/recognition/WhisperSTT.js +626 -481
  127. package/dist/recognition/WhisperSTT.js.map +1 -1
  128. package/dist/server/Client.d.ts +1 -1
  129. package/dist/server/Client.js +22 -22
  130. package/dist/server/Server.js +9 -9
  131. package/dist/server/Server.js.map +1 -1
  132. package/dist/server/Worker.d.ts +22 -22
  133. package/dist/server/Worker.js +36 -36
  134. package/dist/server/Worker.js.map +1 -1
  135. package/dist/server/WorkerStarter.js +2 -2
  136. package/dist/source-separation/MDXNetSourceSeparation.d.ts +11 -0
  137. package/dist/source-separation/MDXNetSourceSeparation.js +161 -0
  138. package/dist/source-separation/MDXNetSourceSeparation.js.map +1 -0
  139. package/dist/speech-language-detection/SileroLanguageDetection.d.ts +1 -1
  140. package/dist/speech-language-detection/SileroLanguageDetection.js +7 -7
  141. package/dist/subtitles/Subtitles.d.ts +10 -0
  142. package/dist/subtitles/Subtitles.js +2 -2
  143. package/dist/subtitles/Subtitles.js.map +1 -1
  144. package/dist/synthesis/AwsPollyTTS.d.ts +1 -1
  145. package/dist/synthesis/AwsPollyTTS.js +12 -12
  146. package/dist/synthesis/AzureCognitiveServicesTTS.js +7 -7
  147. package/dist/synthesis/CoquiServerTTS.js +10 -10
  148. package/dist/synthesis/CoquiServerTTS.js.map +1 -1
  149. package/dist/synthesis/ElevenlabsTTS.d.ts +23 -0
  150. package/dist/synthesis/ElevenlabsTTS.js +103 -0
  151. package/dist/synthesis/ElevenlabsTTS.js.map +1 -0
  152. package/dist/synthesis/EspeakTTS.d.ts +6 -5
  153. package/dist/synthesis/EspeakTTS.js +81 -69
  154. package/dist/synthesis/EspeakTTS.js.map +1 -1
  155. package/dist/synthesis/FliteTTS.d.ts +3 -3
  156. package/dist/synthesis/FliteTTS.js +154 -154
  157. package/dist/synthesis/FliteTTS.js.map +1 -1
  158. package/dist/synthesis/GoogleCloudTTS.d.ts +3 -3
  159. package/dist/synthesis/GoogleCloudTTS.js +17 -17
  160. package/dist/synthesis/GoogleCloudTTS.js.map +1 -1
  161. package/dist/synthesis/GoogleTranslateTTS.d.ts +1 -1
  162. package/dist/synthesis/GoogleTranslateTTS.js +103 -103
  163. package/dist/synthesis/MicrosoftEdgeTTS.d.ts +2 -2
  164. package/dist/synthesis/MicrosoftEdgeTTS.js +74 -74
  165. package/dist/synthesis/OpenAICloudTTS.d.ts +13 -0
  166. package/dist/synthesis/OpenAICloudTTS.js +169 -0
  167. package/dist/synthesis/OpenAICloudTTS.js.map +1 -0
  168. package/dist/synthesis/SamTTS.js +3 -3
  169. package/dist/synthesis/SapiTTS.d.ts +3 -3
  170. package/dist/synthesis/SapiTTS.js +26 -26
  171. package/dist/synthesis/StreamlabsPollyTTS.d.ts +2 -2
  172. package/dist/synthesis/StreamlabsPollyTTS.js +27 -27
  173. package/dist/synthesis/SvoxPicoTTS.d.ts +2 -2
  174. package/dist/synthesis/SvoxPicoTTS.js +65 -65
  175. package/dist/synthesis/SvoxPicoTTS.js.map +1 -1
  176. package/dist/synthesis/VitsTTS.d.ts +3 -3
  177. package/dist/synthesis/VitsTTS.js +378 -378
  178. package/dist/synthesis/VitsTTS.js.map +1 -1
  179. package/dist/tests/Test.js +2 -2
  180. package/dist/utilities/Compression.d.ts +5 -0
  181. package/dist/utilities/Compression.js +29 -13
  182. package/dist/utilities/Compression.js.map +1 -1
  183. package/dist/utilities/FileDownloader.d.ts +1 -1
  184. package/dist/utilities/FileDownloader.js +16 -16
  185. package/dist/utilities/FileSystem.js +7 -7
  186. package/dist/utilities/Locale.d.ts +7 -7
  187. package/dist/utilities/Locale.js +15 -15
  188. package/dist/utilities/Logger.js +3 -3
  189. package/dist/utilities/ObjectUtilities.js +19 -19
  190. package/dist/utilities/OpenPromise.js +2 -2
  191. package/dist/utilities/OpenPromise.js.map +1 -1
  192. package/dist/utilities/PackageManager.js +31 -0
  193. package/dist/utilities/PackageManager.js.map +1 -1
  194. package/dist/utilities/PathUtilities.js +8 -8
  195. package/dist/utilities/RandomGenerator.js +2 -2
  196. package/dist/utilities/SmoothEstimator.d.ts +8 -0
  197. package/dist/utilities/SmoothEstimator.js +25 -0
  198. package/dist/utilities/SmoothEstimator.js.map +1 -0
  199. package/dist/utilities/TarballMaker.js +8 -8
  200. package/dist/utilities/Timeline.d.ts +3 -2
  201. package/dist/utilities/Timeline.js +11 -11
  202. package/dist/utilities/Timeline.js.map +1 -1
  203. package/dist/utilities/Timer.js +4 -4
  204. package/dist/utilities/Utilities.d.ts +4 -0
  205. package/dist/utilities/Utilities.js +38 -15
  206. package/dist/utilities/Utilities.js.map +1 -1
  207. package/dist/utilities/WasmMemoryManager.js +7 -7
  208. package/dist/utilities/WebReader.js +23 -23
  209. package/dist/utilities/WikipediaReader.js +2 -2
  210. package/dist/voice-activity-detection/AdaptiveGateVAD.d.ts +28 -0
  211. package/dist/voice-activity-detection/AdaptiveGateVAD.js +138 -0
  212. package/dist/voice-activity-detection/AdaptiveGateVAD.js.map +1 -0
  213. package/dist/voice-activity-detection/SileroVAD.d.ts +1 -1
  214. package/dist/voice-activity-detection/SileroVAD.js +5 -5
  215. package/dist/voice-activity-detection/SileroVAD.js.map +1 -1
  216. package/dist/voice-activity-detection/WebRtcVAD.d.ts +1 -1
  217. package/dist/voice-activity-detection/WebRtcVAD.js +4 -4
  218. package/docs/API.md +29 -11
  219. package/docs/CLI.md +31 -7
  220. package/docs/Contributing.md +38 -0
  221. package/docs/Development.md +93 -19
  222. package/docs/Engines.md +28 -16
  223. package/docs/Licenses.md +4 -1
  224. package/docs/Options.md +158 -78
  225. package/docs/Releases.md +262 -0
  226. package/docs/Server.md +7 -7
  227. package/docs/Tasklist.md +95 -76
  228. package/docs/Technical.md +4 -4
  229. package/package.json +13 -14
  230. package/src/alignment/DTWMfccSequenceAlignment.ts +9 -9
  231. package/src/alignment/DTWSequenceAlignment.ts +2 -2
  232. package/src/alignment/DTWSequenceAlignmentWindowed.ts +3 -3
  233. package/src/alignment/LevenshteinSequenceAlignment.ts +2 -2
  234. package/src/alignment/SpeechAlignment.ts +204 -119
  235. package/src/api/API.ts +14 -13
  236. package/src/api/APIOptions.ts +12 -11
  237. package/src/api/Alignment.ts +147 -90
  238. package/src/api/Common.ts +1 -1
  239. package/src/api/Denoising.ts +28 -28
  240. package/src/api/LanguageDetection.ts +135 -48
  241. package/src/api/Recognition.ts +198 -59
  242. package/src/api/SourceSeparation.ts +99 -0
  243. package/src/api/Synthesis.ts +217 -181
  244. package/src/api/Translation.ts +193 -40
  245. package/src/api/Vad.ts +110 -41
  246. package/src/audio/AudioBufferConversion.ts +4 -4
  247. package/src/audio/AudioPlayer.ts +27 -27
  248. package/src/audio/AudioRecorder.ts +5 -5
  249. package/src/audio/AudioUtilities.ts +107 -24
  250. package/src/cli/CLI.ts +313 -164
  251. package/src/cli/CLIConfigFile.ts +8 -8
  252. package/src/cli/CLILauncher.ts +6 -6
  253. package/src/cli/CLIOptionsSchema.ts +2 -2
  254. package/src/cli/CLIParser.ts +5 -5
  255. package/src/cli/CLIStarter.ts +4 -4
  256. package/src/codecs/FFMpegTranscoder.ts +38 -38
  257. package/src/codecs/TIMITCodec.ts +5 -5
  258. package/src/codecs/WaveCodec.ts +22 -22
  259. package/src/denoising/RNNoise.ts +9 -9
  260. package/src/dsp/BiquadFilter.ts +19 -11
  261. package/src/dsp/DecayingPeakEstimator.ts +35 -0
  262. package/src/dsp/FFT.ts +103 -35
  263. package/src/dsp/KWeightingFilter.ts +43 -0
  264. package/src/dsp/LoudnessEstimator.ts +74 -0
  265. package/src/dsp/MFCC.ts +15 -15
  266. package/src/dsp/MelSpectogram.ts +7 -7
  267. package/src/dsp/Rubberband.ts +38 -38
  268. package/src/dsp/Sonic.ts +4 -4
  269. package/src/dsp/SpeexResampler.ts +2 -2
  270. package/src/math/VectorMath.ts +42 -33
  271. package/src/nlp/ChineseSegmentation.ts +3 -3
  272. package/src/nlp/CompromiseNLP.ts +3 -3
  273. package/src/nlp/EspeakPhonemizer.ts +30 -30
  274. package/src/nlp/IPA.ts +20 -20
  275. package/src/nlp/JapaneseSegmentation.ts +6 -6
  276. package/src/nlp/Lexicon.ts +8 -8
  277. package/src/nlp/Segmentation.ts +23 -14
  278. package/src/nlp/TextNormalizer.ts +16 -16
  279. package/src/recognition/AmazonTranscribeSTT.ts +16 -17
  280. package/src/recognition/AzureCognitiveServicesSTT.ts +8 -6
  281. package/src/recognition/GoogleCloudSTT.ts +21 -21
  282. package/src/recognition/OpenAICloudSTT.ts +142 -0
  283. package/src/recognition/SileroSTT.ts +26 -26
  284. package/src/recognition/VoskSTT.ts +10 -10
  285. package/src/recognition/WhisperCppSTT.ts +555 -0
  286. package/src/recognition/WhisperSTT.ts +760 -507
  287. package/src/server/Client.ts +23 -23
  288. package/src/server/Server.ts +9 -9
  289. package/src/server/Worker.ts +53 -53
  290. package/src/server/WorkerStarter.ts +2 -2
  291. package/src/source-separation/MDXNetSourceSeparation.ts +228 -0
  292. package/src/speech-language-detection/SileroLanguageDetection.ts +8 -8
  293. package/src/subtitles/Subtitles.ts +3 -3
  294. package/src/synthesis/AwsPollyTTS.ts +14 -14
  295. package/src/synthesis/AzureCognitiveServicesTTS.ts +10 -10
  296. package/src/synthesis/CoquiServerTTS.ts +10 -10
  297. package/src/synthesis/ElevenlabsTTS.ts +137 -0
  298. package/src/synthesis/EspeakTTS.ts +90 -71
  299. package/src/synthesis/FliteTTS.ts +157 -157
  300. package/src/synthesis/GoogleCloudTTS.ts +19 -19
  301. package/src/synthesis/GoogleTranslateTTS.ts +104 -104
  302. package/src/synthesis/MicrosoftEdgeTTS.ts +80 -80
  303. package/src/synthesis/OpenAICloudTTS.ts +196 -0
  304. package/src/synthesis/SamTTS.ts +3 -3
  305. package/src/synthesis/SapiTTS.ts +29 -29
  306. package/src/synthesis/StreamlabsPollyTTS.ts +29 -29
  307. package/src/synthesis/SvoxPicoTTS.ts +67 -67
  308. package/src/synthesis/VitsTTS.ts +380 -380
  309. package/src/tests/Test.ts +4 -4
  310. package/src/utilities/Compression.ts +34 -13
  311. package/src/utilities/FileDownloader.ts +19 -19
  312. package/src/utilities/FileSystem.ts +7 -7
  313. package/src/utilities/Locale.ts +22 -22
  314. package/src/utilities/Logger.ts +4 -4
  315. package/src/utilities/ObjectUtilities.ts +19 -19
  316. package/src/utilities/OpenPromise.ts +2 -2
  317. package/src/utilities/PackageManager.ts +40 -0
  318. package/src/utilities/PathUtilities.ts +8 -8
  319. package/src/utilities/RandomGenerator.ts +3 -3
  320. package/src/utilities/SmoothEstimator.ts +35 -0
  321. package/src/utilities/TarballMaker.ts +9 -9
  322. package/src/utilities/Timeline.ts +15 -13
  323. package/src/utilities/Timer.ts +4 -4
  324. package/src/utilities/Utilities.ts +49 -15
  325. package/src/utilities/WasmMemoryManager.ts +7 -7
  326. package/src/utilities/WebReader.ts +23 -23
  327. package/src/utilities/WikipediaReader.ts +2 -2
  328. package/src/voice-activity-detection/AdaptiveGateVAD.ts +202 -0
  329. package/src/voice-activity-detection/SileroVAD.ts +5 -5
  330. package/src/voice-activity-detection/WebRtcVAD.ts +5 -5
  331. package/dist/synthesis/ElevenLabsTTS.d.ts +0 -8
  332. package/dist/synthesis/ElevenLabsTTS.js +0 -82
  333. package/dist/synthesis/ElevenLabsTTS.js.map +0 -1
  334. package/src/synthesis/ElevenLabsTTS.ts +0 -104
@@ -0,0 +1,196 @@
1
+ import { ensureRawAudio } from '../audio/AudioUtilities.js';
2
+ import { SynthesisVoice } from '../api/Synthesis.js';
3
+ import { Logger } from '../utilities/Logger.js';
4
+ import { extendDeep } from '../utilities/ObjectUtilities.js';
5
+
6
+ export async function synthesize(text: string, voice: string, speed: number, options: OpenAICloudTTSOptions) {
7
+ const logger = new Logger()
8
+
9
+ logger.start('Request synthesis from OpenAI Cloud API')
10
+
11
+ options = extendDeep(defaultOpenAICloudTTSOptions, options)
12
+
13
+ if (!options.apiKey) {
14
+ throw new Error(`No API key given`)
15
+ }
16
+
17
+ const { default: OpenAI } = await import('openai')
18
+
19
+ const openai = new OpenAI(options)
20
+
21
+ const result = await openai.audio.speech.create({
22
+ input: text,
23
+ model: options.model!,
24
+ voice: voice as any,
25
+ response_format: 'opus',
26
+ speed,
27
+ }, {
28
+ maxRetries: 10
29
+ })
30
+
31
+ const resultBuffer = await result.buffer()
32
+
33
+ logger.start('Decode returned audio')
34
+ const resultRawAudio = ensureRawAudio(resultBuffer)
35
+
36
+ logger.end()
37
+
38
+ return resultRawAudio
39
+ }
40
+
41
+ export interface OpenAICloudTTSOptions {
42
+ apiKey?: string
43
+ organization?: string
44
+ baseURL?: string
45
+
46
+ model?: 'tts-1' | 'tts-1-hd'
47
+
48
+ timeout?: number
49
+ maxRetries?: number
50
+ }
51
+
52
+ export const defaultOpenAICloudTTSOptions: OpenAICloudTTSOptions = {
53
+ apiKey: undefined,
54
+ organization: undefined,
55
+ baseURL: undefined,
56
+
57
+ model: 'tts-1',
58
+
59
+ timeout: undefined,
60
+ maxRetries: 10,
61
+ }
62
+
63
+ export const supportedLanguages = [
64
+ 'en',
65
+ 'zh',
66
+ 'de',
67
+ 'es',
68
+ 'ru',
69
+ 'ko',
70
+ 'fr',
71
+ 'ja',
72
+ 'pt',
73
+ 'tr',
74
+ 'pl',
75
+ 'ca',
76
+ 'nl',
77
+ 'ar',
78
+ 'sv',
79
+ 'it',
80
+ 'id',
81
+ 'hi',
82
+ 'fi',
83
+ 'vi',
84
+ 'iw',
85
+ 'uk',
86
+ 'el',
87
+ 'ms',
88
+ 'cs',
89
+ 'ro',
90
+ 'da',
91
+ 'hu',
92
+ 'ta',
93
+ 'no',
94
+ 'th',
95
+ 'ur',
96
+ 'hr',
97
+ 'bg',
98
+ 'lt',
99
+ 'la',
100
+ 'mi',
101
+ 'ml',
102
+ 'cy',
103
+ 'sk',
104
+ 'te',
105
+ 'fa',
106
+ 'lv',
107
+ 'bn',
108
+ 'sr',
109
+ 'az',
110
+ 'sl',
111
+ 'kn',
112
+ 'et',
113
+ 'mk',
114
+ 'br',
115
+ 'eu',
116
+ 'is',
117
+ 'hy',
118
+ 'ne',
119
+ 'mn',
120
+ 'bs',
121
+ 'kk',
122
+ 'sq',
123
+ 'sw',
124
+ 'gl',
125
+ 'mr',
126
+ 'pa',
127
+ 'si',
128
+ 'km',
129
+ 'sn',
130
+ 'yo',
131
+ 'so',
132
+ 'af',
133
+ 'oc',
134
+ 'ka',
135
+ 'be',
136
+ 'tg',
137
+ 'sd',
138
+ 'gu',
139
+ 'am',
140
+ 'yi',
141
+ 'lo',
142
+ 'uz',
143
+ 'fo',
144
+ 'ht',
145
+ 'ps',
146
+ 'tk',
147
+ 'nn',
148
+ 'mt',
149
+ 'sa',
150
+ 'lb',
151
+ 'my',
152
+ 'bo',
153
+ 'tl',
154
+ 'mg',
155
+ 'as',
156
+ 'tt',
157
+ 'haw',
158
+ 'ln',
159
+ 'ha',
160
+ 'ba',
161
+ 'jw',
162
+ 'su',
163
+ ]
164
+
165
+ export const voiceList: SynthesisVoice[] = [
166
+ {
167
+ name: 'alloy',
168
+ languages: ['en-US', ...supportedLanguages],
169
+ gender: 'male',
170
+ },
171
+ {
172
+ name: 'echo',
173
+ languages: ['en-US', ...supportedLanguages],
174
+ gender: 'male',
175
+ },
176
+ {
177
+ name: 'fable',
178
+ languages: ['en-GB', ...supportedLanguages],
179
+ gender: 'male',
180
+ },
181
+ {
182
+ name: 'onyx',
183
+ languages: ['en-US', ...supportedLanguages],
184
+ gender: 'male',
185
+ },
186
+ {
187
+ name: 'nova',
188
+ languages: ['en-US', ...supportedLanguages],
189
+ gender: 'female',
190
+ },
191
+ {
192
+ name: 'shimmer',
193
+ languages: ['en-US', ...supportedLanguages],
194
+ gender: 'female',
195
+ },
196
+ ]
@@ -9,17 +9,17 @@ import { Logger } from '../utilities/Logger.js'
9
9
 
10
10
  export async function synthesize(text: string, pitch = 64, speed = 72, mouth = 128, throat = 128) {
11
11
  const logger = new Logger()
12
- logger.start("Initialize sam module")
12
+ logger.start('Initialize sam module')
13
13
 
14
14
  const { default: SamJs } = await import('sam-js')
15
15
 
16
16
  const sam = new SamJs({ pitch, speed, mouth, throat })
17
17
 
18
- logger.start("Synthesize with sam")
18
+ logger.start('Synthesize with sam')
19
19
  const samples: Float32Array = sam.buf32(text) as Float32Array
20
20
 
21
21
  if (!samples) {
22
- throw new Error("Sam TTS failed")
22
+ throw new Error('Sam TTS failed')
23
23
  }
24
24
 
25
25
  const rawAudio: RawAudio = { audioChannels: [samples], sampleRate: 22050 }
@@ -1,28 +1,28 @@
1
- import { SynthesisVoice } from "../api/API.js"
2
- import { decodeToChannels } from "../audio/AudioBufferConversion.js"
3
- import { RawAudio } from "../audio/AudioUtilities.js"
4
- import { SampleFormat } from "../codecs/WaveCodec.js"
5
- import { getShortLanguageCode, lcidToIsoLanguageCode } from "../utilities/Locale.js"
6
- import { Logger } from "../utilities/Logger.js"
7
- import { Timeline, TimelineEntry } from "../utilities/Timeline.js"
8
- import { logToStderr } from "../utilities/Utilities.js"
1
+ import { SynthesisVoice } from '../api/API.js'
2
+ import { decodeToChannels } from '../audio/AudioBufferConversion.js'
3
+ import { RawAudio } from '../audio/AudioUtilities.js'
4
+ import { SampleFormat } from '../codecs/WaveCodec.js'
5
+ import { getShortLanguageCode, lcidToIsoLanguageCode } from '../utilities/Locale.js'
6
+ import { Logger } from '../utilities/Logger.js'
7
+ import { Timeline, TimelineEntry } from '../utilities/Timeline.js'
8
+ import { logToStderr } from '../utilities/Utilities.js'
9
9
 
10
10
  const log = logToStderr
11
11
 
12
12
  export function synthesize(text: string, voiceName: string, rate = 0, useSpeechPlatform = false) {
13
13
  return new Promise<{ rawAudio: RawAudio, timeline: Timeline }>(async (resolve, reject) => {
14
14
  const logger = new Logger()
15
- logger.start("Initialize winax module")
15
+ logger.start('Initialize winax module')
16
16
 
17
- const { default: WinAX } = await import("winax")
17
+ const { default: WinAX } = await import('winax')
18
18
 
19
19
  const ActiveXObject = (global as any).ActiveXObject
20
20
 
21
- logger.start("Create SAPI COM object")
22
- const sapiVoice = new ActiveXObject(useSpeechPlatform ? "Speech.SPVoice" : "SAPI.SPVoice")
21
+ logger.start('Create SAPI COM object')
22
+ const sapiVoice = new ActiveXObject(useSpeechPlatform ? 'Speech.SPVoice' : 'SAPI.SPVoice')
23
23
  sapiVoice.EventInterests = 33790
24
24
 
25
- logger.start("Get SAPI voice list and select best match")
25
+ logger.start('Get SAPI voice list and select best match')
26
26
 
27
27
  if (voiceName) {
28
28
  const voiceObjects = sapiVoice.GetVoices()
@@ -40,13 +40,13 @@ export function synthesize(text: string, voiceName: string, rate = 0, useSpeechP
40
40
  sapiVoice.Rate = rate
41
41
 
42
42
  // Create phone converter for language
43
- const sapiPhoneConverter = new ActiveXObject(useSpeechPlatform ? "Speech.SpPhoneConverter" : "SAPI.SpPhoneConverter")
43
+ const sapiPhoneConverter = new ActiveXObject(useSpeechPlatform ? 'Speech.SpPhoneConverter' : 'SAPI.SpPhoneConverter')
44
44
  const sapiLanguageCodeHex = sapiVoice.Voice.GetAttribute('Language')
45
45
  const sapiLanguageCode = parseInt(sapiLanguageCodeHex, 16)
46
46
 
47
47
  sapiPhoneConverter.LanguageId = sapiLanguageCode
48
48
 
49
- logger.start("Synthesize with SAPI")
49
+ logger.start('Synthesize with SAPI')
50
50
 
51
51
  const sampleRate = 22050
52
52
  const bytesPerSecond = sampleRate * 2
@@ -80,7 +80,7 @@ export function synthesize(text: string, voiceName: string, rate = 0, useSpeechP
80
80
  const wordText = text.substring(charPos, charPos + length)
81
81
  const startTime = streamPos / bytesPerSecond
82
82
 
83
- const wordEvent = { type: "word", text: wordText, startTime, endTime: -1, timeline: [] } as TimelineEntry
83
+ const wordEvent = { type: 'word', text: wordText, startTime, endTime: -1, timeline: [] } as TimelineEntry
84
84
  events.push(wordEvent)
85
85
 
86
86
  lastWordEvent = wordEvent
@@ -94,14 +94,14 @@ export function synthesize(text: string, voiceName: string, rate = 0, useSpeechP
94
94
 
95
95
  const phoneText = sapiPhoneConverter.IdToPhone(currentPhoneId)
96
96
 
97
- if (phoneText == "," || phoneText == "_") {
97
+ if (phoneText == ',' || phoneText == '_') {
98
98
  return
99
99
  }
100
100
 
101
101
  const startTime = streamPos / bytesPerSecond
102
102
  const endTime = startTime + (duration / 1000)
103
103
 
104
- events.push({ type: "phone", text: phoneText, startTime, endTime })
104
+ events.push({ type: 'phone', text: phoneText, startTime, endTime })
105
105
  },
106
106
 
107
107
  EndStream: (streamId: number, streamPos: number) => {
@@ -124,11 +124,11 @@ export function synthesize(text: string, voiceName: string, rate = 0, useSpeechP
124
124
  }
125
125
 
126
126
  export async function getVoiceList(useSpeechPlatform = false) {
127
- const { default: WinAX } = await import("winax")
127
+ const { default: WinAX } = await import('winax')
128
128
 
129
129
  const ActiveXObject = (global as any).ActiveXObject
130
130
 
131
- const sapiVoice = new ActiveXObject(useSpeechPlatform ? "Speech.SPVoice" : "SAPI.SPVoice")
131
+ const sapiVoice = new ActiveXObject(useSpeechPlatform ? 'Speech.SPVoice' : 'SAPI.SPVoice')
132
132
 
133
133
  const voiceObjects = sapiVoice.GetVoices()
134
134
 
@@ -137,7 +137,7 @@ export async function getVoiceList(useSpeechPlatform = false) {
137
137
  for (let i = 0; i < voiceObjects.Count; i++) {
138
138
  const voiceObject = voiceObjects.Item(i)
139
139
  const voiceName = voiceObject.GetDescription()
140
- const voiceGender = voiceObject.GetAttribute("Gender")?.toLowerCase()
140
+ const voiceGender = voiceObject.GetAttribute('Gender')?.toLowerCase()
141
141
 
142
142
  const sapiLanguageCodeHex = voiceObject.GetAttribute('Language')
143
143
  const sapiLanguageCode = parseInt(sapiLanguageCodeHex, 16)
@@ -164,7 +164,7 @@ export async function getVoiceList(useSpeechPlatform = false) {
164
164
  voices.push({
165
165
  name: voiceName,
166
166
  languages: resultLanguageCodes,
167
- gender: voiceGender || "unknown"
167
+ gender: voiceGender || 'unknown'
168
168
  })
169
169
  }
170
170
 
@@ -174,12 +174,12 @@ export async function getVoiceList(useSpeechPlatform = false) {
174
174
  }
175
175
 
176
176
  export async function AssertSAPIAvailable(testForSpeechPlatform = false) {
177
- if (process.platform != "win32") {
177
+ if (process.platform != 'win32') {
178
178
  throw new Error(`SAPI is not available on your platform. SAPI is a Microsoft Windows technology that is only runs on a Windows OS.`)
179
179
  }
180
180
 
181
181
  try {
182
- const { default: WinAX } = await import("winax")
182
+ const { default: WinAX } = await import('winax')
183
183
  } catch (e) {
184
184
  throw new Error(`winax package, which is required for SAPI support, was not found. You can install it by running 'npm install winax -g'.`)
185
185
  }
@@ -187,13 +187,13 @@ export async function AssertSAPIAvailable(testForSpeechPlatform = false) {
187
187
  const ActiveXObject = (global as any).ActiveXObject
188
188
 
189
189
  try {
190
- const voice = new ActiveXObject("SAPI.SPVoice")
190
+ const voice = new ActiveXObject('SAPI.SPVoice')
191
191
  } catch (e) {
192
192
  throw new Error(`Failed creating a SAPI instance: ${e}`)
193
193
  }
194
194
 
195
195
  try {
196
- const voice = new ActiveXObject("Speech.SPVoice")
196
+ const voice = new ActiveXObject('Speech.SPVoice')
197
197
  } catch(e) {
198
198
  throw new Error(`Failed creating an msspeech instance. Please ensure you installed the Microsoft Speech Platform runtime correctly.`)
199
199
  }
@@ -203,11 +203,11 @@ function eventsToTimeline(events: Timeline, totalDuration: number): Timeline {
203
203
  const timeline: Timeline = []
204
204
 
205
205
  for (const event of events) {
206
- if (event.type == "word") {
206
+ if (event.type == 'word') {
207
207
  timeline.push(event)
208
- } else if (event.type == "phone") {
208
+ } else if (event.type == 'phone') {
209
209
  if (timeline.length == 0) {
210
- throw new Error("Unexpected: phone event preceded a word event")
210
+ throw new Error('Unexpected: phone event preceded a word event')
211
211
  }
212
212
 
213
213
  const lastWordEntry = timeline[timeline.length - 1]
@@ -1,11 +1,11 @@
1
- import { request } from "gaxios"
2
- import { SynthesisVoice } from "../api/API.js"
3
- import { trimAudioEnd } from "../audio/AudioUtilities.js"
4
- import * as FFMpegTranscoder from "../codecs/FFMpegTranscoder.js"
5
- import { Phrase, splitToFragments } from "../nlp/Segmentation.js"
6
- import { Logger } from "../utilities/Logger.js"
7
- import { concatFloat32Arrays, logToStderr } from "../utilities/Utilities.js"
8
- import { Timeline } from "../utilities/Timeline.js"
1
+ import { request } from 'gaxios'
2
+ import { SynthesisVoice } from '../api/API.js'
3
+ import { trimAudioEnd } from '../audio/AudioUtilities.js'
4
+ import * as FFMpegTranscoder from '../codecs/FFMpegTranscoder.js'
5
+ import { Phrase, splitToFragments } from '../nlp/Segmentation.js'
6
+ import { Logger } from '../utilities/Logger.js'
7
+ import { concatFloat32Arrays, logToStderr } from '../utilities/Utilities.js'
8
+ import { Timeline } from '../utilities/Timeline.js'
9
9
 
10
10
  const log = logToStderr
11
11
 
@@ -13,11 +13,11 @@ const maxTextLengthPerRequest = 200
13
13
 
14
14
  export async function synthesizeLongText(text: string, voice: string, languageCode: string, sentenceEndPause = 0.75, segmentEndPause = 1.0) {
15
15
  if (text.length == 0) {
16
- throw new Error("Text is empty")
16
+ throw new Error('Text is empty')
17
17
  }
18
18
 
19
19
  const logger = new Logger()
20
- logger.start("Prepare and split text")
20
+ logger.start('Prepare and split text')
21
21
 
22
22
  const fragments = await splitToFragments(text, maxTextLengthPerRequest, languageCode)
23
23
 
@@ -57,7 +57,7 @@ export async function synthesizeLongText(text: string, voice: string, languageCo
57
57
  const endTime = startTime + (trimmedAudio.length / fragmentsSampleRate)
58
58
 
59
59
  timeline.push({
60
- type: "segment",
60
+ type: 'segment',
61
61
  text: fragment.text,
62
62
  startTime,
63
63
  endTime
@@ -78,37 +78,37 @@ export async function synthesizeFragment(text: string, voice: string) {
78
78
  const response = await request<any>({
79
79
  url: `https://streamlabs.com/polly/speak`,
80
80
 
81
- method: "POST",
81
+ method: 'POST',
82
82
 
83
83
  data: {
84
84
  voice,
85
85
  text,
86
86
  },
87
87
 
88
- responseType: "json"
88
+ responseType: 'json'
89
89
  })
90
90
 
91
91
  const responseObject = response.data
92
92
  const audioUrl = responseObject.speak_url
93
- const audioUrlResponse = await request<ArrayBuffer>({ url: audioUrl, responseType: "arraybuffer" })
93
+ const audioUrlResponse = await request<ArrayBuffer>({ url: audioUrl, responseType: 'arraybuffer' })
94
94
 
95
95
  return Buffer.from(audioUrlResponse.data)
96
96
  }
97
97
 
98
98
  export const voiceList: SynthesisVoice[] = [
99
- { name: "Brian", languages: ["en-GB", "en"], gender: "male" },
100
- { name: "Emma", languages: ["en-GB", "en"], gender: "female" },
101
- { name: "Russell", languages: ["en-AU", "en"], gender: "male" },
102
- { name: "Joey", languages: ["en-US", "en"], gender: "male" },
103
- { name: "Matthew", languages: ["en-US", "en"], gender: "male" },
104
- { name: "Joanna", languages: ["en-US", "en"], gender: "female" },
105
- { name: "Kimberly", languages: ["en-US", "en"], gender: "female" },
106
- { name: "Amy", languages: ["en-GB", "en"], gender: "female" },
107
- { name: "Geraint", languages: ["en-GB-WLS", "en-GB", "en"], gender: "male" },
108
- { name: "Nicole", languages: ["en-AU", "en"], gender: "female" },
109
- { name: "Justin", languages: ["en-US", "en"], gender: "male" },
110
- { name: "Ivy", languages: ["en-US", "en"], gender: "female" },
111
- { name: "Kendra", languages: ["en-US", "en"], gender: "female" },
112
- { name: "Salli", languages: ["en-US", "en"], gender: "female" },
113
- { name: "Raveena", languages: ["en-IN", "en"], gender: "female" },
99
+ { name: 'Brian', languages: ['en-GB', 'en'], gender: 'male' },
100
+ { name: 'Emma', languages: ['en-GB', 'en'], gender: 'female' },
101
+ { name: 'Russell', languages: ['en-AU', 'en'], gender: 'male' },
102
+ { name: 'Joey', languages: ['en-US', 'en'], gender: 'male' },
103
+ { name: 'Matthew', languages: ['en-US', 'en'], gender: 'male' },
104
+ { name: 'Joanna', languages: ['en-US', 'en'], gender: 'female' },
105
+ { name: 'Kimberly', languages: ['en-US', 'en'], gender: 'female' },
106
+ { name: 'Amy', languages: ['en-GB', 'en'], gender: 'female' },
107
+ { name: 'Geraint', languages: ['en-GB-WLS', 'en-GB', 'en'], gender: 'male' },
108
+ { name: 'Nicole', languages: ['en-AU', 'en'], gender: 'female' },
109
+ { name: 'Justin', languages: ['en-US', 'en'], gender: 'male' },
110
+ { name: 'Ivy', languages: ['en-US', 'en'], gender: 'female' },
111
+ { name: 'Kendra', languages: ['en-US', 'en'], gender: 'female' },
112
+ { name: 'Salli', languages: ['en-US', 'en'], gender: 'female' },
113
+ { name: 'Raveena', languages: ['en-IN', 'en'], gender: 'female' },
114
114
  ]